Bergabung dengan atribut / spasial dengan SQL / gabung luar kiri di QGIS

8

Saya memiliki lapisan dengan poligon (sebut saja "hutan") yang berpotongan dengan "n" objek garis ("jalan"). Setiap jalan memiliki atribut roadid yang unik.

Saya perlu menambahkan SEMUA roadid (bukan hanya temuan QGis pertama) ke layer wood-polygons yang berpotongan untuk penggunaan terakhir. Lebih disukai semua roadid harus dalam satu kolom atribut baru dari "hutan", dibagi dengan misalnya ",".

Jika hanya ada satu jalan di setiap kayu saya bisa menggunakan alat "join attribute by position" untuk mendapatkan roadid di poligon. Atribut yang diinginkan adalah string unik sehingga tidak membantu untuk menjumlahkan / rata-rata / min / maks bidang, dan tidak ada opsi untuk mengikat mereka bersama sebagai string yang dibagi oleh ",".

Sunting: Tidak ada solusi tanpa bantuan plugin atau program eksternal sekarang (lihat komentar oleh Matthias Kuhn di bawah).

(QGIS 2.10.1-Pisa)

Papierwolf
sumber
Tolong jelaskan apa yang Anda butuhkan di akhir proses. Bidang yang berisi beberapa nilai yang dipisahkan atau hanya satu nilai? Dan jika nilai tunggal diperlukan, nilai apa yang harus dipertahankan ketika Anda memiliki beberapa kecocokan? (mis. tetap jalan terpanjang, yang lebih tumpang tindih, id terkecil, dll ...)
MarHoff
Saya membutuhkan semua nilai, pertanyaan diperbarui - terima kasih atas petunjuknya.
Papierwolf
1
Ini tipikal jenis tugas yang akan saya lakukan di dalam PostGIS menggunakan LEFT OUTER JOIN ... jika kebetulan Anda menggunakan PostGis saya dapat memberikan jawaban cepat tetapi hanya menggunakan QGIS mungkin memerlukan langkah lebih banyak lagi.
MarHoff
1
Ini adalah sesuatu yang belum mungkin dilakukan dengan QGIS. Secara umum ini dibahas di bawah istilah "fungsi agregat" dan saya yakin bahwa kita akan melihat ini dalam rilis yang tidak terlalu jauh di masa depan. Sementara itu saya akan merekomendasikan untuk menggunakan solusi database (misalnya postgres) atau mungkin ada alat dalam pengolahan yang saya tidak sadari sekarang.
Matthias Kuhn
2
Anda dapat memotong lapisan poligon dengan lapisan polyline, Dengan cara ini Anda mendapatkan poligon dan id polyline yang berpotongan. Anda dapat menulis skrip / plugin Python untuk mengumpulkan id polyline ke id poligon, tetapi itu bukan solusi terbaik dari sudut pandang relasional.
Zoltan

Jawaban:

6

Gunakan Basis Data Spasial!

Ini adalah DB spasial berbasis file yang ringan yang didukung oleh QGIS.

  1. Pertama-tama atur DB spasial mengikuti instruksi tesis ini

  2. Dorong dua tabel Anda ke DB spasial ini menggunakan manajer DB QGIS

  3. Dengan asumsi bahwa tabel Anda disebut "poligon" dan "garis" jalankan perintah SQL berikut di antarmuka permintaan manajer DB.

SELECT polygon.id,
polygon.lib, -- Place here any field releveant for you (they must also be in grouping clauses, see below)
group_concat(line.id,',') as list_id_line -- this function concatenate the id of every line that touch you polygon
FROM polygon LEFT OUTER JOIN line
ON Intersects(polygon.geom,line.geom) -- Spatial Dabatabase Rule !
GROUP BY polygon.id, polygon.lib -- theses are the grouping clauses
  1. Nikmati!

Lebih banyak penjelasan dan kesenangan dengan membaca tentang fungsi agregat SQLite di sini dan fungsi spasial di sini

MarHoff
sumber
Terima kasih MarHoff, ini terlihat menjanjikan! Saya akan melihat lebih dekat solusi Anda besok dan memberi Anda "jawaban yang diterima" yang layak dan mendukung Anda.
Papierwolf
Memang memeriksa apakah itu berfungsi sebelumnya;) Saya sebenarnya cukup kagum dengan potensi Spatialite sebagai opsi server-kurang. Karena saya mengerjakan PostGis, Anda memberi saya kesempatan yang bagus untuk mencobanya!
MarHoff
Solusi Anda berfungsi dengan baik. Sekali lagi terima kasih telah menyediakan sumber dan skripnya. Mereka benar-benar membantu pemula untuk memahami cara kerjanya. Saya akan mencoba memperbarui pertanyaan dan memberi tag lagi untuk membantu orang lain menemukan pertanyaan ini dan jawaban Anda.
Papierwolf
Sama sama! Dan saya suka judul barunya. IMHO mungkin adil juga untuk mengganti tag "ekspresi" dengan "spasial". Sampai jumpa;)
MarHoff
1
Belajar dari kesalahan saya: Ingatlah, bahwa Anda harus memeriksa "Buat Indeks Spasial" ketika mengimpor data ke SpatiaLite (atau melakukannya nanti dengan mengklik kanan tabel). SQL-Queries Anda termasuk operasi geometris akan memakan waktu lama jika Anda lupa melakukannya.
Papierwolf