QGIS에서 폴리 라인을 따라 임의의 점을 작성 하시겠습니까?


11

QGIS에서 폴리 라인 셰이프 파일을 따라 임의의 점을 만들려고합니다. 기본적으로 '연구 도구'의 '무작위 점'도구와 유사하지만 다각형 대신 폴리 라인에 사용됩니다.

선 파일을 다각형 모양 파일로 변환하려고 시도했지만 일부 영역을 다각형으로 채우고 다른 영역은 긴 선 유형 다각형으로 유지합니다.

저는 QGIS를 처음 접했고 파이썬 코드에 익숙하지 않습니다.


R로 기꺼이 들어가려면 spatstat 패키지에는 선에 임의의 점을 만드는 도구가 있습니다.
Micha

코드 주셔서 감사합니다. 무작위로 시작하여 규칙적인 간격으로 선에 포인트를 배치하도록 누군가가 수정하도록 도울 수 있는지 궁금합니다. 대단히 감사하겠습니다. 파이썬에 대한 실무 지식이 없습니다.

답변:


14

이 코드는 QGIS의 최신 개발 빌드에서 작동합니다.

from qgis.utils import iface
from qgis.core import *
from PyQt4.QtCore import QVariant
import random

def createRandomPoints(count):       
    # Create a new memory layer to store the points.
    vl = QgsVectorLayer("Point", "distance nodes", "memory") 
    pr = vl.dataProvider()  
    pr.addAttributes( [ QgsField("distance", QVariant.Int) ] )
    layer = iface.mapCanvas().currentLayer()

    # For each selected object
    for feature in layer.selectedFeatures():
        geom = feature.geometry()
        length = geom.length()
        feats = []
        # Loop until we reach the needed count of points.
        for i in xrange(0,count):
            # Get the random distance along the line.
            distance = random.uniform(0, length)
            # Work out the location of the point at that distance.
            point = geom.interpolate(distance)

            # Create the new feature.
            fet = QgsFeature()
            fet.setAttributeMap( { 0 : distance } )
            fet.setGeometry(point)
            feats.append(fet)

        pr.addFeatures(feats)
        vl.updateExtents()  

    QgsMapLayerRegistry.instance().addMapLayer(vl)

나는 당신이 파이썬 코드에 익숙하지 않다고 말했지만 이것을 쉽게 실행할 수 있어야합니다. 위의 코드를 파일에 복사하고 (광산이라고 함 locate.py) ~/.qgis/pythonWindows 7 C:\Users\{your user name}\.qgis\python\또는 Windows XP에있는 경우 해당 파일을C:\Documents and Settings\{your user name}\.qgis\python\

파일이 python 폴더에 있으면 QGIS를 열고 일부 선 객체를 선택하십시오.
레이어 선택

그런 다음 Python 콘솔을 열고 다음 코드를 실행하십시오.

import locate.py 
locate.createRandomPoints(10)

파이썬 콘솔

결과는 다음과 같아야합니다

결과

다시 실행하려면 더 많은 행을 선택 locate.createRandomPoints(10)하고 Python 콘솔에서 다시 실행 하십시오.

참고 : locate.createRandomPoints (10) 여기서 10은 라인 당 생성 할 포인트 수입니다.


모든 도움을 주셔서 감사합니다! 그래도 코드를 저장할 형식이 확실하지 않습니다. py 확장자를 가진 파일로 어떻게 만들 수 있습니까? 이것들이 아주 기본적인 질문이라면 죄송합니다.
Cec.g

텍스트를 일반 텍스트 파일로 복사하고 확장자를 .py로 저장하십시오.
Nathan W

나는 그것을 시도했지만 다음과 같은 오류가 발생합니다 : ImportError : No 모듈 named locate.py
Cec.g

파일 경로는 다음과 같습니다. C : \ Users \ Cecily \ .qgis \ python
Cec.g

import locate파이썬 콘솔에서 .py 를 사용할 필요가 없었습니까?
Nathan W

3

폴리 라인을 최소로 버퍼링 한 다음 결과 폴리곤에서 샘플링을 실행할 수 있습니다. 예를 들어, 다른 제한 요소가 없으면 자체적으로 잘 작동 할 수 있습니다. 최소 인터페이 스 간격, 밀도 또는 이와 유사한 것.

더 복잡한 경우에는 훨씬 더 밀도가 높은 임의 샘플을 만든 다음 두 번째 단계에서 적절한 지점을 선택합니다. densify 도구를 사용하여 비슷한 작업을 수행 할 수 있지만 모든 점은 폴리 라인에 있습니다.

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