값 필드로 여러 줄 병합
트리거 필드에 따라 이러한 라인을 어떻게 결합 할 수 있습니까? 조건은 다음과 같습니다. 필드는 fid 필드에서에서 1
까지 오름차순으로 정렬되어야합니다 68
. 따라서 트리거 1이있는 첫 번째 행과 값이있는 다음 행으로 시작 0
하여 첫 번째 값에서 중지하고 1
다시 시작하는 모든 행을 결합하고 싶습니다 .
편집 : 이해합니다. 하지만이 문제를 어떻게 해결할 수 있습니까? 이 라인에 가입하는 방법? 트리거는 각도를 나타냅니다. 0이면 두 세그먼트 사이의 각도가 x 도보 다 작고 1이면 각도가 x 도보 다 큽니다. 따라서 첫 번째 줄이 트리거가 아니라면 트리거 인 첫 번째 줄과 연결하고 싶습니다.
답변
이 작업을 수행 할 수있는 방법에 대한 아이디어를 제공하기 위해 새 groupid 필드를 추가하는 Python 솔루션이 있습니다.
# Change your settings here:
layername = 'line'
triggerfield = 'Trigger' # field must already exist
groupfieldname = 'mygroup' # will be added if does not exist
newlineindicator = 1
#####
# no changes needed below #
#####
layer = QgsProject.instance().mapLayersByName(layername)[0] # get the layer
layer.startEditing() # start editing the layer
layer.dataProvider().addAttributes([QgsField(groupfieldname,QVariant.Int)]) # add a group field
layer.commitChanges() # save new added field to prevent crash when searching for it later
layer.startEditing() # start editing the layer again
groupid = 0 # initialize groupid
fieldindex = layer.fields().indexFromName(groupfieldname) # get fieldindex of groupfield
for feat in layer.getFeatures(): # itereate over layer
if feat[triggerfield] == newlineindicator: # if a new trigger appears, increase groupcounter
groupid += 1
attrs = { fieldindex : groupid } # prepare attributes
layer.dataProvider().changeAttributeValues({ feat.id() : attrs }) # assign current groupid to current feature
layer.commitChanges() # save changes
결과:

필드 계산기에서 QGIS 표현식을 사용하여 필드 값을 직접 생성하여 결합하려는 모든 기능을 그룹화하는 방법이 있습니다. 이 필드의 값을 기반으로 함수 Aggregate
를 사용 하여 동일한 값으로 기능 을 결합 할 수 있습니다 (아래 두 번째 스크린 샷 참조). 봇 단계는 모델로 쉽게 자동화 할 수 있어야합니다.
데이터 구조 및 필드 이름을 사용하면 표현식은 다음과 같습니다 (표현식 작동 방식에 대한 설명은 아래 참조).
array_last (
array_sort (
array_foreach (
array_remove_all (
array_agg (
if (
"trigger" = 1,
"fid" ,
0
)
) ,
0) ,
if (
if (
"trigger" = 1,
"fid" ,
0
) = @element,
@element,
if (
"fid" > @element ,
@element,0
)
)
)
)
)

이 필드를 기능과 함께 사용하여 Menu Processing / Toolbox / Aggregate
이러한 기능을 함께 결합 할 수 있습니다 .

표현 뒤에 숨은 아이디어를 설명하기 위해 : 더 나은 이해를 위해 마지막으로 " head " 를 얻고 자하는 결합 된 선의 "starting-segment"를 호출하고 그에 결합 되는 후속 세그먼트를 " tails " 라고 합시다 .
heads 의 fid-value를 가져 와서 " group-ids " 라고합시다 . 최종 목표는 각 꼬리 세그먼트를 머리 에 할당하는 것입니다 (또는 각 꼬리 에 다음 작은 머리 의 그룹 ID 값 이 할당되어야합니다. 2와 3은 1, 5 및 6에서 4 등에 할당되어야합니다.) a) 트리거가 1 ( head )이면 id 값을 가져옵니다. 이것은 group-id 입니다. 그렇지 않으면 ( 꼬리의 경우 ) 값을 0으로 설정합니다. b) 이러한 값을 집계하여 배열을 만듭니다. c) 배열에서 모든 0 값을 제거합니다. 따라서 그룹 ID 배열 (= fid of heads ) : [1,4,7,9,12] 를 얻습니다 . 마지막으로 배열의 이러한 값 중 하나에 모든 기능을 할당하려고합니다.
이제 다음 표현식을 사용하여 배열에서 이러한 각 그룹 ID 를 사용 하여 레이어의 모든 기능을 반복 합니다
array_foreach
. a) 트리거 = 1 ( heads ) 인 기능의 경우 문제가 없습니다. 이미 올바른 그룹 ID가 있습니다 (에 해당하는 b) 다른 경우 ( tails , trigger = 0)에서는 새 값을 할당해야합니다. 따라서 배열의 각 입력 값 (모든 group-ids 목록 )을 fid와 비교하고 fid 보다 작 으면 group-id를 유지합니다 (다음 더 작은 값에 할당하려는 경우). 그렇지 않으면 0으로 설정합니다. 따라서 어떤 경우에도 배열에서 fid보다 큰 값이 생성되지 않습니다.배열을 정렬하여 값이 올바른 순서 (가장 작은 것에서 가장 큰 것)로되어 있는지 확인하여 마지막 위치에서 마지막 0을 제거합니다 (아래 스크린 샷 참조). 정렬 순서를 설정하지 않고 기본값을 얻습니다
ascending=true
.정렬 된 배열에서 마지막 값을 가져 오므 로 (2b 단계 기억) fid보다 크지 않은 마지막 (가장 큰) group-id AND (트리거 = 1 인 경우)는 fid (2a 단계)와 같고 항상 1에서 만든 배열의 숫자입니다.
1 단계와 2 단계의 중간 결과는 스크린 샷을 참조하십시오.

이제 위에서 설명한대로 생성 된 필드로 집계 함수를 쉽게 사용할 수 있습니다.