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

PHP MySql og geolocation

At beregne afstanden ved at bruge den funktion der er temmelig beregningsmæssigt dyrt, fordi det involverer en hel masse transcendentale funktioner. Dette vil være problematisk, når du har et stort antal rækker at filtrere på.

Her er et alternativ, en tilnærmelse, der er meget billigere beregningsmæssigt:

Omtrentlig afstand i miles:

sqrt(x * x + y * y)

where x = 69.1 * (lat2 - lat1) 
and y = 53.0 * (lon2 - lon1) 

Du kan forbedre nøjagtigheden af ​​denne omtrentlige afstandsberegning ved at tilføje den matematiske cosinusfunktion:

Forbedret omtrentlig afstand i miles:

sqrt(x * x + y * y)

where x = 69.1 * (lat2 - lat1) 
and y = 69.1 * (lon2 - lon1) * cos(lat1/57.3) 

Kilde:http://www.meridianworlddata.com/Distance-Calculation.asp

Jeg kørte en masse tests med tilfældigt genererede datasæt.

  • Forskellen i nøjagtighed for de 3 algoritmer er minimal , især på korte afstande
  • Den langsomste algoritme er selvfølgelig den med trig-funktionerne (den på dit spørgsmål). Den er 4x langsommere end de to andre.

Absolut ikke det værd. Bare gå med en tilnærmelse.
Koden er her:http://pastebin.org/424186

For at bruge dette på MySQL skal du oprette en lagret procedure der tager koordinatargumenter og returnerer afstanden, så kan du gøre noget som:

SELECT columns 
  FROM table 
 WHERE DISTANCE(col_x, col_y, target_x, target_y) < 25


  1. Hvordan ændres database_url på heroku?

  2. Simuler OPRET DATABASE, HVIS IKKE FINNES for PostgreSQL?

  3. Mysql 'Fik fejl -1 fra lagermotor' fejl

  4. MySQL hente seneste rekord for Group