รับเรขาคณิตจากหลาย ๆ ตารางโดยใช้ PostGIS


13

ฉันยังใหม่กับ PostGIS, PostgreSQL และ SQL โดยทั่วไป

ฉันมีตาราง 44 ตารางในฐานข้อมูล PostGIS ของฉันและแต่ละตารางแสดงเลเยอร์ข้อมูลเวกเตอร์ที่แตกต่างกัน แต่ละไฟล์ถูกโหลดจากรูปร่างที่แยกต่างหากและแต่ละคอลัมน์จะมีคอลัมน์ที่อธิบายถึงรูปทรงเรขาคณิตสำหรับชั้นที่เรียกว่าwkb_geometry

ฉันต้องการเลือกรูปหลายเหลี่ยมที่เฉพาะเจาะจงในชั้นหนึ่งแล้วเรียกรูปทรงเรขาคณิตทั้งหมดจากชุดย่อยของชั้นที่ซ้อนทับกล่องขอบเขตของรูปหลายเหลี่ยมนั้น ฉันไม่รู้สึกจู้จี้จุกจิกเกี่ยวกับการออกคำสั่ง แต่มันจะมีประโยชน์ถ้ามันถูกจัดระเบียบโดยตารางแต่ละกลุ่มของรูปทรงเรขาคณิตมาจาก

นี่คือตัวอย่างของคำสั่ง SQL ของฉัน:

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
        );

ซึ่งส่งคืนข้อผิดพลาด:

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

วิธีที่ถูกต้องในการทำเช่นนี้คืออะไร?


1
คุณอาจพบว่า SQL Primer ของเรามีประโยชน์ เราได้ออกแบบให้ตอบคำถามเกี่ยวกับ SQL โดยเฉพาะแม้ว่ามันจะครอบคลุมการสร้าง SQL ขั้นสูงด้วยเช่นกัน postgis.us/chapter_appendix_cบทที่ 1 อาจมีประโยชน์เช่นกันเนื่องจากเป็นไพรเมอร์เชิงพื้นที่ของ PostGIS
LR1234567

+1 นั่นคือบทฟรี ซื้อหนังสือทั้งเล่มเบนจามินเป็นการลงทุนที่คุ้มค่า ถ้าคุณต้องการเรียนรู้เกี่ยวกับ PostGIS และอีกมากมาย
Nicklas Avén

คำตอบ:


8

ก่อนอื่นคุณจะได้รับข้อความแสดงข้อผิดพลาดนี้เนื่องจากคุณไม่ได้ระบุจากตารางที่คุณต้องการเลือกคอลัมน์รูปทรงเรขาคณิต (และเนื่องจากทั้งหมดมีชื่อเหมือนกัน Postgres จึงสับสน) นั่นเป็นเหตุผลที่คุณได้รับข้อความแสดงข้อผิดพลาด

การอ้างอิงคอลัมน์ "wkb_geometry" ไม่ชัดเจน

หากคุณมีชื่อคอลัมน์เดียวกันในหลาย ๆ ตารางให้เพิ่มชื่อตารางไว้ด้านหน้าชื่อคอลัมน์เสมอเช่น table1.wkb_geometry

สำหรับคำถามของคุณ: ถ้าฉันเข้าใจคุณถูกต้องคุณต้องการค้นหาวัตถุในเลเยอร์ต่าง ๆ ที่ตัดกันวัตถุเฉพาะในเลเยอร์เฉพาะหนึ่ง

เริ่มดูทีละสองโต๊ะในตอนต้นเพื่อให้ง่าย:

Table1 เป็นตารางที่มีวัตถุเฉพาะ table2 ตารางที่มีวัตถุอื่น ๆ

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

ตอนนี้ถ้าคุณต้องการเพิ่มวัตถุเพิ่มเติมจากตารางอื่น ๆ คุณต้องใช้ UNION ALL ตามที่ Sasa พูดถึงแล้ว ชื่อคอลัมน์ไม่จำเป็นต้องเหมือนกัน แต่จำนวนคอลัมน์และชนิดข้อมูล!

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

คุณอาจพบปัญหาในการเปิดคิวรีในวิวเวอร์เนื่องจากไม่มี ID ที่ไม่ซ้ำ วิธีง่ายๆในการแก้ไขปัญหานี้คือบันทึกผลลัพธ์เป็นตารางที่มีคอลัมน์ id

มีความสุข


6

ฉันไม่มี SQL ไคลเอ็นต์ที่อยู่ข้างหน้าฉันดังนั้นสิ่งนี้อาจไม่ถูกต้อง 100% แต่คุณต้องการบางสิ่งตาม:

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

และอื่น ๆ ปัญหาของคุณคือแบบสอบถาม sql ไม่ทราบว่าตารางใด (table2 / 3/4/5) ที่คุณอ้างถึงเมื่อคุณระบุ SELECT ST_AsEWKT (wkb_geometry) ดังนั้นการอ้างอิงที่ไม่ชัดเจน คุณสามารถเพิ่มคำสั่งซื้อลงในผลลัพธ์ได้เช่นกันหากคุณต้องการสั่งซื้อ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.