Katakanlah ada titik layer A dengan 300 poin dan titik layer B dengan satu titik
Bagaimana cara membuat lapisan garis yang menghubungkan semua titik di lapisan A ke satu titik di lapisan B?
Menggunakan QGIS dan / atau PostGIS.
Katakanlah ada titik layer A dengan 300 poin dan titik layer B dengan satu titik
Bagaimana cara membuat lapisan garis yang menghubungkan semua titik di lapisan A ke satu titik di lapisan B?
Menggunakan QGIS dan / atau PostGIS.
Jawaban:
Di QGIS, Anda dapat menggunakan plugin Connect Points yang dapat Anda unduh dari:
Plugins > Manage and Install Plugins...
Contoh:
Berikut adalah beberapa lapisan, layer_Amemiliki banyak titik; layer_BPunya satu. Pastikan kedua layer berisi bidang bilangan bulat di mana nilainya persis sama (mis. Kedua layer saya memiliki idbidang di mana semua nilai berada 1). Plugin menggunakan ini untuk menghubungkan poin Anda. Saat plugin Anda diaktifkan, buka pengaturannya:
Perhatikan bahwa plugin ini eksperimental sehingga Anda harus mengaktifkan Show also experimental pluginsopsi (terima kasih ke @blue_chip ):
Plugins > Manage and Install Plugins > Settings
jika kedua layer Anda adalah poin, kueri di bawah ini seharusnya berfungsi cukup colokkan data Anda sendiri. Saya melakukan tes dengan membuat garis dari 1 layer dengan 150+ point rows dan layer dengan 1 point
drop table if exists line;
create table line as
select layer1.id ,st_makeline(layer1.geom,point.geom) as geom from layer1,point
Dengan asumsi mulai dari situasi ini (lapisan satu titik dengan satu fitur dan satu lapisan titik dengan 300 fitur):
Anda dapat menjalankan kode ini dari Konsol Python (setelah memuat dua lapisan minat pada 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)
untuk mendapatkan hasil ini:
Anda hanya perlu menyesuaikan nama untuk layer ( '1point'dan '300points') dengan nama yang memuatnya di Panel Layers .
Pendekatan saya akan bekerja secara independen dari jumlah fitur di kedua lapisan.