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.