Membuat lapisan garis yang menautkan banyak titik di lapisan ke satu titik di lapisan lain?

9

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.

Luffydude
sumber
coba gunakan fungsi st_makeline
ziggy
@ziggy berusaha melakukan hal itu tetapi dokumentasi tidak terlalu jelas dan tidak ada contoh dengan geometri dari tabel yang berbeda
Luffydude
ive tidak pernah menggunakan fungsi ini tapi saya akan membayangkan itu akan menjadi seperti ini: pilih t1.columns dll, t2.columns dll .. st_makeline (t1.geom, t2.geom) dari t1, t2
ziggy
@ziggy mendapatkan kesalahan sintaksis pada kurung ketika saya mencoba pilih id, geom as st_makeline (a.geom, b.geom),
Luffydude
posting seluruh permintaan Anda
ziggy

Jawaban:

4

Di QGIS, Anda dapat menggunakan plugin Connect Points yang dapat Anda unduh dari:

Plugins > Manage and Install Plugins...

Contoh:

  1. 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:

    Antarmuka


  1. Pilih opsi:

    Pengaturan


  1. Hasil:

    Hasil


Perhatikan bahwa plugin ini eksperimental sehingga Anda harus mengaktifkan Show also experimental pluginsopsi (terima kasih ke @blue_chip ):

Plugins > Manage and Install Plugins > Settings
Yusuf
sumber
2
Tidak yakin mengapa hasil edit saya dihapus tetapi jika Anda belum membacanya: wow guys, ada beberapa jawaban yang cukup beragam di sini. Satu Python, satu plugin, dan satu Postgis. Memberikan centang pada plugin karena ini adalah noob paling ramah GIS dan juga karena wajah yang tersenyum. Terima kasih semuanya!
Luffydude
@Luffydude - Suntingan Anda mungkin dihapus karena tidak menambah banyak pertanyaan Anda secara keseluruhan, tetapi Anda benar, jawaban yang sangat berbeda! :)
Joseph
1
Anda perlu mengaktifkan plugin eksperimental untuk menemukannya. Saya harus melihat sedikit lebih lama sampai saya sadar. Plugins> Pengaturan> Periksa Tampilkan juga plugins eksperimental
blue_chip
@blue_chip - Permintaan maaf, saya seharusnya menyebutkan itu. Akan mengeditnya di :)
Joseph
3

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

masukkan deskripsi gambar di sini

ziggy
sumber
3

Dengan asumsi mulai dari situasi ini (lapisan satu titik dengan satu fitur dan satu lapisan titik dengan 300 fitur):

masukkan deskripsi gambar di sini

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:

masukkan deskripsi gambar di sini

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.

mgri
sumber