Tự động tạo các đường vuông góc giữa một lớp điểm và một lớp đường


10

Tôi đang sử dụng QGIS và tôi đang tìm kiếm một tập lệnh hoặc plugin có thể tạo ra một số lượng lớn các đường vuông góc từ một lớp điểm đến các dòng trong một lớp dòng riêng biệt.

Cho đến nay, tôi đã thử sử dụng chức năng Khoảng cách Hub trong MMQGIS (biến các đường thành điểm và sau đó kết nối các điểm với trung tâm gần nhất) và công cụ tương ứng của thuật toán địa lý QGIS. Không làm việc. Cả hai mất hơn 2 giờ và tạo một trong hai dòng tất cả các lớp hoặc các đường không vuông góc hoặc kết nối với các điểm.

Trong hình, bạn có thể thấy trạng thái hiện tại của dự án. Các đường vuông góc sẽ chạy từ các điểm đến đường gần nhất. Cuối cùng, tôi muốn sử dụng các điểm giao nhau với một đường thẳng giữa các điểm và biên giới quốc gia để tạo ra một bộ đệm của đa giác 4 ​​mặt sâu hai đa giác. Tôi đề cập đến điều này trong trường hợp có một cách dễ dàng hơn để làm điều này. nhập mô tả hình ảnh ở đây nhập mô tả hình ảnh ở đây

Tôi biết rằng có một số bài viết về cách tạo các đường vuông góc, nhưng cả hai đều không giải quyết được vấn đề của tôi.


1
@ Germán Carrillo Câu hỏi này không phải là một bản sao chính xác của câu hỏi hiện tại "Vẽ các đường vuông góc trong PyQGIS?" ( Gis.stackexchange.com/questions/59169/... ) bởi vì câu trả lời không sử dụng phương pháp 'closestSegmentWithContext' trong một vòng lặp để khám phá mỗi tương tác giữa các điểm và các tính năng dòng dành khoảng cách tối thiểu để tạo ra một lớp bộ nhớ dòng. Không thể vì câu trả lời này chỉ sử dụng điểm. Xin vui lòng, xem lại nó một lần nữa.
xunilk

1
Tôi vẫn tìm thấy câu trả lời khác một cơ sở tốt để giải quyết câu hỏi này. OP nên đã đề cập trong câu hỏi ban đầu rằng anh ấy / cô ấy đã biết về các bài đăng liên quan VÀ cho chúng tôi biết lý do tại sao họ không làm việc cho anh ấy / cô ấy. Tuy nhiên, câu trả lời tốt, cảm ơn vì đã đăng!
Germán Carrillo

Câu trả lời:


7

Kịch bản tiếp theo tự động tạo các đường vuông góc giữa một lớp điểm và một lớp đường. Các phân đoạn vuông góc (tính năng của lớp bộ nhớ) được tạo chạy từ các điểm đến tính năng gần nhất của lớp đường.

mapcanvas = iface.mapCanvas()

layers = mapcanvas.layers()

p_lyr = layers[0]
l_lyr = layers[1]

epsg = p_lyr.crs().postgisSrid()

uri = "LineString?crs=epsg:" + str(epsg) + "&field=id:integer""&field=distance:double(20,2)&index=yes"

dist = QgsVectorLayer(uri, 
                      'dist', 
                      'memory')

QgsMapLayerRegistry.instance().addMapLayer(dist)

prov = dist.dataProvider()

lines_features = [ line_feature for line_feature in l_lyr.getFeatures() ] 
points_features = [ point_feature for point_feature in p_lyr.getFeatures() ]

feats = []

for p in points_features:

    minDistPoint = min([l.geometry().closestSegmentWithContext( p.geometry().asPoint() ) for l in lines_features])[1]
    feat = QgsFeature()
    feat.setGeometry(QgsGeometry.fromPolyline([p.geometry().asPoint(), minDistPoint]))
    feat.setAttributes([points_features.index(p),feat.geometry().length()])
    feats.append(feat)

prov.addFeatures(feats)

Tôi đã thử nó với một tình huống rất giống với câu hỏi:

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

Sau khi chạy mã tại Bảng điều khiển Python của QGIS, nó đã được lấy:

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


Làm việc tuyệt vời. Tôi sẽ phải dọn dẹp nó một chút khi tôi nhận được một số lỗi sai như trong ví dụ của bạn, nhưng nếu không thì chỉ mất vài giây và trông thật hoàn hảo. Cảm ơn bạn rât nhiêu.
Monody

4

Đây là mã giống như trong câu trả lời được chấp nhận chỉ được điều chỉnh để hoạt động với Python 3.x (hoặc QGIS v3.x):

from qgis.core import QgsProject

mapcanvas = iface.mapCanvas()

layers = mapcanvas.layers()

p_lyr = layers[0]
l_lyr = layers[1]

epsg = p_lyr.crs().postgisSrid()

uri = "LineString?crs=epsg:" + str(epsg) + "&field=id:integer""&field=distance:double(20,2)&index=yes"

dist = QgsVectorLayer(uri,
                      'dist',
                      'memory')

QgsProject.instance().addMapLayer(dist)

prov = dist.dataProvider()

lines_features = [ line_feature for line_feature in l_lyr.getFeatures() ]
points_features = [ point_feature for point_feature in p_lyr.getFeatures() ]

feats = []

for p in points_features:

    minDistPoint = min([l.geometry().closestSegmentWithContext( p.geometry().asPoint() ) for l in lines_features])[1]
    feat = QgsFeature()
    feat.setGeometry(QgsGeometry.fromPolylineXY([p.geometry().asPoint(), minDistPoint]))
    feat.setAttributes([points_features.index(p),feat.geometry().length()])
    feats.append(feat)

prov.addFeatures(feats)
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.