sql >> Database >  >> RDS >> Mysql

PHP MySql en geolocatie

Het berekenen van de afstand met die functie daar is behoorlijk rekenkundig duur, omdat het een hele reeks transcendentale functies omvat. Dit wordt problematisch als je een groot aantal rijen hebt om op te filteren.

Hier is een alternatief, een benadering die veel minder rekenkundig duur is:

Geschatte afstand in mijlen:

sqrt(x * x + y * y)

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

U kunt de nauwkeurigheid van deze geschatte afstandsberekening verbeteren door de cosinus-wiskundige functie toe te voegen:

Verbeterde geschatte afstand in mijlen:

sqrt(x * x + y * y)

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

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

Ik heb een aantal tests uitgevoerd met willekeurig gegenereerde datasets.

  • Het verschil in nauwkeurigheid voor de 3 algoritmen is minimaal , vooral op korte afstanden
  • Het langzaamste algoritme is natuurlijk degene met de trig-functies (die op uw vraag). Het is 4x langzamer dan de andere twee.

Absoluut niet de moeite waard. Ga gewoon met een benadering.
Code is hier:http://pastebin.org/424186

Om dit op MySQL te gebruiken, maakt u een opgeslagen procedure dat coördinaatargumenten nodig heeft en de afstand retourneert, dan kun je zoiets doen als:

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


  1. Is het mogelijk om strings van meerdere rijen en tabellen samen te voegen tot één resultaatkolom?

  2. SQL Server 2005 implementatie van MySQL VERVANGEN IN?

  3. Live update MySQL-gegevens

  4. Opgeslagen procedure installeren op meerdere databases