Mendapatkan geometri dari beberapa tabel menggunakan PostGIS?

13

Saya sangat baru menggunakan PostGIS, PostgreSQL, dan SQL secara umum.

Saya memiliki 44 tabel dalam database PostGIS saya, dan masing-masing mewakili lapisan data vektor yang berbeda. Masing-masing dimuat dari shapefile terpisah, dan masing-masing memiliki kolom yang menggambarkan geometri untuk lapisan itu, yang disebutwkb_geometry

Saya ingin memilih poligon tertentu pada satu lapisan, dan kemudian mengambil SEMUA geometri dari subset lapisan yang tumpang tindih dengan kotak pembatas poligon itu. Saya tidak merasa pilih-pilih tentang urutan yang keluar, tetapi akan sangat membantu jika diatur oleh tabel dari masing-masing kelompok geometri.

Berikut ini contoh pernyataan SQL saya:

SELECT
    ST_AsEWKT(wkb_geometry) /* Some of this data has z values, hence the EWKT */
FROM
    table2, table3, table4, table5
WHERE 
    wkb_geometry &&
        (
        SELECT
            wkb_geometry
        FROM
            table1
        WHERE
            ogc_fid = 25
        );

yang mengembalikan kesalahan:

column reference "wkb_geometry" is ambiguous
/* note that every table that I am selecting from has a "wkb_geometry" column */

Apa cara yang tepat untuk melakukan ini?

BenjaminGolder
sumber
1
Anda mungkin menganggap SQL Primer kami bermanfaat. Kami mendesainnya untuk menjawab pertanyaan pemula SQL terutama meskipun itu mencakup beberapa konstruksi SQL canggih juga. postgis.us/chapter_appendix_c Bab 1 mungkin berguna juga karena ini adalah primer spasial PostGIS.
LR1234567
+1. Itu adalah bab-bab gratis. Beli seluruh buku, Benjamin, ini adalah investasi yang sangat berharga. jika Anda ingin belajar tentang PostGIS dan banyak lagi.
Nicklas Avén

Jawaban:

8

pertama-tama Anda mendapatkan pesan kesalahan ini, karena Anda tidak menentukan dari tabel mana Anda ingin memilih kolom geometri (dan karena mereka semua memiliki nama yang sama, postgres semakin bingung). Itu sebabnya Anda mendapatkan pesan kesalahan

referensi kolom "wkb_geometry" tidak jelas

Jika Anda memiliki nama kolom yang sama di beberapa tabel selalu tambahkan nama tabel di depan nama kolom: mis. table1.wkb_geometry

Untuk kueri Anda: Jika saya memahami Anda dengan benar, Anda ingin menemukan objek dalam lapisan berbeda yang memotong objek tertentu dalam satu lapisan tertentu.

Mulailah melihat dua tabel sekaligus di awal untuk membuatnya sederhana:

Table1 adalah tabel dengan objek tertentu, table2 tabel dengan objek lain

SELECT
ST_AsEWKT(table2.wkb_geometry)
FROM
table1, table2
WHERE
(table2.wkb_geometry && table1.wkb_geometry)
AND
table1.ogc_fid = 25

Sekarang, jika Anda ingin menambahkan objek tambahan dari tabel lain, Anda perlu UNION ALL, seperti yang sudah disebutkan oleh Sasa. Nama kolom tidak harus sama, tetapi jumlah kolom dan tipe data!

SELECT
ST_AsEWKT(table2.wkb_geometry)
FROM
table1, table2
WHERE
(table2.wkb_geometry && table1.wkb_geometry)
AND
table1.ogc_fid = 25

UNION ALL

SELECT
ST_AsEWKT(table3.wkb_geometry)
FROM
table1, table3
WHERE
(table3.wkb_geometry && table1.wkb_geometry)
AND
table1.ogc_fid = 25

UNION ALL

etc...

Anda mungkin mendapatkan masalah, membuka kueri di penampil, karena tidak ada ID unik. Cara sederhana untuk menyelesaikan ini adalah menyimpan hasilnya sebagai tabel dengan kolom id.

Selamat bersenang-senang

Thomas
sumber
6

Saya tidak memiliki klien SQL di depan saya jadi ini mungkin tidak 100% akurat, tetapi Anda akan menginginkan sesuatu seperti:

SELECT ST_AsEWKT(wkb_geometry) FROM table2 WHERE ...
UNION ALL
SELECT ST_AsEWKT(wkb_geometry) FROM table3 WHERE ...

dan seterusnya. Masalah Anda adalah bahwa kueri sql tidak tahu tabel apa (table2 / 3/4/5) yang Anda maksud ketika Anda menentukan SELECT ST_AsEWKT (wkb_geometry), sehingga referensi yang ambigu. Anda dapat menambahkan ORDER BY ke hasil juga jika Anda ingin mereka memesan

Sasa Ivetic
sumber