आप चाहते हैं "सभी पंक्तियाँ एक निर्देशांक के 5 मील के दायरे में" , तो यह नहीं है बिल्कुल एक K-निकटतम-पड़ोसी (KNN) समस्या। संबंधित, लेकिन आपका मामला सरल है। "मेरे निर्देशांक के निकटतम 10 पंक्तियाँ खोजें" KNN समस्या होगी।
अपने निर्देशांकों को geography
में बदलें मान:
ST_SetSRID(ST_MakePoint(longitude, latitude),4326)::geography
वैकल्पिक रूप से आप सरल geometry
. का उपयोग कर सकते हैं प्रकार। विचार करें:
4.2.2. ज्यामिति डेटा प्रकार पर भूगोल डेटा प्रकार का उपयोग कब करें
फिर हमारे पास एक टेबल है जैसे:
CREATE TABLE tbl (
tbl_id serial PRIMARY KEY
, geog geography NOT NULL
);
आपको केवल ST_DWithin()
की आवश्यकता है - और एक स्थानिक अनुक्रमणिका इसे तेज़ बनाने के लिए:
CREATE INDEX tbl_geog_gist ON tbl USING gist(geog);
प्रश्न:
SELECT *, ST_Distance(c.x, geog) AS distance -- distance is optional
FROM tbl t, (SELECT ST_GeographyFromText('SRID=4326;POINT(-72.63 42.06)')) AS c(x)
WHERE ST_DWithin(c.x, geog, 8045) -- distance in meter
ORDER BY distance; -- order is optional, you did not ask for that
या आप अपने मूल कॉलम का उपयोग कर सकते हैं और एक कार्यात्मक अनुक्रमणिका बना सकते हैं ... यह और अन्य विवरण dba.SE पर इस निकट से संबंधित उत्तर में:
- दूरी के आधार पर ऑर्डर करें