2012-05-05 26 views
11

में मैं निम्नलिखित निकटतम पड़ोसी क्वेरी का उपयोग कर रहा PostGIS में:कश्मीर निकटतम पड़ोसी क्वेरी PostGIS

SELECT g1.gid g2.gid FROM points as g1, polygons g2 
WHERE g1.gid <> g2.gid 
ORDER BY g1.gid, ST_Distance(g1.the_geom,g2.the_geom) 
LIMIT k; 

अब, कि मैं दोनों टेबल पर the_geom सूचक के साथ-साथ gid स्तंभ बनाया है, इस क्वेरी है स्थानिक जुड़ने वाले बी/डब्ल्यू दो तालिकाओं से जुड़े अन्य स्थानिक प्रश्नों की तुलना में अधिक समय लेना।

क्या के-निकटतम पड़ोसियों को खोजने का कोई बेहतर तरीका है? मैं पोस्टजीआईएस का उपयोग कर रहा हूं।

और, किसी अन्य क्वेरी जो ज्यामिति स्तंभ पर अनुक्रमणिका बनाने के बावजूद एक सामान्य से अधिक समय ले जा रहा है है:

select g1.gid , g2.gid from polygons as g1 , polygons as g2 
where st_area(g1.the_geom) > st_area(g2.the_geom) ; 

मुझे विश्वास है, इन प्रश्नों सार अनुक्रमित को लाभ नहीं कर रहे हैं, लेकिन क्यों?

इस क्वेरी जबकि:

select a.polyid , sum(length(b.the_geom)) from polygon as a , roads as b 
where st_intersects(a.the_geom , b.the_geom); 

रिटर्न "सड़कों" तालिका जो बहुभुज या अंक तालिका की तुलना में बहुत बड़ा है और यह भी अधिक जटिल स्थानिक ऑपरेटरों को शामिल शामिल होने के बावजूद कुछ समय के बाद उत्पन्न होती हैं।

+0

मुझे लगता है कि आपका प्रश्न क्वेरी को तेज़ी से कैसे बढ़ाया जाए? क्या आप हमें 'एक्सप्लान विश्लेषण चयन' के परिणाम दिखा सकते हैं? इस तरह हम शायद यह जान सकें कि वहां क्या हो रहा है। – Thilo

+0

नहीं, मेरा सवाल यह है कि क्यों यह प्रश्न उपर्युक्त तीसरी प्रश्न से 5 गुना अधिक समय ले रहा है !! और क्वेरी निष्पादन समाप्त "क्वेरी परिणाम के लिए स्मृति से बाहर": –

+0

ठीक है, के बारे में ज्यादा का इंतजार के बाद, दूसरा क्वेरी के लिए मैं निम्न त्रुटि संदेश प्राप्त करता है। क्या इस पर प्रकाश डाला जा सकता है? –

उत्तर

6

बस एक आपकी समस्या पर कुछ विचार:

st_distance के साथ-साथ st_area सूचकांकों का उपयोग करने में सक्षम नहीं हैं। ऐसा इसलिए है क्योंकि दोनों कार्यों को प्रश्नों में कम नहीं किया जा सकता है जैसे "क्या बी के भीतर है?" या "क्या ए और बी ओवरलैप करें?"। यहां तक ​​कि अधिक ठोस: GIST-सूचक केवल दो वस्तुओं के बाध्यकारी बक्से पर काम कर सकते हैं।

इस बारे में अधिक जानकारी के लिए आप केवल postgis manual देख सकते हैं, जो st_distance के साथ एक उदाहरण बताता है और बेहतर प्रदर्शन करने के लिए क्वेरी को कैसे सुधार किया जा सकता है।

हालांकि, यह आपके के-निकटतम पड़ोसी-समस्या को हल नहीं करता है। इसके लिए, अभी मेरे पास कोई अच्छा विचार नहीं है कि क्वेरी के प्रदर्शन में सुधार कैसे किया जाए। मुझे देखने का एकमात्र मौका यह मान लेगा कि निकटतम पड़ोसी हमेशा x मीटर की दूरी पर हैं। फिर आप पोस्टगिस मैनुअल में किए गए समान दृष्टिकोण का उपयोग कर सकते हैं।

