Tạo điểm ngẫu nhiên dọc theo đa tuyến trong QGIS?


11

Tôi đang cố gắng tạo các điểm ngẫu nhiên dọc theo một shapefile polyline trong QGIS. Về cơ bản, như công cụ 'điểm ngẫu nhiên' trong 'công cụ nghiên cứu' nhưng dành cho đa giác thay vì đa giác.

Tôi đã thử chuyển đổi tập tin dòng thành một shapefile đa giác, nhưng nó lấp đầy ở một số khu vực có đa giác, trong khi các khu vực khác vẫn là đa giác loại dòng dài.

Tôi khá mới với QGIS và không thực sự quen thuộc với mã Python.


Nếu bạn sẵn sàng vào R, gói spatstat có các công cụ để tạo các điểm ngẫu nhiên trên các dòng.
Micha

Cảm ơn mã. Tôi đã tự hỏi nếu ai đó có thể giúp tôi sửa đổi nó để nó đặt các điểm trên dòng tại các khoảng cách đều đặn với một khởi đầu ngẫu nhiên? Nó sẽ được đánh giá rất cao. Tôi không có kiến ​​thức làm việc về trăn.

Câu trả lời:


14

Mã này sẽ hoạt động trên bản dựng dev mới nhất của 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)

Tôi biết bạn nói rằng bạn không quen thuộc với mã Python nhưng bạn có thể chạy nó khá dễ dàng. Sao chép mã ở trên vào một tệp (tên của tôi được gọi locate.py) và đặt mã đó vào ~/.qgis/pythonnếu bạn ở trên Windows 7 sẽ ở trong C:\Users\{your user name}\.qgis\python\hoặc trên Windows XPC:\Documents and Settings\{your user name}\.qgis\python\

Khi tệp nằm trong thư mục python, hãy mở QGIS và chọn một số đối tượng dòng.
Lựa chọn lớp

Sau đó mở bàn điều khiển Python và chạy đoạn mã sau:

import locate.py 
locate.createRandomPoints(10)

Bảng điều khiển Python

Kết quả sẽ trông giống như thế này

Các kết quả

Nếu bạn muốn chạy lại nó, chỉ cần chọn thêm một số dòng và chạy lại locate.createRandomPoints(10)trong bảng điều khiển Python.

Lưu ý: location.createRandomPoints (10) 10 ở đây là số điểm cần tạo trên mỗi dòng


Cảm ơn tất cả sự giúp đỡ của bạn! Tôi không chắc chắn ở định dạng nào để lưu mã mặc dù - làm cách nào để tạo một tệp có phần mở rộng py? Xin lỗi nếu đây là những câu hỏi khá cơ bản.
Cec.g

Sao chép văn bản vào một tệp văn bản bình thường và chỉ lưu nó với .py làm phần mở rộng.
Nathan W

Tôi đã thử điều đó nhưng nó đã phát hiện ra lỗi này: ImportError: Không có mô-đun nào có tên xác định vị trí
Cec.g

Đây là đường dẫn tệp: C: \ Users \ Cecily \ .qgis \ python
Cec.g

bạn đã sử dụng import locatekhông cần .py trong bảng điều khiển Python.
Nathan W

3

Bạn có thể đệm các polylines (tối thiểu) và sau đó chạy lấy mẫu trên các đa giác kết quả. Nó có thể hoạt động tốt nếu bạn không có bất kỳ yếu tố hạn chế nào khác, ví dụ. trên khoảng cách điểm tối thiểu, mật độ hoặc somesuch.

Đối với các trường hợp phức tạp hơn, tôi sẽ tạo một mẫu ngẫu nhiên dày đặc hơn nhiều và sau đó chọn các điểm thích hợp (bất cứ điều gì có thể) trong bước thứ hai. Một cái gì đó tương tự có thể được thực hiện với công cụ tăng cường, nhưng sau đó tất cả các điểm sẽ nằm trên polylines.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.