การสร้างจุดสุ่มพร้อมโพลีนใน QGIS?


11

ฉันกำลังพยายามสร้างจุดสุ่มพร้อมไฟล์ polyline shapefile ใน QGIS โดยทั่วไปเช่นเครื่องมือ 'คะแนนสุ่ม' ใน 'เครื่องมือวิจัย' แต่สำหรับ polylines แทนที่จะเป็นรูปหลายเหลี่ยม

ฉันได้ลองแปลงไฟล์ line เป็นรูปหลายเหลี่ยม shapefile แต่มันเติมในบางพื้นที่ด้วยรูปหลายเหลี่ยมในขณะที่พื้นที่อื่นยังคงรูปหลายเหลี่ยมที่มีเส้นยาว

ฉันค่อนข้างใหม่กับ QGIS และไม่คุ้นเคยกับรหัส Python


หากคุณยินดีที่จะเข้าสู่ R แพคเกจ spatstat มีเครื่องมือในการสร้างคะแนนแบบสุ่มในบรรทัด
Micha

ขอบคุณสำหรับรหัส ฉันสงสัยว่ามีใครสามารถช่วยฉันแก้ไขหรือไม่เพื่อที่จะวางจุดบนบรรทัดในช่วงระยะห่างปกติด้วยการเริ่มต้นแบบสุ่ม? มันจะได้รับการชื่นชมอย่างมาก ฉันไม่มีความรู้เกี่ยวกับการทำงานของหลาม

คำตอบ:


14

รหัสนี้จะทำงานบน dev dev build ล่าสุดของ 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)

ฉันรู้ว่าคุณบอกว่าคุณไม่คุ้นเคยกับรหัส Python มากนัก แต่คุณน่าจะใช้งานได้ง่าย คัดลอกโค้ดข้างต้นลงในไฟล์ (เรียกว่าของฉันlocate.py) และวางไว้ในของคุณ~/.qgis/pythonหากคุณอยู่ใน Windows 7 ที่จะอยู่ในC:\Users\{your user name}\.qgis\python\หรือใน Windows XPC:\Documents and Settings\{your user name}\.qgis\python\

เมื่อไฟล์อยู่ในโฟลเดอร์หลามเปิด QGIS และเลือกวัตถุเส้นบางอย่าง
การเลือกเลเยอร์

จากนั้นเปิดคอนโซล Python และเรียกใช้รหัสต่อไปนี้:

import locate.py 
locate.createRandomPoints(10)

Python Console

ผลลัพธ์ควรมีลักษณะเช่นนี้

ผล

หากคุณต้องการเรียกใช้อีกครั้งเพียงเลือกบรรทัดเพิ่มเติมและเรียกใช้locate.createRandomPoints(10)ในคอนโซล Python อีกครั้ง

หมายเหตุ: locate.createRandomPoints (10) 10 ที่นี่คือจำนวนคะแนนที่จะสร้างต่อหนึ่งบรรทัด


ขอบคุณสำหรับความช่วยเหลือของคุณ! ฉันไม่แน่ใจว่าในรูปแบบใดที่จะบันทึกรหัส - ฉันจะทำให้เป็นไฟล์ที่มีนามสกุลเป็น py ได้อย่างไร ขออภัยหากคำถามเหล่านี้เป็นคำถามพื้นฐาน
Cec.g

คัดลอกข้อความลงในไฟล์ข้อความปกติและเพียงบันทึกด้วย. py เป็นส่วนขยาย
นาธาน W

ฉันลองแล้ว แต่เกิดข้อผิดพลาดนี้: ImportError: ไม่มีโมดูลชื่อ loc loc
Cec.g

นี่คือเส้นทางไฟล์: C: \ Users \ Cecily \ .qgis \ python
Cec.g

คุณimport locateไม่จำเป็นต้องใช้. py ในคอนโซล Python หรือไม่
Nathan W

3

คุณสามารถบัฟเฟอร์ polylines (น้อยที่สุด) จากนั้นเรียกใช้การสุ่มตัวอย่างบนรูปหลายเหลี่ยมที่เป็นผลลัพธ์ มันสามารถทำงานได้ดีด้วยตัวเองหากคุณไม่มีปัจจัย จำกัด อื่น ๆ เช่น ในระยะห่างระหว่างจุดต่ำสุดความหนาแน่นหรือจำนวนหนึ่ง

สำหรับกรณีที่ซับซ้อนมากขึ้นฉันจะสร้างตัวอย่างแบบหนาแน่นมากขึ้นแล้วเลือกจุดที่เหมาะสม (ไม่ว่าจะเป็นอะไร) ในขั้นตอนที่สอง สิ่งที่คล้ายกันสามารถทำได้ด้วยเครื่องมือ densify แต่จุดทั้งหมดจะอยู่ใน polylines

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.