आपकी दूसरी क्वेरी को थोड़ा तेज किया जा सकता है। वर्तमान में, तालिका तालिका में प्रत्येक ऑब्जेक्ट के लिए क्षेत्र की गणना करें, जितनी बार तालिका में पंक्तियां होती हैं - रणनीति डेटा में शामिल होने वाली पहली होती है और फिर उस फ़ंक्शन के आधार पर चयन करती है। आप क्षेत्र संगणना की गिनती कम हो सकता है काफी क्षेत्र precomputing हो:

WITH polygonareas AS (
    SELECT gid, the_geom, st_area(the_geom) AS area 
    FROM polygons 
) 
SELECT g1.gid, g2.gid 
FROM polygonareas as g1 , polygonareas as g2 
WHERE g1.area > g2.area; 

आपका तीसरे क्वेरी काफी बाउंडिंग बॉक्स का उपयोग कर अनुकूलित किया जा सकता है: जब दो वस्तुओं की बाउंडिंग बॉक्स ओवरलैप नहीं, कोई रास्ता नहीं वस्तुओं करना है । यह किसी दिए गए इंडेक्स के उपयोग की अनुमति देता है और इस प्रकार एक बड़ा प्रदर्शन लाभ देता है।

1

क्या आप की आवश्यकता हो सकती KNN सूचकांक जो PostGIS 2.x और PostgreSQL 9.1 में जल्द ही उम्मीद है कि उपलब्ध है: http://blog.opengeo.org/tag/knn/

14

देखें late September 2011 के बाद से, PostGIS एक विशेष ऑपरेटर (रों) प्रयोग करने योग्य के माध्यम से अनुक्रमित निकटतम पड़ोसी प्रश्नों का समर्थन किया है ORDER BY खंड में:

SELECT name, gid 
FROM geonames 
ORDER BY geom <-> st_setsrid(st_makepoint(-90,40),4326) 
LIMIT 10; 

... 10 वस्तुओं जिसका geom निकटतम है एक स्केलेबल रास्ते में -90,40 वापस आ जाएगी।कुछ और विवरण (विकल्प और प्रतिवाद) कि घोषणा post और use of the <-> और the <#> operators भी अब आधिकारिक PostGIS 2.0 संदर्भ में प्रलेखित है में हैं। (दोनों के बीच मुख्य अंतर यह है कि <-> आकार centroids तुलना करता है और <#> उनकी सीमाओं की तुलना करता है -। अंक के लिए कोई फर्क नहीं, अन्य आकार चुनें क्या आपके प्रश्नों के लिए उपयुक्त है)

+1

इन दो ऑपरेटरों का एक प्रमुख चेतावनी, के रूप में यह जुड़ा हुआ PostGIS संदर्भ पृष्ठों पर कहते हैं, कि स्थानिक सूचकांक में ही शुरू होगा अगर ज्यामिति में से एक, एक निरंतर है उदाहरण में अपने st_makepoint में के रूप में है। इसका मतलब यह है कि आप इन ऑपरेटरों को ओपी प्रश्न का उत्तर देने के लिए कुशल इंडेक्स उपयोग के साथ उपयोग नहीं कर सकते हैं जिसमें सभी ज्यामिति को शामिल करना शामिल है, ज्यामिति के किसी अन्य सेट के पास बी –

+0

आह, अच्छा बिंदु। इसे उठाने के लिए धन्यवाद। तो क्या @ स्टीफन का जवाब "सही" है, तो बस थोड़ी अधिक विस्तार और अद्यतन लिंक की आवश्यकता है? – natevw

0

मान लिया जाये कि आप पी बिंदु और जी बहुभुज है, तो आपकी मूल क्वेरी:

SELECT g1.gid, g2.gid FROM points as g1, polygons g2 
WHERE g1.gid <> g2.gid 
ORDER BY g1.gid, ST_Distance(g1.the_geom,g2.the_geom) 
LIMIT k; 

पीएक्सजी सेट में के निकटतम पड़ोसियों को वापस कर रहा है। क्वेरी इंडेक्स का उपयोग कर सकती है, लेकिन इसे अभी भी सबसे छोटी दूरी के साथ के पंक्तियों को खोजने के लिए पूरे पी एक्स जी सेट को ऑर्डर करना होगा। आप इसके बजाय क्या चाहते हैं:

SELECT g1.gid, 
     (SELECT g2.gid FROM polygons g2 
     --prevents you from finding every nearest neighbour twice 
     WHERE g1.gid < g2.gid 
     --ORDER BY gid is erroneous if you want to limit by the distance 
     ORDER BY ST_Distance(g1.the_geom,g2.the_geom) 
     LIMIT k) 
FROM points as g1;