Tạo các điểm dọc theo dữ liệu thuộc tính bằng cách sử dụng QGIS?


9

Tôi muốn tạo các điểm tương đương dọc theo các dòng trong QGIS, nhưng mỗi dòng của tôi có một thuộc tính là có bao nhiêu điểm trên chúng trong một cột gọi là "mảnh" và hầu hết mọi giá trị đều khác nhau.

nhập mô tả hình ảnh ở đây

Suy nghĩ đầu tiên của tôi là chia các dòng thành các phần bằng nhau theo các giá trị trong bảng thuộc tính và sau đó đặt các điểm vào tâm của các dòng nhưng tôi không thể làm được.

Câu hỏi này rất giống với những gì tôi muốn làm, nhưng nó không dành cho QGIS:

Làm thế nào để tạo ra cùng một số điểm dọc theo nhiều polylines?

Hầu hết các câu hỏi tương tự có thể tìm thấy ở đây tại stackexchange trong chủ đề này là về khoảng cách cụ thể giữa các điểm, một số có thể dễ dàng nhập vào một trường (như trong trường hợp Tạo điểm dọc theo đường hoặc chuyển đổi đường thành thuật toán điểm ) về dữ liệu cụ thể từ bảng thuộc tính mà tôi không thể tìm thấy cách sử dụng cho các mục đích đó.

Thật tuyệt vời nếu không có điểm ngay tại điểm bắt đầu và điểm cuối của dòng nhưng tôi sẽ chỉ ở trên mặt trăng nếu có nhiều điểm trên một dòng như trong bảng thuộc tính của nó.

Câu trả lời:


10

Đây là một kịch bản PyQGIS nhanh chóng để thực hiện thủ thuật

from qgis.core import QgsFeature, QgsVectorFileWriter, QgsGeometry

def create_points(feat,writer):
    geometry = feat.constGeometry()
    if not geometry:
        return
    length = geometry.length()
    # -----------------
    # change 'num_points' to match your field name for the number of points field
    # -----------------
    num_points = feat['num_points']
    delta = length / ( num_points + 1.0 )
    distance = 0.0
    for i in range(num_points):
        distance += delta
        output_feature = QgsFeature(feat)
        output_feature.setGeometry( geometry.interpolate(distance) )
        writer.addFeature(output_feature)

layer = iface.activeLayer()

# ---------------
# change 'd:/test_points.shp' to desired output file name
# ---------------

writer = QgsVectorFileWriter('d:/test_points.shp',None, layer.fields(), QGis.WKBPoint, layer.crs())

for f in layer.getFeatures():
    create_points(f,writer)

del writer

Chỉ cần thay đổi num_pointstên trường và tên tệp đầu ra để khớp với dữ liệu của bạn, chọn lớp đầu vào và chạy nó trong bảng điều khiển python.


Vì một số lý do, sau khi sao chép tập lệnh này, một thông báo lỗi bật lên: Tệp "<input>", dòng 1 length =ometry.length () ^ IndentationError: indent indent
Skye

1
ndawson - Tôi đã chỉnh sửa định dạng để sao chép / dán vào bảng điều khiển python dễ dàng hơn nhưng hãy thoải mái quay lại nếu bạn không thích nó =). @Skye - Tôi sẽ đề nghị sao chép mã vào trình soạn thảo văn bản, thay đổi tên trường và đường dẫn đầu ra và sau đó sao chép lại mã vào bảng điều khiển python. Hy vọng không nên có lỗi thụt nữa.
Giuse

1
Cảm ơn cả hai bạn !! :) ndawson, kịch bản của bạn rất xuất sắc và @Joseph, chỉnh sửa định dạng của bạn là một sự trợ giúp tuyệt vời! Thêm vào đó, hóa ra tôi nên sử dụng dấu "/" thay vì "\" ở đường dẫn đầu ra.
Skye
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.