आप x,y . को क्यों स्टोर कर रहे हैं? अलग कॉलम में? मैं आपको दृढ़ता से सुझाव देता हूं कि आप उन्हें geometry
. के रूप में संग्रहीत करें या geography
क्वेरी समय में अनावश्यक कास्टिंग ओवरहेड से बचने के लिए।
कहा जा रहा है, आप ST_DWithin
. का उपयोग करके मीलों में दूरियों की गणना और जांच कर सकते हैं या ST_Distance
:
(टेस्ट डेटा)
CREATE TABLE building (name text, long numeric, lat numeric);
INSERT INTO building VALUES ('Kirk Michael',-4.5896,54.2835);
INSERT INTO building VALUES ('Baldrine',-4.4077,54.2011);
INSERT INTO building VALUES ('Isle of Man Airport',-4.6283,54.0804);
ST_Dभीतर
ST_DWithin
यदि दिए गए ज्यामिति दूसरे से निर्दिष्ट दूरी के भीतर हैं तो सत्य वापस आ जाता है। निम्न क्वेरी POINT(-4.6314 54.0887)
से 5 मील के दायरे में ज्यामिति की खोज करती है :
SELECT name,long,lat,
ST_Distance('POINT(-4.6314 54.0887)'::geography,
ST_MakePoint(long,lat)) * 0.000621371 AS distance
FROM building
WHERE
ST_DWithin('POINT(-4.6314 54.0887)'::geography,
ST_MakePoint(long,lat),8046.72); -- 8046.72 metres = 5 miles;
name | long | lat | distance
---------------------+---------+---------+-------------------
Isle of Man Airport | -4.6283 | 54.0804 | 0.587728347062174
(1 row)
ST_Distance
समारोह ST_Distance
(geography
. के साथ पैरामीटर टाइप करें) मीटर . में दूरी लौटाएगा . इस फ़ंक्शन का उपयोग करने के लिए आपको बस इतना करना है कि अंत में मीटर को मील में बदलना है।
ध्यान दें :ST_Distance
. का उपयोग करके प्रश्नों में दूरियां वास्तविक समय में गणना की जाती है और इसलिए स्थानिक सूचकांक का उपयोग न करें . इसलिए, WHERE
. में इस फ़ंक्शन का उपयोग करने की अनुशंसा नहीं की जाती है खंड! इसके बजाय SELECT
. में इसका इस्तेमाल करें खंड। फिर भी नीचे दिया गया उदाहरण दिखाता है कि यह कैसे किया जा सकता है:
SELECT name,long,lat,
ST_Distance('POINT(-4.6314 54.0887)'::geography,
ST_MakePoint(long,lat)) * 0.000621371 AS distance
FROM building
WHERE
ST_Distance('POINT(-4.6314 54.0887)'::geography,
ST_MakePoint(long,lat)) * 0.000621371 <= 5;
name | long | lat | distance
---------------------+---------+---------+-------------------
Isle of Man Airport | -4.6283 | 54.0804 | 0.587728347062174
(1 row)
ST_MakePoint
के साथ पैरामीटर ऑर्डर पर ध्यान दें :यह देशांतर, अक्षांश है.. नहीं दूसरी तरफ।
डेमो:db<>fiddle
अमेज़ॅन एथेना समकक्ष (डिग्री में दूरी):
SELECT *, ST_DISTANCE(ST_GEOMETRY_FROM_TEXT('POINT(-84.386330 33.753746)'),
ST_POINT(long,lat)) AS distance
FROM building
WHERE
ST_Distance(ST_GEOMETRY_FROM_TEXT('POINT(-84.386330 33.753746)'),
ST_POINT(long,lat)) <= 5;