Giả sử có điểm A với 300 điểm và lớp B điểm với một điểm
Làm cách nào để tạo một lớp đường nối tất cả các điểm trong lớp A với một điểm trong lớp B?
Sử dụng QGIS và / hoặc PostGIS.
Giả sử có điểm A với 300 điểm và lớp B điểm với một điểm
Làm cách nào để tạo một lớp đường nối tất cả các điểm trong lớp A với một điểm trong lớp B?
Sử dụng QGIS và / hoặc PostGIS.
Câu trả lời:
Trong QGIS, bạn có thể sử dụng điểm Connect plugin mà bạn có thể tải về từ:
Plugins > Manage and Install Plugins...
Thí dụ:
Dưới đây là một vài lớp, layer_A
có một loạt các điểm; layer_B
có một. Đảm bảo rằng cả hai lớp đều chứa trường số nguyên trong đó các giá trị hoàn toàn giống nhau (ví dụ: cả hai lớp của tôi đều có id
trường chứa tất cả các giá trị 1
). Plugin sử dụng điều này để kết nối các điểm của bạn. Khi plugin của bạn được bật, hãy chuyển đến cài đặt của nó:
Lưu ý rằng plugin này là thử nghiệm, do đó bạn sẽ cần bật Show also experimental plugins
tùy chọn (nhờ @blue_chip ):
Plugins > Manage and Install Plugins > Settings
nếu cả hai lớp của bạn đều là điểm thì truy vấn bên dưới sẽ hoạt động, chỉ cần cắm dữ liệu của riêng bạn. Tôi đã thực hiện một thử nghiệm với việc tạo các dòng từ 1 lớp với hơn 150 hàng điểm và một lớp có 1 điểm
drop table if exists line;
create table line as
select layer1.id ,st_makeline(layer1.geom,point.geom) as geom from layer1,point
Giả sử bắt đầu từ tình huống này (một lớp điểm với một tính năng và một lớp điểm với 300 tính năng):
bạn có thể chạy mã này từ Bảng điều khiển Python (sau khi đã tải hai lớp quan tâm trong QGIS):
from qgis.core import *
from qgis.PyQt.QtCore import QVariant
layer1 = QgsMapLayerRegistry.instance().mapLayersByName('1point')[0]
crs = layer1.crs().toWkt()
layer2 = QgsMapLayerRegistry.instance().mapLayersByName('300points')[0]
outLayer = QgsVectorLayer('Linestring?crs='+ crs, 'line_output' , 'memory')
prov = outLayer.dataProvider()
fields = layer1.pendingFields()
for field in layer2.pendingFields():
fields.append(field)
prov.addAttributes(fields)
outLayer.updateFields()
for feature in layer1.getFeatures():
coords = feature.geometry().asPoint()
attr1 = feature.attributes()
for feat in layer2.getFeatures():
seg_start = coords
seg_end = feat.geometry().asPoint()
attr2 = feat.attributes()
attrs = attr1 + attr2
outGeom = QgsFeature()
outGeom.setGeometry(QgsGeometry.fromPolyline([seg_start, seg_end]))
outGeom.setAttributes(attrs)
prov.addFeatures([outGeom])
QgsMapLayerRegistry.instance().addMapLayer(outLayer)
để có được kết quả này:
Bạn chỉ cần điều chỉnh tên của các lớp ( '1point'
và '300points'
) thành tên mà chúng được tải trong Bảng điều khiển Lớp .
Cách tiếp cận của tôi sẽ hoạt động độc lập với số lượng tính năng trong cả hai lớp.