Pembuatan otomatis garis tegak lurus antara lapisan titik dan lapisan garis


10

Saya menggunakan QGIS dan saya sedang mencari skrip, atau plugin, yang dapat membuat sejumlah besar garis tegak lurus dari lapisan titik ke garis dalam lapisan garis terpisah.

Sejauh ini, saya sudah mencoba menggunakan fungsi Hub Distance di MMQGIS (mengubah garis menjadi titik dan kemudian menghubungkan titik ke hub terdekat) dan alat masing-masing dari geoalgoritma QGIS. Tidak ada yang berhasil. Keduanya membutuhkan waktu lebih dari 2 jam dan membuat garis semua lapisan atau garis yang tidak tegak lurus atau terhubung ke titik.

Dalam gambar, Anda dapat melihat status proyek saat ini. Garis tegak lurus harus berjalan dari titik ke garis terdekat. Pada akhirnya, saya ingin menggunakan titik persimpangan dengan garis antara titik-titik dan batas negara untuk membuat penyangga 4-sisi poligon yang dalamnya dua poligon. Saya menyebutkan ini jika ada cara yang lebih mudah untuk melakukan ini. masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Saya tahu bahwa ada beberapa posting tentang cara membuat garis tegak lurus, tetapi tidak ada yang menyelesaikan masalah saya.


1
@ Germán Carrillo Pertanyaan ini bukan duplikat persis dari pertanyaan yang ada "Menggambar garis tegak lurus di PyQGIS?" ( gis.stackexchange.com/questions/59169/… ) karena jawabannya tidak menggunakan metode 'proximitySegmentWithContext' dalam satu lingkaran untuk menjelajahi setiap interaksi antara titik dan garis fitur untuk mengambil jarak minimum untuk membuat lapisan memori garis. Tidak mungkin karena jawaban ini hanya menggunakan poin. Tolong, tinjau lagi.
xunilk

1
Saya masih menemukan jawaban yang lain sebagai dasar yang baik untuk menyelesaikan pertanyaan ini. OP seharusnya menyebutkan dalam pertanyaan awal bahwa dia tahu tentang posting terkait DAN memberi tahu kami mengapa mereka tidak bekerja untuknya. Meskipun demikian, jawaban yang bagus, terima kasih untuk posting!
Germán Carrillo

Jawaban:


7

Script berikutnya otomatis membuat garis tegak lurus antara lapisan titik dan lapisan garis. Segmen tegak lurus (fitur lapisan memori) dibuat dijalankan dari titik ke fitur terdekat dari lapisan garis.

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)

Saya mencobanya dengan situasi yang sangat mirip dengan yang disajikan dalam pertanyaan:

masukkan deskripsi gambar di sini

Setelah menjalankan kode di Konsol Python dari QGIS didapatkan:

masukkan deskripsi gambar di sini


Bekerja dengan luar biasa. Saya harus membersihkannya sedikit karena saya mendapatkan kesalahan seperti pada contoh Anda, tetapi jika tidak hanya butuh beberapa detik dan terlihat sempurna. Terima kasih banyak.
Monody

4

Berikut adalah kode yang sama dengan jawaban yang diterima yang hanya disesuaikan untuk bekerja dengan Python 3.x (atau 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)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.