sql >> Databasteknik >  >> RDS >> Mysql

PHP MySql och geolokalisering

Att beräkna avståndet med den funktionen där är ganska beräkningsmässigt dyrt, eftersom det involverar en hel massa transcendentala funktioner. Detta kommer att bli problematiskt när du har ett stort antal rader att filtrera på.

Här är ett alternativ, en uppskattning som är mycket billigare beräkningsmässigt:

Ungefärligt avstånd i miles:

sqrt(x * x + y * y)

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

Du kan förbättra noggrannheten i den här ungefärliga avståndsberäkningen genom att lägga till matematisk cosinusfunktion:

Förbättrat ungefärligt avstånd i miles:

sqrt(x * x + y * y)

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

Källa:http://www.meridianworlddata.com/Distance-Calculation.asp

Jag körde ett gäng tester med slumpmässigt genererade datauppsättningar.

  • Skillnaden i noggrannhet för de tre algoritmerna är minimal , särskilt på korta avstånd
  • Den långsammaste algoritmen är naturligtvis den med triggfunktionerna (den på din fråga). Den är 4 gånger långsammare än de andra två.

Absolut inte värt det. Gå bara med en uppskattning.
Koden finns här:http://pastebin.org/424186

För att använda detta på MySQL, skapa en lagrad procedur som tar koordinatargument och returnerar avståndet, då kan du göra något som:

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


  1. Finns det sätt att matcha IP med IP+CIDR ​​direkt från SELECT-frågan?

  2. Skapa en databas i SQL Server (T-SQL)

  3. MySQL hämta variabel från lagrad procedur i PHP PDO

  4. vad är skillnaden mellan '!=' och '<>' i mysql