Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Znajdź odległość między dwoma punktami za pomocą szerokości i długości geograficznej w mysql

Myślę, że twoje pytanie mówi, że masz city wartości dla dwóch miast, między którymi chcesz obliczyć odległość.

To zapytanie wykona zadanie za Ciebie, podając odległość w km. Wykorzystuje wzór sferycznego cosinusa.

Zauważ, że łączysz tabelę ze sobą, dzięki czemu możesz pobrać dwie pary współrzędnych do obliczeń.

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

Zauważ, że stała 111.1111 to liczba kilometrów na stopień szerokości geograficznej, oparta na starej napoleońskiej definicji metra jako jednej dziesięciotysięcznej odległości od równika do bieguna. Ta definicja jest wystarczająco zbliżona do pracy z lokalizatorem.

Jeśli chcesz otrzymać mile ustawowe zamiast kilometrów, użyj 69.0 zamiast tego.

http://sqlfiddle.com/#!9/21e06/412/0

Jeśli szukasz punktów w pobliżu, możesz pokusić się o użycie klauzuli podobnej do tej:

   HAVING distance_in_km < 10.0    /* slow ! */
    ORDER BY distance_in_km DESC

To jest (jak mówimy w pobliżu Boston MA USA) nikczemnie powolne.

W takim przypadku musisz użyć obliczenia obwiedni. Zobacz ten zapis o tym, jak to zrobić. http://www.plumislandmedia.net/mysql/haversine-mysql- najbliższy-loc/

Formuła zawiera LEAST() funkcjonować. Czemu? Ponieważ ACOS() funkcja wyrzuca błąd, jeśli jej argument jest nawet nieco większy niż 1. Gdy te dwa punkty są bardzo blisko siebie, wyrażenie z COS() i SIN() obliczenia mogą czasami dać wartość nieco większą niż 1 z powodu zmiennoprzecinkowej epsilon (niedokładność ). LEAST(1.0, dirty-great-expression) telefon radzi sobie z tym problemem.

Jest lepszy sposób, wzór autor:Thaddeus Vincenty . Używa ATAN2() zamiast ACOS() więc jest mniej podatny na problemy z epsilon.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. MySQL Cast jako Boolean

  2. Jaka jest różnica między VARCHAR a CHAR?

  3. mysql SQL:określony element jako pierwszy, a następnie sortowanie pozostałych elementów

  4. Zresetuj hasło root serwera MySQL

  5. Zapytanie MySQL Ciąg zawiera