मुझे लगता है कि आपका प्रश्न कहता है कि आपके पास city
है उन दो शहरों के लिए मान जिनके बीच आप दूरी की गणना करना चाहते हैं।
किमी में दूरी की उपज, यह प्रश्न आपके लिए काम करेगा। यह गोलाकार कोज्या नियम सूत्र का उपयोग करता है।
ध्यान दें कि आप तालिका में स्वयं शामिल होते हैं ताकि आप गणना के लिए दो समन्वय जोड़े प्राप्त कर सकें।
SELECT a.city AS from_city, b.city AS to_city,
111.111 *
DEGREES(ACOS(LEAST(1.0, COS(RADIANS(a.Latitude))
* COS(RADIANS(b.Latitude))
* COS(RADIANS(a.Longitude - b.Longitude))
+ SIN(RADIANS(a.Latitude))
* SIN(RADIANS(b.Latitude))))) AS distance_in_km
FROM city AS a
JOIN city AS b ON a.id <> b.id
WHERE a.city = 3 AND b.city = 7
ध्यान दें कि निरंतर 111.1111
भूमध्य रेखा से ध्रुव तक की दूरी के दस-हज़ारवें हिस्से के रूप में मीटर की पुरानी नेपोलियन परिभाषा के आधार पर अक्षांश की प्रति डिग्री किलोमीटर की संख्या है। स्थान-खोजक कार्य के लिए यह परिभाषा काफी करीब है।
यदि आप किलोमीटर के बजाय क़ानून मील चाहते हैं, तो 69.0
. का उपयोग करें इसके बजाय।
http://sqlfiddle.com/#!9/21e06/412/0ए>
यदि आप आस-पास के बिंदुओं की तलाश कर रहे हैं तो आपको कुछ इस तरह के खंड का उपयोग करने के लिए लुभाया जा सकता है:
HAVING distance_in_km < 10.0 /* slow ! */
ORDER BY distance_in_km DESC
वह है (जैसा कि हम बोस्टन एमए यूएसए के पास कहते हैं) दुष्ट धीमा।
उस स्थिति में आपको एक बाउंडिंग बॉक्स गणना का उपयोग करने की आवश्यकता है। यह कैसे करना है इसके बारे में यह राइटअप देखें। http://www.plumislandmedia.net/mysql/haversine-mysql- निकटतम-स्थान/
सूत्र में एक LEAST()
होता है समारोह। क्यों? क्योंकि ACOS()
फ़ंक्शन एक त्रुटि फेंकता है यदि इसका तर्क 1 से थोड़ा अधिक है। जब प्रश्न में दो बिंदु एक साथ बहुत करीब हैं, तो अभिव्यक्ति COS()
के साथ है और SIN()
गणना कभी-कभी फ़्लोटिंग-पॉइंट एप्सिलॉन (गलतता
के कारण 1 से थोड़ा अधिक मान प्राप्त कर सकती है। ) LEAST(1.0, dirty-great-expression)
कॉल उस समस्या से मुकाबला करता है।
एक बेहतर तरीका है, एक फॉर्मूला
द्वारा थाडियस विंसेंटी
. यह ATAN2()
. का उपयोग करता है ACOS()
. के बजाय इसलिए यह एप्सिलॉन समस्याओं के प्रति कम संवेदनशील है।