다각형 레이어에서 속성을 선택하고 필드 계산기에서 "내부"를 사용하여 포인트 레이어의 가상 필드에 값을 삽입하는 방법이 있습니까?
CASE
WHEN within($geometry, geometry_polygon) THEN attribute_polygon
END
다각형 레이어에서 속성을 선택하고 필드 계산기에서 "내부"를 사용하여 포인트 레이어의 가상 필드에 값을 삽입하는 방법이 있습니까?
CASE
WHEN within($geometry, geometry_polygon) THEN attribute_polygon
END
답변:
기본적으로 필드 계산기는 피처 레이어에서 공간 결합을 지원하지 않습니다. 그러나 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'열을 사용할 수 있지만 필드 계산기 설정에서 열 유형과 일치해야합니다.
공간 조인이없고 다른 열이 올바른 데이터와 일치하는 경우 기본 열 값이 적용되었음을 알 수 있습니다. 내가 제공 한 스크립트는 첫 번째 경기 에서만 참여합니다 . 다각형이 겹치는 경우 다른 비즈니스 로직을 만들어야합니다.
기능을 사용 하여 필드 계산기 에서 수행 할 수 있습니다 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 문서 집계를 확인하십시오 .
자동 업데이트에 사용할 수있는 가상 필드를 또는 당신은 식을 설정할 수 있습니다 기본 값 의 속성이 양식 의 설정 레이어 속성 ( 속성 형태로 설정 설명서를 ).
geometry(@parent)
)는 QGIS 3 이후부터 만 지원됩니다. 이 글을 읽는 사람이 여전히 2.18을 사용하고있는 경우를 대비하여 ...