मेरे पास एक PostgreSQL 9.1 टेबल है जिसमें सैकड़ों हज़ारों PostGIS POINT हैं। इनमें से प्रत्येक के लिए मैं POINTs की एक अन्य तालिका में निकटतम बिंदु खोजना चाहूंगा। दूसरी तालिका के अंक पूरी दुनिया में एक ग्रिड का प्रतिनिधित्व करते हैं, इसलिए मुझे पता है कि 1 डिग्री के भीतर हमेशा एक मैच होना है। यह वह क्वेरी है जिसका मैं अब तक उपयोग कर रहा हूं, जो जिस्ट इंडेक्स का उपयोग करता है, इसलिए यह उचित रूप से तेज है (कुल लगभग 30 सेकंड)।
SELECT DISTINCT ON (p.id)
p.id, ST_AsText(p.pos)
, ST_AsText(first_value(g.location) OVER (PARTITION BY p.id ORDER BY ST_Distance(p.pos, g.location::geography)))
FROM point p
JOIN grid g ON ST_DWithin(p.pos::geometry, g.location, 1)
एकमात्र समस्या डेटलाइन है। ग्रिड बिंदुओं में केवल अक्षांश 180 है, -180 नहीं। ST_Distance के ज्यामिति संस्करण का उपयोग करते समय यह डेटलाइन के दूसरी तरफ अंक नहीं देता है। उदाहरण के लिए। यदि p.pos POINT(-179.88056 -16.68833)
निकटतम ग्रिड बिंदु हो सकता है POINT(180 -16.25)
, लेकिन उपरोक्त क्वेरी इसे वापस नहीं करती है। इसे ठीक करने का सबसे अच्छा तरीका क्या है?
मैं वास्तव में एक ग्रिड बिंदु (-180 और +180) के लिए दो निर्देशांक नहीं रखना चाहता। मैंने अपने स्वयं के फ़ंक्शन में जोड़ने की कोशिश की, जो इस विशिष्ट मामले की जांच करता है, लेकिन फिर क्वेरी 5 मिनट में वापस नहीं आती है, शायद इसलिए कि यह अब सूचकांक का उपयोग नहीं कर सकता है। मैंने ST_DWithin के भूगोल संस्करण का उपयोग करने का भी प्रयास किया और वह प्रश्न भी 5 मिनट के बाद वापस नहीं आया।