sql >> Database teknologi >  >> RDS >> Mysql

Find afstanden mellem to punkter ved hjælp af bredde- og længdegrad i mysql

Jeg tror, ​​dit spørgsmål siger, at du har city værdier for de to byer, som du ønsker at beregne afstanden imellem.

Denne forespørgsel vil gøre arbejdet for dig og give afstanden i km. Den bruger den sfæriske cosinuslovformel.

Bemærk, at du forbinder tabellen med sig selv, så du kan hente to koordinatpar til beregningen.

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

Bemærk, at konstanten 111.1111 er antallet af kilometer pr. breddegrad, baseret på den gamle Napoleonske definition af meteren som en titusindedel af afstanden fra ækvator til polen. Denne definition er tæt nok til at finde arbejde.

Hvis du ønsker statut miles i stedet for kilometer, skal du bruge 69.0 i stedet.

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

Hvis du leder efter punkter i nærheden, kan du blive fristet til at bruge en klausul noget som denne:

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

Det er (som vi siger i nærheden af ​​Boston MA USA) vildt langsomt.

I så fald skal du bruge en afgrænsningsrammeberegning. Se denne skrivning om, hvordan du gør det. http://www.plumislandmedia.net/mysql/haversine-mysql- nærmeste-loc/

Formlen indeholder en LEAST() fungere. Hvorfor? Fordi ACOS() funktion kaster en fejl, hvis dens argument er endda lidt større end 1. Når de to pågældende punkter er meget tæt på hinanden, vil udtrykket med COS() og SIN() beregninger kan nogle gange give en værdi lidt større end 1 på grund af floating-point epsilon (unøjagtighed ). LEAST(1.0, dirty-great-expression) call klarer det problem.

Der er en bedre måde, en formel af Thaddeus Vincenty . Den bruger ATAN2() i stedet for ACOS() så det er mindre modtageligt for epsilon-problemer.



  1. Hvordan får man primær nøglekolonne i Oracle?

  2. Hvad er markør i oracle

  3. Kalendertabel for Data Warehouse

  4. Hvordan giver man en API-klient 1.000.000 databaseresultater?