태그 보관물: pyqgis

pyqgis

QGIS에서 여러 점을 선에 맞추시겠습니까? 점은 선의 5 개 맵 단위

선 객체 주위에 지정된 공차 또는 버퍼를 사용하여 여러 점을 선 또는 레이어 내의 선에 정렬하고 싶습니다. 첨부 된 샘플 스케치를 참조하십시오.

이 예제를 위해 BEFORE 그림에서 선에 가장 가까운 점은 선의 5 개 맵 단위 내에 있고 가장 바깥 쪽 점은 10 개가 넘는 맵 단위입니다. AFTER 사진의 결과를 얻기 위해 5 개의지도 단위의 공차를 사용하여 가장 가까운 선에 가장 가까운 점을 스냅하고 싶습니다.

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



답변

(출시되지 않은) QGIS 3.0 버전에는이를위한 도구가 내장되어 있습니다. QGIS 웹 사이트에서 야간 스냅 샷을 가져와 미리 테스트 할 수 있습니다.

이것을하기 위해:

  1. “Snap geometry to layer”프로세싱 알고리즘 실행
  2. 포인트 레이어를 “입력 레이어”로 선택하십시오
  3. 선 레이어를 “참조 레이어”로 선택
  4. 적절한 공차를 입력합니다 (스냅하는 동안 포인트를 이동할 최대 거리)
  5. 동작을 “가장 가까운 지점 선호”로 변경

다음은 원래 점을 “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 플러그인 파일을 편집하면이 제한을 변경할 수 있습니다.


답변