ST_Intersection का उपयोग कैसे करें?


15

यहां एक त्वरित सारांश है कि मैं क्या करने की कोशिश कर रहा हूं: मेरे पास पोस्टग्रेज में 3 टेबल हैं, 'ए' और 'बी', प्रत्येक में एक पॉलीगॉन कॉलम है, और 'सी' में एक प्वाइंट कॉलम है। मैं यहाँ क्या करने की कोशिश कर रहा हूँ '' ए ',' बी 'और' सी 'के बीच ज्यामितीय चौराहों को पाने के लिए, और एक ओपनलेयर वेक्टर परत पर इस तरह के ज्यामितीयों को प्रदर्शित करने के लिए।

मुझे पहले से ही पता है कि OpenLayers में एक स्ट्रिंग से किसी भी प्रकार की ज्यामिति कैसे प्रदर्शित की जाती है, लेकिन मुझे PostGIS 'ST_Intersection फ़ंक्शन के साथ परेशानी हो रही है, मैं यह कर रहा हूं:

SELECT ST_Intersection(a.geom, b.geom) as inter from a, b;

जहाँ a.geom और b.geom दोनों ज्यामिति कॉलम हैं, और मुझे यह त्रुटि संदेश मिलता है:

NOTICE:  TopologyException: found non-noded intersection between 515172 2.14408e+06, 497067 2.13373e+06 and 501321 2.13546e+06, 471202 2.14843e+06 500621 2.13576e+06 
ERROR:  GEOS Intersection() threw an error!

इसके अलावा मैंने परिणामी ज्यामिति को ST_AsText का उपयोग करके पाठ के रूप में व्यक्त करने की कोशिश की:

SELECT ST_AsText(ST_Intersection(a.geom, b.geom)) as inter from a, b;

लेकिन इसने मुझे यह त्रुटि संदेश भेजा:

HINT: No function matches the given name and argument types. You might need to add explicit type casts.

मुझे नहीं पता कि मैं क्या गलत कर रहा हूं, मैं सिर्फ पॉलीगन्स डब्ल्यूकेटी को ओपनलेयर्स पर प्रदर्शित करना चाहता हूं, यहां बताया गया है कि मैं डब्ल्यूकेटी से एक ज्यामिति कैसे प्रदर्शित करता हूं:

                    var in_options = {
                        'internalProjection': new OpenLayers.Projection("EPSG:4326"),
                        'externalProjection': new OpenLayers.Projection("EPSG:4326")
                    }; 

                    var fea= new OpenLayers.Format.WKT(in_options).read(data); //data is the string with the WKT
                    vectorLayer.addFeatures([fea]); //this piece of code works great
                    map.zoomToExtent(bounds);

अद्यतन: मैंने अगला प्रयास किया:

SELECT ST_Intersection(a.geom, b.geom) as intersect_ab FROM a INNER JOIN b ON 
ST_Intersection(a,b) WHERE ST_Overlaps(a.geom, b.geom) 
AND ST_isvalid(a.geom)='t' AND ST_isvalid(b.geom)='t';

लेकिन मुझे अगला त्रुटि संदेश मिला:

ERROR: Function st_intersection(a,b) does not exist.
HINT: No function matches the given name and argument types. You might need to add explicit type casts.

मैंने यह सत्यापित करने के लिए कि केवल वैध बहुभुज का मूल्यांकन किया जा रहा है, को जोड़ा है, लेकिन यह बता रहा है कि त्रुटि ST_Intersection (a, b) में है, a, b और c दोनों में एक ही SRID है, इसलिए मैं वास्तव में उलझन में हूं, क्षमा करें यदि मैं बहुत अधिक पूछ रहा हूं, लेकिन मैं PostGIS के साथ काफी नया हूं इसलिए मुझे उम्मीद है कि मैं आपको बहुत परेशान नहीं कर रहा हूं। धन्यवाद।


1
क्या SELECT PostGIS_Full_Version();लौटाता है?
माइक टी।

POSTGIS = "1.4.0" GEOS = "3.1.0-CAPI-1.5.0" PROJ = "जारी। 4.7.1, 23 सितंबर 2009" USE_STATS
उरियल

जवाबों:


8

मेरा अनुमान है कि यह विफल रहता है अगर चौराहा NULL लौटाता है। यदि आप WTC बनाने के लिए प्रयास करने से पहले वास्तव में एक चौराहा है, तो आपको एक क्लॉज की जाँच को जोड़ना चाहिए।


मैंने यह कोशिश की: ST_Intersection (a.geom, b.geom) का चयन करें जैसा कि intersect_ab से एक INNER JOIN b पर ST_Intersection (a, b) है, जहाँ ST_Overlaps (a.geom, b.geom) और ST_isvalid (a.geom) = 't' 'और ST_isvalid (b.geom) =' t '; लेकिन यह एक ही त्रुटि लौटाया: ** त्रुटि: कार्य st_intersection (ए, बी) मौजूद नहीं है। सुझाव: कोई फ़ंक्शन दिए गए नाम और तर्क प्रकारों से मेल नहीं खाता है। आपको स्पष्ट प्रकार की जातियों को जोड़ने की आवश्यकता हो सकती है। ** मैं वास्तव में इस एक पर अटक गया हूं, अगर आप मेरी मदद कर सकते हैं तो मैं इसकी सराहना करूंगा।
उरईल

मूल्यों की जांच करने के लिए सारांश (a.geom) और सारांश (b.geom) आज़माएं।
UnderDark

सारांश -------------------------- बहुभुज [बीएस] १ रिंग रिंग ० के साथ ४ अंक पॉलीगॉन [बीएस] है जिसके १ रिंग रिंग ०: ५ है अंक 1 रिंग रिंग 0 के साथ बहुभुज [बीएस] में 10 अंक हैं
यूरिल

