PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

निर्दिष्ट निर्देशांक से 5 मील की सीमा में सभी भवन प्राप्त करना

आप 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;


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. PostgreSQL में कनेक्शन प्रबंधन:एक गाइड

  2. PostgreSQL त्रुटि:घातक:भूमिका उपयोगकर्ता नाम मौजूद नहीं है

  3. मैं नए PostgreSQL JSON डेटाटाइप के अंदर फ़ील्ड का उपयोग करके क्वेरी कैसे करूं?

  4. PostgreSQL गलत छँटाई

  5. PHP में SQL चर को कैसे बांधें?