선 객체 주위에 지정된 공차 또는 버퍼를 사용하여 여러 점을 선 또는 레이어 내의 선에 정렬하고 싶습니다. 첨부 된 샘플 스케치를 참조하십시오.
이 예제를 위해 BEFORE 그림에서 선에 가장 가까운 점은 선의 5 개 맵 단위 내에 있고 가장 바깥 쪽 점은 10 개가 넘는 맵 단위입니다. AFTER 사진의 결과를 얻기 위해 5 개의지도 단위의 공차를 사용하여 가장 가까운 선에 가장 가까운 점을 스냅하고 싶습니다.
선 객체 주위에 지정된 공차 또는 버퍼를 사용하여 여러 점을 선 또는 레이어 내의 선에 정렬하고 싶습니다. 첨부 된 샘플 스케치를 참조하십시오.
이 예제를 위해 BEFORE 그림에서 선에 가장 가까운 점은 선의 5 개 맵 단위 내에 있고 가장 바깥 쪽 점은 10 개가 넘는 맵 단위입니다. AFTER 사진의 결과를 얻기 위해 5 개의지도 단위의 공차를 사용하여 가장 가까운 선에 가장 가까운 점을 스냅하고 싶습니다.
답변:
(출시되지 않은) QGIS 3.0 버전에는이를위한 도구가 내장되어 있습니다. QGIS 웹 사이트에서 야간 스냅 샷을 가져와 미리 테스트 할 수 있습니다.
이것을하기 위해:
다음은 원래 점을 "x"로, 스냅 된 점을 녹색 점으로 표시하는 결과입니다. 여기에서는 일부 입력 포인트 만 스냅되도록 공차를 사용했습니다.
이것은 PyQGIS 와 함께 제공 될 수 있습니다 . 다음 상황의 경우 :
QGIS의 Python 콘솔에서 5 개의지도 단위 허용 오차를 고려한 다음 코드가 실행되었습니다.
from math import sqrt
registry = QgsMapLayerRegistry.instance()
points = registry.mapLayersByName('points')
line = registry.mapLayersByName('line')
feat_points = [ feat for feat in points[0].getFeatures() ]
feat_line = line[0].getFeatures().next()
new_points = []
for feat in feat_points:
pt = feat.geometry().asPoint()
sqrdist, point, vertex = feat_line.geometry().closestSegmentWithContext(pt)
if sqrt(sqrdist) <= 5:
new_points.append(point)
else:
new_points.append(pt)
epsg = points[0].crs().postgisSrid()
uri = "Point?crs=epsg:" + str(epsg) + "&field=id:integer""&index=yes"
mem_layer = QgsVectorLayer(uri,
'new_points',
'memory')
prov = mem_layer.dataProvider()
feats = [ QgsFeature() for i in range(len(new_points)) ]
for i, feat in enumerate(feats):
feat.setAttributes([i])
feat.setGeometry(QgsGeometry.fromPoint(new_points[i]))
prov.addFeatures(feats)
QgsMapLayerRegistry.instance().addMapLayer(mem_layer)
이전에 고려 된 5 개의지도 단위의 공차와 선에 대한 수직 경로에 따라 점이 스냅되는 메모리 레이어가 생성되었습니다.
refFunctions 플러그인을 사용하여 필드 계산기에서이를 수행 할 수도 있습니다. 필드 계산기를 사용하여 레이어 지오메트리 및 필드를 업데이트 할 수 있습니다. refFunctions는 주어진 거리 내에서 가장 가까운 선 (또는 임계 값을 원하지 않는 경우 "geomnearest")을 찾을 수있는 "geomdistance"함수를 제공하고 속성 또는 지오메트리를 반환하며 "closest_point"함수는 가장 가까운 것을 찾습니다 주어진 지오메트리를 가리 킵니다. 포인트 레이어의 새 형상을 계산하려면 다음과 같이 함께 묶으십시오.
closest_point(geom_from_wkt(geomdistance('snap_lines','$geometry',10)) , $geometry)
지오메트리를 직접 업데이트하는 대신 스냅 된 지오메트리로 필드를 계산할 수 있습니다. 암거 지점을 다른 스트림 레이어에 스냅하기위한 여러 형상을 저장하고 사용해야하는 스트림 라인에 따라 필드 계산기에서 포인트 형상을 쉽게 업데이트 할 수 있습니다.
여기에는 몇 가지 제한 사항이 있습니다. 두 레이어 모두 동일한 CRS 여야하며 geomdistance 함수는 포인트가 10 만개 이상인 경우 오류를 표시하지만 refFunctions 플러그인 파일을 편집하면이 제한을 변경할 수 있습니다.