PostGIS Union Antara Dua Tabel, Mempertahankan Atribut

8

Saya mencoba untuk menyatukan batas-batas pemerintah tingkat atas dan bawah tingkat Negara Bagian sedemikian rupa sehingga menghasilkan satu tabel PostGIS dengan kedua nama tingkat atas dan bawah untuk setiap bentuk.

Dalam contoh saya di bawah ini, Uadalah dataset dan memiliki kolom dengan baris UAdan UB. Ladalah dataset lain dan memiliki LA, LB, dan LC. Ketika saya menyatukan bentuk-bentuk bersama-sama, saya harus mendapatkan bentuk yang sama seperti Ltetapi dataset baru yang disatukan memiliki kedua kolom data.

masukkan deskripsi gambar di sini

Sunting : Contoh gambar saya di atas cukup payah. Jawaban sejauh ini terkait dengan permintaan data dengan asumsi geometri tersedia. Ini penting tetapi melewatkan bagian yang lebih membingungkan dari pertanyaan saya. Contoh yang lebih baik:

gambar

Bentuk kuning berasal dari U, bentuk oranye dari L. Perhatikan bahwa mereka tumpang tindih tetapi beberapa potongan poligon tidak terkandung sepenuhnya di dalam bentuk lain (seperti dalam contoh saya di mana LBdan LCsepenuhnya di dalam UB).

Pertanyaan yang saya coba tanyakan adalah tentang memotong dua layer dengan benar sehingga set data yang dihasilkan tidak memiliki tumpang tindih. Lihat misalnya posting milis ini yang menjadi dekat tetapi tidak berfungsi.

magneticMonster
sumber
1
Komentar samping: menyebut ini "persatuan", yang merupakan istilah ESRI untuk operasi akan membingungkan bagi orang-orang PostGIS, karena fungsi ST_Union melakukan kebalikan dari ini (yang disebut ESRI "bubar") dan melebur fitur bersama. Istilah vendor-neutral mungkin "overlay".
Paul Ramsey
Saya pikir pertanyaan saya adalah sangat mirip dengan yang satu ini yang sudah diminta dan cukup baik menjawab.
magneticMonster

Jawaban:

5

Tanpa mengetahui nama kolom Anda, ini adalah tebakan terbaik saya. (Saya belum memiliki kesempatan untuk menguji, jadi mungkin tidak tepat.) Semoga Anda dapat menyebutkan nama kolom yang saya gunakan. Dengan asumsi L adalah himpunan bagian dari U:

SELECT l.id AS l_id, u.ab AS uab, l.abc AS labc, ST_Intersection(u.geom, l.geom) AS geom
  FROM u, l
  WHERE ST_Intersects(ST_PointOnSurface(l.geom), u.geom);
Scro
sumber
2
Ini benar, lihat juga gis.stackexchange.com/a/31562/457 untuk tweak kinerja pada pendekatan ini.
Paul Ramsey
Ini sempurna sekali saya memiliki bentuk yang dihasilkan, tetapi pertama-tama saya harus membangun bentuk yang bersatu. Contoh gambar saya bukan yang terbaik dalam menunjukkan ini, tapi saya perlu memotong geometri sehingga tidak ada tumpang tindih, pertama.
magneticMonster
Saya pikir Anda tidak membaca SQL cukup dekat, itu menghasilkan bentuk baru yang hanya terdiri dari area bersama. Output dari query ini tidak memiliki fitur yang tumpang tindih.
Paul Ramsey
Anda benar sekali, Paul - saya pikir saya bermaksud mengomentari jawaban Nicklas di bawah ini.
magneticMonster
1

Jawabannya tergantung pada seberapa bersih dan konsisten data Anda. Jika Anda dapat mengasumsikan bahwa centroid dari tabel L dapat ditemukan di dalam poligon yang cocok di tabel U Anda dapat menulis sesuatu seperti:

SELECT * FROM U INNER JOIN L ON ST_Intersects(L.Centroid(geom),U.geom);

Maka Anda harus mendapatkan apa yang Anda inginkan. Jika Anda menggunakan seluruh geometri alih-alih pusat massa L, Anda akan mendapatkan banyak kecocokan aneh.

HTH

Nicklas

Nicklas Avén
sumber
Perhatikan bahwa fungsi Centroid tidak menjamin titik yang terletak di dalam poligon. ST_PointOnSurface tidak.
Scro
@ Scro Anda benar sekali. Nona dariku.
Nicklas Avén