जब मैंने इसे 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
हर पंक्ति के लिए हर बार जब आप कोई खोज करते हैं तो यह बहुत तेजी से महंगा होने वाला है।
दूसरा विकल्प भू-स्थानिक अनुक्रमणिका का उपयोग करना है , जिसका अर्थ है कि यह सब आपके लिए डेटाबेस द्वारा संभाला जाता है। हालांकि मुझे नहीं पता कि हाइबरनेट कितनी अच्छी तरह इसके साथ एकीकृत होता है।
अस्वीकरण:मुझे इसे देखे हुए काफी समय हो गया है, और मैं जीआईएस विशेषज्ञ नहीं हूं!