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

Mysql में अक्षांश और देशांतर का उपयोग करके दो बिंदुओं के बीच की दूरी का पता लगाएं

मुझे लगता है कि आपका प्रश्न कहता है कि आपके पास 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() . के बजाय इसलिए यह एप्सिलॉन समस्याओं के प्रति कम संवेदनशील है।



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. डेटाबेस में mysqldb के माध्यम से पांडा डेटाफ़्रेम कैसे सम्मिलित करें?

  2. PHP/MySQL शून्य मान डालें

  3. अनुक्रमणिका का उपयोग करके InnoDB पर COUNT(*) प्रदर्शन का अनुकूलन कैसे करें

  4. डेबियन 10 . में मारियाडीबी डेटाबेस कैसे स्थापित करें

  5. कैसे सुनिश्चित करें कि आपका MySQL डेटाबेस सुरक्षित है