PostGIS का उपयोग करके कई तालिकाओं से ज्यामिति प्राप्त करना?


13

मैं सामान्य रूप से PostGIS, PostgreSQL और SQL में बहुत नया हूं।

मेरे PostGIS डेटाबेस में 44 टेबल हैं, और हर एक वेक्टर डेटा की एक अलग परत का प्रतिनिधित्व करता है। प्रत्येक को एक अलग आकृति से लोड किया गया था, और प्रत्येक में एक स्तंभ है जो उस परत के लिए ज्यामिति का वर्णन करता है, जिसे कहा जाता है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 प्राइमर उपयोगी लग सकती है। हमने इसे मुख्य रूप से SQL नौसिखिया सवालों के जवाब देने के लिए डिज़ाइन किया है, हालांकि यह कुछ उन्नत SQL निर्माणों को भी कवर करता है। Postgis.us/chapter_appendix_c अध्याय 1 उपयोगी हो सकता है क्योंकि यह एक PostGIS स्थानिक प्राइमर है।
LR1234567

+1। वह मुक्त अध्याय है। पूरी किताब, बेंजामिन खरीदें, यह एक अच्छी तरह से निवेश के लायक है। यदि आप PostGIS और बहुत कुछ के बारे में सीखना चाहते हैं।
निकल्स एवन

जवाबों:


8

सबसे पहले आपको यह त्रुटि संदेश मिलता है, क्योंकि आपने यह निर्दिष्ट नहीं किया था कि आप किस तालिका से ज्यामिति कॉलम का चयन करना चाहते हैं (और चूंकि उन सभी का एक ही नाम है, पोस्टग्रेट्स भ्रमित हो रहे हैं)। इसलिए आपको त्रुटि संदेश मिलता है

कॉलम संदर्भ "wkb_geometry" अस्पष्ट है

यदि आपके पास एक ही स्तंभ का नाम कई तालिकाओं में है तो हमेशा स्तंभ नाम के सामने तालिका नाम जोड़ें: उदा। table1.wkb_geometry

आपकी क्वेरी के लिए: यदि मैं आपको सही समझता हूं, तो आप उन वस्तुओं को अलग-अलग परतों में ढूंढना चाहते हैं, जो एक विशिष्ट परत में किसी विशिष्ट वस्तु को काटती हैं।

इसे सरल रखने के लिए शुरुआत में एक समय में दो तालिकाओं को देखना शुरू करें:

तालिका 1 विशिष्ट वस्तु के साथ तालिका है, तालिका 2 अन्य वस्तुओं के साथ तालिका है

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

आपको कोई समस्या हो सकती है, क्वेरी को किसी दर्शक में खोलना, क्योंकि कोई विशिष्ट आईडी नहीं है। इसे हल करने का एक सरल तरीका आईडी कॉलम के साथ तालिका के रूप में परिणाम को सहेजना है।

मज़े करो


6

मेरे सामने SQL क्लाइंट नहीं है, इसलिए यह 100% सटीक नहीं हो सकता है, लेकिन आप इसकी तर्ज पर कुछ करना चाहेंगे:

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

और इसी तरह। आपकी समस्या यह है कि sql क्वेरी को पता नहीं है कि आप किस तालिका (तालिका 2/3/4/5) का चयन कर रहे हैं, जब आप SELECT ST_AsEWKT (wkb_geometry) निर्दिष्ट करते हैं, तो इस प्रकार अस्पष्ट संदर्भ। यदि आप उन्हें आदेश देना चाहते हैं तो आप परिणामों में ORDER BY भी जोड़ सकते हैं

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.