필드 계산기에서 다른 레이어를 참조하는 방법은 무엇입니까?


26

다각형 레이어에서 속성을 선택하고 필드 계산기에서 "내부"를 사용하여 포인트 레이어의 가상 필드에 값을 삽입하는 방법이 있습니까?

CASE
 WHEN within($geometry, geometry_polygon) THEN attribute_polygon
END

여기에 이미지 설명을 입력하십시오


1
이것을 위해 '포인트 샘플링 툴'플러그인을 사용하지 않는 이유는 무엇입니까?
Jakob

새 점을 만들거나 기존 점을 이동할 때 동적 업데이트가 필요하기 때문입니다.
Lunar Sea

기본 도구를 사용하는 것보다이 상호 작용을 스크립팅하는 것이 좋습니다.
nagytech 2016 년

불행히도 나는 스크립팅 경험이 없습니다.
Lunar Sea

@LunarSea 아래에 따라야 할 예제를 작성했지만 필요에 맞게 조정해야 할 수도 있습니다.
nagytech 2016 년

답변:


22

refFunctions 플러그인을 설치 한 후 필드 계산기에서 공간 결합을 사용할 수 있습니다.

geomwithin(targetLayer,targetField)

플러그인은 사용자 정의 스크립트를 사용하는 것보다 훨씬 간단합니다. 감사!
jpmc26

geomwithin ( 'targetLayer', 'targetField')입니다.
Raja

19

기본적으로 필드 계산기는 피처 레이어에서 공간 결합을 지원하지 않습니다. 그러나 qgis 표현식 에 대한 함수 편집기 에서 NathanW의 게시물을 살펴보면 자체 데이터 상호 작용을 스크립팅 할 수 있음을 알 수 있습니다.

다음 스크립트는 당신이 무엇을하고 있는지 표현할 수있게 해줍니다. 다각형 레이어의 모든 피처를 반복하고 공간 결합이있는 경우 지정된 열에서 테이블 형식 데이터를 참조하여 작동합니다.

from qgis.core import *
from qgis.gui import *
from qgis.utils import iface

allfeatures = None
index = QgsSpatialIndex()
indexMade = 0
refLayer = None

@qgsfunction(args="auto", group='Custom')
def spatialJoinLookup(layerName, refColumn, defaultValue, geom, feature, parent):

    if geom is None:
        return defaultValue

    # globals so we don't create the index, refLayer more than once
    global allfeatures
    global index
    global indexMade
    global refLayer

    # Get the reference layer
    if refLayer is None:
        for layer in iface.mapCanvas().layers():
            if layerName == layer.name():
                refLayer = layer
                break
    if refLayer is None:
        raise Exception("Layer [" + layerName + "] not found")

    # Create the index if not exists
    if indexMade == 0:
        index = QgsSpatialIndex()
        allAttrs = layer.pendingAllAttributesList()
        layer.select(allAttrs)
        allfeatures = {feature.id(): feature for (feature) in refLayer.getFeatures()}
        for f in allfeatures.values():
            index.insertFeature(f)
        indexMade = 1

    # Use spatail index to find intersect 
    fid = None
    ids = index.intersects(geom.boundingBox())
    for id in ids:
        fid = id
        break # Only get the first match.
    if fid is not None:
        return allfeatures[fid].attribute(refColumn)

    # Default
    return defaultValue

다각형 레이어 예

다음은 가질 수있는 다각형 레이어의 예입니다. 또한 최종 이미지에서 볼 수있는 해당 포인트 레이어를 만들었습니다.

여기에 이미지 설명을 입력하십시오

식 사용법

별도의 열을 사용하려면 다각형 데이터 셋의 열 이름과 일치하도록 두 번째 인수를 변경해야합니다. 예를 들어 'AreaNumber'열을 사용할 수 있지만 필드 계산기 설정에서 열 유형과 일치해야합니다.

여기에 이미지 설명을 입력하십시오

결과

공간 조인이없고 다른 열이 올바른 데이터와 일치하는 경우 기본 열 값이 적용되었음을 알 수 있습니다. 내가 제공 한 스크립트는 첫 번째 경기 에서만 참여합니다 . 다각형이 겹치는 경우 다른 비즈니스 로직을 만들어야합니다.

여기에 이미지 설명을 입력하십시오


감사합니다. 첫 번째 'if'문에서 'geometry'대신 'geom'을 사용하여 스크립트가 제대로 작동합니다. 이 방법으로 지오메트리를 결합하면 다각형에 여러 레이블을 만드는 데 매우 유용 할 수 있습니다.
Lunar Sea

미안, 내가 어떻게 그리웠는지 모르겠다. 성능 문제가 없기를 바랍니다. 아주 작은 레코드 하위 집합으로 만 시도했습니다.
nagytech 2016 년

QGIS에 100 개 이상의 포인트 기능 만 있으면 성능 문제가 발생합니다. 새로운 포인트 피처를 추가하는 것은 acutal 캔버스에 포인트 피처가 표시되지 않더라도 실제로 고통입니다. 그렇지 않으면 QGIS 확대시 속도가 빨라집니다. `scale $ 10000 THENpatialJoinLookupI ( 'Polygons', 'AreaName', 'None', $ geometry) END '때 CASE를 시도했지만 작동하지 않습니다. 성능을 향상시키기 위해 할 수있는 일이 있습니까?
음력 바다

@LunarSea 공간 인덱스를 사용하도록 함수를 업데이트했습니다. 합리적으로 빨라야합니다.
nagytech

당신의 도움을 주셔서 감사합니다. 공간 조인은 지금 훨씬 빠르지 만 불행히도 무언가가 제대로 작동하지 않습니다. 하나의 동일한 다각형 내의 점에 대해 다른 결과를 얻고 있습니다.
음력 바다

8

기능을 사용 하여 필드 계산기 에서 수행 할 수 있습니다 aggregate(). 포인트 레이어에서 다음과 같이 필드 계산기 표현식으로 새 필드를 만듭니다.

aggregate(
layer:= 'polygon_layer_name',
aggregate:='concatenate',
expression:=joining_field_name,
concatenator:=', ',
filter:=intersects($geometry, geometry(@parent))
)

여기서 layer다각형 층 이름 문자열처럼 기록된다 aggreagate(등 합계 또한 사용될 수있다) 집합 함수이고, expression값으로부터 필드가 취해질 것이다 concatenator문자열 결합된다 (이러한 경우에도, 세트 수 있음) 및 filter기반 기능들을 필터링되고 on expression (이 경우 레이어 지오메트리와 부모 레이어의 지오메트리가 교차 함).

자세한 정보는 QGIS 문서 집계를 확인하십시오 .

자동 업데이트에 사용할 수있는 가상 필드를 또는 당신은 식을 설정할 수 있습니다 기본 값속성이 양식 의 설정 레이어 속성 ( 속성 형태로 설정 설명서를 ).

여기에 이미지 설명을 입력하십시오


2
공간 함수 ( geometry(@parent))는 QGIS 3 이후부터 만 지원됩니다. 이 글을 읽는 사람이 여전히 2.18을 사용하고있는 경우를 대비하여 ...
she_weeds

고맙습니다. 매력처럼 작동합니다.
공간적 사고
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.