सबसे पहले, यदि आप अक्षांश, देशांतर का उपयोग कर रहे हैं, तो आपको 4326 का उपयोग करना होगा।
UPDATE season SET geom = ST_PointFromText ('POINT(' || longitude || ' ' || latitude || ')' , 4326 ) ;
फिर आप जियोम फील्ड पर एक इंडेक्स बनाते हैं
CREATE INDEX [indexname] ON [tablename] USING GIST ( [geometryfield] );
फिर आपको केएनएन नाइटबोर्स मिलते हैं:
SELECT *,ST_Distance(geom,'SRID=4326;POINT(newLon newLat)'::geometry)
FROM yourDbTable
ORDER BY
yourDbTable.geom <->'SRID=4326;POINT(newLon newLat)'::geometry
LIMIT 10;
यह क्वेरी जिस्ट इंडेक्स की kNN कार्यक्षमता का लाभ उठाएगी (http://workshops. बाउंडलेसजियो.com/postgis-intro/knn.html )।
फिर भी लौटाई गई दूरी डिग्री में होगी, मीटर में नहीं (प्रोजेक्शन 4326 डिग्री का उपयोग करता है)।
इसे ठीक करने के लिए:
SELECT *,ST_Distance(geography(geom),ST_GeographyFromText('POINT(newLon newLat)')
FROM yourDbTable
ORDER BY
yourDbTable.geom <->'SRID=4326;POINT(newLon newLat)'::geometry
LIMIT 10;
जब आप ST_distance की गणना करते हैं तो भूगोल प्रकार का उपयोग करें। दूरी हमेशा मीटर में होती है:
http://workshops.boundlessgeo.com/postgis-intro/geography.html ए>
इस सभी कार्यक्षमता के लिए शायद हाल ही के पोस्टगिस संस्करण (2.0+) की आवश्यकता होगी। हालांकि मुझे यकीन नहीं है।
संदर्भ के लिए इसे देखें https:// gis.stackexchange.com/questions/91765/improve-speed-of-postgis-nearest-neighbor-query/