sql >> Database >  >> RDS >> Mysql

Geolocatie afstand SQL van een stedentabel

Als u de maximale afstand tussen uw steden en uw lokale positie kunt beperken, profiteer dan van het feit dat één minuut breedtegraad (noord - zuid) één zeemijl is.

Zet een index op je breedtegraadtabel.

Maak een haversine (lat1, lat2, long1, long2, unit) opgeslagen functie van de haversine-formule die in uw vraag wordt getoond. Zie hieronder

Doe dit dan, gezien mijn breedtegraad, mijnlengtegraad en mijnkm.

SELECT * 
  from cities a
 where :mylatitude >= a.latitude  - :mykm/111.12
   and :mylatitude <= a.latitude  + :mykm/111.12
   and haversine(:mylatitude,a.latitude,:mylongitude,a.longitude, 'KM') <= :mykm
 order by haversine(:mylatitude,a.latitude,:mylongitude,a.longitude, 'KM')

Dit zal een begrenzingsvak voor breedtegraden gebruiken om steden die te ver van uw punt verwijderd zijn grofweg uit te sluiten. Uw DBMS gebruikt een indexbereikscan op uw breedtegraadindex om snel de rijen in uw stedentabel te selecteren die het overwegen waard zijn. Dan voert het je haversine-functie uit, die met alle sinus- en cosinus-berekeningen, alleen op die rijen.

Ik stel breedtegraad voor omdat de lengtegraad op de grond varieert met de breedtegraad.

Let op dit is grof. Het is prima voor een winkelzoeker, maar gebruik het niet als je een civiel ingenieur bent - de aarde heeft een elliptische vorm en dit veronderstelt dat het cirkelvormig is.

(Sorry voor het magische getal 111,12. Dat is het aantal km in een breedtegraad, dat is in zestig zeemijl.)

Zie hier voor een werkbare afstandsfunctie.

Waarom geeft deze in MySQL opgeslagen functie andere resultaten dan de berekening in de query?




  1. MySQL ::SQL-instructie uitvoeren binnen variabele

  2. Veldwaarden behouden na indienen

  3. dubbele vermeldingen mysql en php

  4. Welke Postgres-waarde moet ik gebruiken in Django's DATABASE_ENGINE?