हाँ, यह होना चाहिए ST_Intersection (a.geom, b.geom) ST_Intersection (क, ख) नहीं
UnderDark

6

सुराग है

ERROR: Function st_intersection(a,b) does not exist.
HINT: No function matches the given name and argument types. You might need to add explicit type casts.

जैसा कि त्रुटि संदेश कहता है कि आप उस तरीके से st_intersection का उपयोग नहीं कर सकते हैं। अन्य उत्तरों को संक्षेप में आपको इस तरह से उपयोग करना चाहिए:

SELECT ST_Intersection(a.geom, b.geom) as intersect_ab 
FROM a INNER JOIN b ON ST_Intersects(a.geom,b.geom)
WHERE ST_isvalid(a.geom)='t' AND ST_isvalid(b.geom)='t';

AFAIK में समान वाक्यों में st_overlaps और st_intersects का उपयोग करने का कोई अर्थ नहीं है क्योंकि वे बहुत समान हैं


4

मैं बहुभुज की विभिन्न परत के बीच परीक्षण करता हूं और यह विफल हो जाता है अगर परत में से किसी एक में कम से कम एक अवैध ज्यामिति है। क्या आपने ST_isvalid (the_geom) का उपयोग करके अपने बहुभुजों की वैधता की जांच की? यह कुंजी हो सकती है।


मैंने यह कोशिश की: ST_Intersection (a.geom, b.geom) का चयन करें जैसा कि intersect_ab से एक INNER JOIN b पर ST_Intersection (a, b) है, जहाँ ST_Overlaps (a.geom, b.geom) और ST_isvalid (a.geom) = 't' 'और ST_isvalid (b.geom) =' t '; लेकिन यह एक ही त्रुटि लौटाया: ** त्रुटि: कार्य st_intersection (ए, बी) मौजूद नहीं है। सुझाव: कोई फ़ंक्शन दिए गए नाम और तर्क प्रकारों से मेल नहीं खाता है। आपको स्पष्ट प्रकार की जातियों को जोड़ने की आवश्यकता हो सकती है। ** मैं वास्तव में हार गया हूं कि यह काम क्यों नहीं कर रहा है
उरेल

2

कुछ इस तरह की कोशिश करो:

SELECT  ST_Intersection(a.geom, b.geom) As intersect_ab
    FROM a INNER JOIN b ON ST_Intersection(a,b)
    WHERE ST_Overlaps(a.geom, b.geom)
    ;

स्रोत


मैंने वह भी करने की कोशिश की लेकिन यह एक ही त्रुटि संदेश देता है: HINT: कोई फ़ंक्शन दिए गए नाम और तर्क प्रकारों से मेल नहीं खाता है। आपको स्पष्ट प्रकार की जातियों को जोड़ने की आवश्यकता हो सकती है।
उरईल

कैसे के बारे में यदि आप "INNER JOIN b ON ST_Intersection (a.geom, b.geom)" का उपयोग करते हैं?
कैप्टनड्रैगन

यह बताता है: त्रुटि: JOIN / ON का तर्क टाइप बूलियन होना चाहिए, न कि ज्यामिति।
ऊरीएल

shizer ... डेटा या कुछ के साथ कुछ गलत होना चाहिए क्योंकि इस प्रकार का क्वेरी मेरे लिए काम करता है।
कैप्टनड्रैगन

मैंने जोड़ा और ST_isvalid (a.geom) = 't' और ST_isvalid (b.geom) = 't'; अंत में केवल मान्य ज्यामिति का मूल्यांकन करें लेकिन यह मुझे बता रहा है कि त्रुटि उस__ में है (a, b)
उरियल

1

मैंने अमान्य ज्यामितियों को बाहर करने की कोशिश की, लेकिन यह काम नहीं किया, इसलिए अंत में मुझे हर अवैध ज्यामिति को हटाना पड़ा और फिर इसका उपयोग करना पड़ा:

SELECT ST_AsText(ST_Intersection(a.geom, b.geom)) as intersect_ab FROM a,b 
WHERE ST_Overlaps(a.geom, b.geom) AND ST_isvalid(a.geom)='t' AND ST_isvalid(b.geom)='t';

जैसा कि आप देख सकते हैं कि मैंने ST_Intersection (a, b) भाग को छोड़ दिया है, और यह बहुत अच्छा काम कर रहा है, मैं एक प्रकार का दुखी हूं, मुझे अपने चयन से किसी भी अवैध ज्यामिति को बाहर करने का कोई रास्ता नहीं मिल रहा है, वैसे भी मेरी मदद करने के लिए सभी का धन्यवाद यहाँ से बाहर।


0

मुझे एक बार यह समस्या हुई थी।

<pre>NOTICE:  TopologyException: found non-noded intersection between xxx, xxxx and xxx, xxx  ERROR:  GEOS Intersection() threw an error!</pre>

मैं इस पद्धति का उपयोग करके इस त्रुटि को हल करने में सक्षम था।
- उपयोग QGIS
- अपने डेटाबेस से जोड़ें सदिश परत
- त्रुटि संदेश से बात ले लो और QGIS में इसके लिए खोज
   "QuickWKT" (प्लगइन) यह पता लगाने के लिए इस्तेमाल किया जा सकता
- तो फिर तुम समस्या linestring देखेंगे
संपादन मोड को चालू करें -
- ग्रीन नोड (नोड समस्या) दिखाने के लिए "नोड टूल" चुनें
- नोड को ओवरलैप नोड से दूर ले जाएं
- परिवर्तन सहेजें

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