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