विकल्प 1:जियोआईपी का समर्थन करने वाले डेटाबेस पर स्विच करके डेटाबेस पर गणना करें।
विकल्प 2:इस तरह से संग्रहीत कार्यविधि का उपयोग करके डेटाबेस पर गणना करें:
CREATE FUNCTION calcDistance (latA double, lonA double, latB double, LonB double)
RETURNS double DETERMINISTIC
BEGIN
SET @RlatA = radians(latA);
SET @RlonA = radians(lonA);
SET @RlatB = radians(latB);
SET @RlonB = radians(LonB);
SET @deltaLat = @RlatA - @RlatB;
SET @deltaLon = @RlonA - @RlonB;
SET @d = SIN(@deltaLat/2) * SIN(@deltaLat/2) +
COS(@RlatA) * COS(@RlatB) * SIN(@deltaLon/2)*SIN(@deltaLon/2);
RETURN 2 * ASIN(SQRT(@d)) * 6371.01;
END//
यदि आपके डेटाबेस में अक्षांश और देशांतर पर एक अनुक्रमणिका है, तो आप PHP ($minLat, $maxLat, $minLong और $maxLong) में एक प्रारंभिक बाउंडिंग बॉक्स पर काम करके गणना की जाने वाली गणनाओं की संख्या को कम कर सकते हैं, और सीमित कर सकते हैं उस पर आधारित आपकी प्रविष्टियों के सबसेट की पंक्तियाँ (जहाँ $minLat और $maxLat के बीच अक्षांश और $minLong और $maxLong के बीच देशांतर)। तब MySQL को केवल पंक्तियों के उस सबसेट के लिए दूरी गणना निष्पादित करने की आवश्यकता होती है।
यदि आप दूरी की गणना करने के लिए केवल एक संग्रहीत प्रक्रिया का उपयोग कर रहे हैं) तो SQL को अभी भी आपके डेटाबेस में प्रत्येक रिकॉर्ड को देखना होगा, और अपने डेटाबेस में प्रत्येक रिकॉर्ड के लिए दूरी की गणना करने से पहले यह तय कर सकता है कि उस पंक्ति को वापस करना है या इसे त्यागना है ।
क्योंकि गणना निष्पादित करने के लिए अपेक्षाकृत धीमी है, यह बेहतर होगा यदि आप उन पंक्तियों के सेट को कम कर सकते हैं जिनकी गणना करने की आवश्यकता है, उन पंक्तियों को हटा दें जो स्पष्ट रूप से आवश्यक दूरी से बाहर हो जाएंगी, ताकि हम केवल महंगी गणना निष्पादित कर रहे हों पंक्तियों की एक छोटी संख्या।
यदि आप मानते हैं कि आप जो कर रहे हैं वह मूल रूप से एक मानचित्र पर एक वृत्त खींच रहा है, जो आपके प्रारंभिक बिंदु पर केंद्रित है, और दूरी की त्रिज्या के साथ है; तब सूत्र केवल यह पहचानता है कि कौन सी पंक्तियाँ उस मंडली में आती हैं... लेकिन उसे अभी भी हर एक पंक्ति की जाँच करनी है।
बाउंडिंग बॉक्स का उपयोग करना हमारे केंद्र बिंदु से उचित दूरी पर पहले बाएं, दाएं, ऊपर और नीचे के किनारों के साथ मानचित्र पर एक वर्ग बनाने जैसा है। तब हमारा वृत्त उस बॉक्स के भीतर खींचा जाएगा, जिसमें वृत्त पर सबसे उत्तर, पूर्व, दक्षिणतम और पश्चिमतम बिंदु बॉक्स की सीमाओं को स्पर्श करेंगे। कुछ पंक्तियाँ उस बॉक्स के बाहर गिरेंगी, इसलिए SQL उन पंक्तियों के लिए दूरी की गणना करने की कोशिश भी नहीं करता है। यह केवल उन पंक्तियों की दूरी की गणना करता है जो बाउंडिंग बॉक्स के भीतर आती हैं, यह देखने के लिए कि क्या वे सर्कल के भीतर भी आती हैं।
आपके PHP के भीतर (अनुमान है कि आप $ चर नाम से PHP चला रहे हैं), हम एक बहुत ही सरल गणना का उपयोग कर सकते हैं जो हमारी दूरी के आधार पर न्यूनतम और अधिकतम अक्षांश और देशांतर को काम करता है, फिर उन मानों को आपके SQL के WHERE क्लॉज में सेट करें बयान। यह प्रभावी रूप से हमारा बॉक्स है, और जो कुछ भी इससे बाहर आता है वह वास्तव में इसकी दूरी की गणना करने की आवश्यकता के बिना स्वचालित रूप से त्याग दिया जाता है।
मूवेबल टाइप पर इसकी (PHP कोड के साथ) अच्छी व्याख्या है। वेबसाइट PHP में कोई भी GeoPositioning कार्य करने की योजना बनाने वाले किसी भी व्यक्ति के लिए यह आवश्यक पठन होना चाहिए।
संपादित करें कैल्कडिस्टेंस संग्रहीत कार्यविधि में मूल्य 6371.01 आपको किलोमीटर में लौटा हुआ परिणाम देने के लिए गुणक है। यदि आप मील, समुद्री मील, मीटर, जो कुछ भी प्राप्त करना चाहते हैं, तो उपयुक्त वैकल्पिक गुणकों का उपयोग करें