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

चयनित बिंदु से विशिष्ट दूरी पर सभी पतों को खोजने का सबसे अच्छा तरीका क्या है?

जब मैंने इसे MySQL में लागू किया है (एक तिरछे क्षेत्र पर स्थानों को संग्रहीत करने के लिए, जो मूल रूप से पृथ्वी है (मुझे लगता है कि आप पृथ्वी के बारे में बात कर रहे हैं!)), मैंने डेटाबेस में यथासंभव पूर्व-गणना की जानकारी संग्रहीत की है। तो, latitude को स्टोर करने वाली पंक्ति के लिए और longitude , मैं सम्मिलन के समय निम्नलिखित क्षेत्रों की गणना भी करता हूं:

  • radiansLongitude (Math.toRadians(longitude) )
  • sinRadiansLatitude (Math.sin(Math.toRadians(latitude) )
  • cosRadiansLatitude (Math.cos(Math.toRadians(latitude) )

फिर जब मैं उन स्थानों की खोज करता हूं जो latitude . की X इकाइयों के भीतर हैं /longitude प्रश्न में, मेरा तैयार विवरण इस प्रकार है:

from Location l where
    acos(
        sin(:latitude) * sinRadiansLatitude + 
        cos(:latitude) * cosRadiansLatitude * 
        cos(radiansLongitude - :longitude) 
        ) * YYYY < :distance
    and l.latitude>:minimumSearchLatitude
    and l.latitude<:maximumSearchLatitude 
    and l.longitude>:minimumSearchLongitude 
    and l.longitude<:maximumSearchLongitude 
    order by acos(
                sin(:latitude) * sinRadiansLatitude + 
                cos(:latitude) * cosRadiansLatitude * 
                cos(radiansLongitude - :longitude)  
        ) * YYYY asc

जहां YYYY =3965 आपको मीलों या YYYY . में दूरियां देता है =6367 का उपयोग किमी में दूरी के लिए किया जा सकता है।

अंत में, मैंने maximumSearchLatitude . का उपयोग किया है / maximumSearchLongitude / minimumSearchLongitude / maximumSearchLongitude डेटाबेस को कोई गणना करने से पहले परिणामसेट से अधिकांश बिंदुओं को बाहर करने के लिए पैरामीटर। आपको इसकी आवश्यकता हो भी सकती है और नहीं भी। यदि आप इसका उपयोग करते हैं, तो यह आप पर निर्भर करेगा कि आप इन मापदंडों के लिए कौन से मान चुनते हैं, क्योंकि यह इस बात पर निर्भर करेगा कि आप क्या खोज रहे हैं।

स्पष्ट रूप से डेटाबेस में अनुक्रमणिका के विवेकपूर्ण अनुप्रयोग आवश्यक होंगे।

इस दृष्टिकोण का उपयोग करने का लाभ यह है कि जो जानकारी कभी नहीं बदलती है, लेकिन हर बार उसकी आवश्यकता होती है, उसकी गणना केवल एक बार की जाती है, जबकि radiansLongitude के मानों की गणना की जाती है। , sinRadiansLatitude , cosRadiansLatitude हर पंक्ति के लिए हर बार जब आप कोई खोज करते हैं तो यह बहुत तेजी से महंगा होने वाला है।

दूसरा विकल्प भू-स्थानिक अनुक्रमणिका का उपयोग करना है , जिसका अर्थ है कि यह सब आपके लिए डेटाबेस द्वारा संभाला जाता है। हालांकि मुझे नहीं पता कि हाइबरनेट कितनी अच्छी तरह इसके साथ एकीकृत होता है।

अस्वीकरण:मुझे इसे देखे हुए काफी समय हो गया है, और मैं जीआईएस विशेषज्ञ नहीं हूं!



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. डीबी में संग्रहीत जावा यूयूआईडी को बाइनरी के रूप में वापस कैसे प्राप्त करें?

  2. mySQL में ऑर्डर द्वारा कस्टम ऑर्डर कैसे परिभाषित करें?

  3. MySQL में एक्सेंट कैसे निकालें?

  4. MySQL परिणाम अनुक्रमणिका 13 पर पंक्ति 0 पर जाने में असमर्थ

  5. मैसकल - एक क्वेरी के साथ कई तालिकाओं से हटाएं