PostGIS में बाउंडिंग बॉक्स क्वेरी निष्पादित कर रहा है? [बन्द है]


22

मेरे पास एक PostgreSQL तालिका है, लगभग 2 मिलियन पंक्तियों के साथ coordinates, प्रपत्र में लंबे-लम्बे फ़ील्ड के साथ POINT(-73.4938 33.2405)

मान लीजिए कि उस क्षेत्र पर एक भू-स्थानिक सूचकांक है, तो मनमानी बाउंडिंग बॉक्स के भीतर सभी पंक्तियों को चुनने का सबसे कुशल, सबसे तेज़ तरीका क्या है?

बॉक्स की तरह है SW long-lat: -74.0042 40.7688, NE long-lat: -73.8809 40.7984


क्या आपके संग्रहीत निर्देशांक पहले से ही लंबे-लम्बे हैं या वे ग्रिड (X, Y) हैं?
मार्टिन एफ

1
साधारण गणित यहाँ करेगा ... अगर बिंदु। x SW.x से बड़ा है और NE.x से छोटा है और बिंदु। वह SW से बड़ा है और उसी समय NE.y से छोटा है, तो बिंदु अंदर है। एमबीआर। मुझे नहीं पता कि यह स्थानिक क्वेरी का उपयोग करने से तेज है या नहीं। आप कोशिश करने का मन है?
मिशाल ज़िम्मरमैन

@zimmi: वह नहीं करता है वास्तव में कहा गया है कि आइटम हैं सिर्फ अंक; वे जटिल ज्यामितीय हो सकते हैं।
मार्टिन एफ

वे कर रहे हैं बस अंक, हालांकि ;-)। वे WINTB के रूप में संग्रहीत POINT (-73.4938 33.24059) के रूप में लंबे समय से लटके हुए हैं।
अविशाई

मैंने उस जानकारी को प्रतिबिंबित करने के लिए क्यू (और मेरे ए) को संपादित किया। :-)
मार्टिन एफ

जवाबों:


24

दिए गए बाउंडिंग बॉक्स की सीमाएं समान स्थानिक संदर्भ प्रणाली में संग्रहीत निर्देशांक के रूप में होती हैं, और आप जानते हैं कि आपको किस स्थानिक ऑपरेटर (चौराहे या द्वारा निहित) की आवश्यकता है:

SELECT *
FROM   my_table
WHERE  coordinates 
    && -- intersects,  gets more rows  -- CHOOSE ONLY THE
    @ -- contained by, gets fewer rows -- ONE YOU NEED!
    ST_MakeEnvelope (
        xmin, ymin, -- bounding 
        xmax, ymax, -- box limits
        my_srid)

वैकल्पिक रूप से, यदि आप "समाहित" ("द्वारा निहित" के बजाय) की ध्वनि पसंद करते हैं, तो WHEREखंड को फ़्लिप किया जाना चाहिए:

WHERE  ST_MakeEnvelope (...)
    ~ -- contains, gets same fewer rows 
    coordinates 

पुनश्च: (के बाद से ऊपर पोस्ट किया गया था ओ पी) के द्वारा यह देखते हुए कि रिकॉर्ड कर रहे हैं सरल अंक, मुझे लगता है कि अंतर "intersects" और "रोकथाम" के बीच बहुत ही सूक्ष्म हो जाता है, केवल अंक को प्रभावित करने वाले किनारों पर बाउंडिंग बॉक्स के।


ये एक अच्छा बिंदु है। इसमें सम्‍मिलित होना चाहिए, क्‍योंकि यदि आप सीमा (यानी, ब्राउज़र क्रोम शायद) पर हैं तो आप वास्तव में मैप मार्कर नहीं देख पाएंगे ।
अविशाई

What's the fastest ...?: ओपी
मैग्नो सी

जागरूक रहें: &&और @बहुभुज ज्यामिति के साथ प्रतिच्छेद करते समय काम नहीं करते हैं। इस मामले में, उपयोग में ST_Intersects(latlng_column,ST_GeomFromText('Polygon ((...))',4326))या वैकल्पिक रूप सेST_Contains
एलेक्स


2

जाहिरा तौर पर, मेरे पास एक टिप्पणी जोड़ने के लिए पर्याप्त बिंदु नहीं हैं इसलिए मैं इस उत्तर का उपयोग सिर्फ यह कहने के लिए कर रहा हूं कि मैंने "x> min_x और x <max_x और y> min_y और y <max_y" दोनों की तुलना में ST_MakeEnvelope बनाम गणित की कोशिश की। .. एक औसत ST_MakeEnvelope 60ms लिया और गणित की तुलना में मेरे विशेष bbox क्वेरी पर 155ms लिया।

तो स्थानिक खोज ST_MakeEnvelope गणित की तुलना में तेजी से होना चाहिए!


1
दरअसल, अगर आप सही इंडेक्स बनाते हैं तो min_x, max_x, min_y और max_y ज्यादा तेज होंगे। मेरे पास एक बहुत बड़ा डेटासेट है (3 मिलियन पॉलीगॉन से अधिक) और INDEXST_MakeEnvelope और (ST_XMax, ST_XMIN, ST_YMax, ST_YMIN) दोनों पर किया और अंतर गणित के पक्ष में है। मैथ ने मुझे 20s (INDEX + Query) से कम समय में लिया जबकि लिफाफा चौराहा 2min पर चला गया (मैंने तब छोड़ दिया जब यह 2min तक पहुंच गया, 40 से केवल स्थानिक अनुक्रमण के लिए)
caiohamamura
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.