Google Maps: Távolság számítás SQL-ben

A következőkben bemutatjuk, hogy hogyan lehet SQL-ben a google maps koordinátái alapján két pont légvonalbeli távolságát kiszámítani kellő pontossággal, melyet kellemes és érdekes featureként lehet beépíteni a google mashupunkba.

Egy egyszerű példán keresztül nézzük meg, hogy hogyan is működik.

A helyszínnek meg kell adni a koordinátáit, regisztrált felhasználónkpedig az adatlapján tudja beállítani tartózkodási helyét:

Tartozkodási hely beállítása

Vegyünk két táblát tehát:

  • felhasználót tároló tábla (tábla1), mezői: id, név, lat, lng, egyéb
  • helyszint tároló tábla (tábla2), mezői: id, név, lat, lng, egyéb

Amikor főhősünket informálni szeretnénk milyen messze is van, szükségnük van egy tárolt függvényre (MySQL 5) , ami kiszámolja a távolság értékét:

CREATE FUNCTION `get_dist`(lat1 FLOAT(18,14), lon1 FLOAT(18,14), lat2 FLOAT(18,14), lon2 FLOAT(18,14) ) RETURNS float(18,3)NOT DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT ''
BEGIN
return ROUND(6378.7 * acos(sin(lat1/57.2958) * sin(lat2/57.2958) + cos(lat1/57.2958) * cos(lat2/57.2958) *  cos(lon2/57.2958-lon1/57.2958)),3);
END;

A get_dist függvénynek 4 bemenő paramétere van, az első kettő az egyik cél koordináta párja, a másik kettő a másiké. Ügyeljünk a float értékekre – 18,14 -, így viszi az előjeleket is. :) Ez a függvény a két pont közötti távolságot adja meg km-ben. Használata pedig:

select get_dist(tábla1.lat,tábla1.lng, tábla2.lat, tábla2.lng) as km from tábla1, tábla2 where tábla1.id=1 and tábla2.id=11;

Innen adódik, hogy le tudjuk kérdezni egy ponthoz képest pl 10 km-es körön belül elhelyezkedő további pontokat:

select ... where get_dist(tábla1.lat,tábla1.lng, tábla2.lat, tábla2.lng)<10 and ....

A függvény matematikai problémáira nem térünk ki, célunk csupán az eljárás bemutatása volt. Aki esetleg ennél tud pontosabb megoldást vagy bugot talált, az küldje el nekünk.

A bejegyzés kategóriája: Nincs kategorizálva
Kiemelt szavak: , .
Közvetlen link.

Google Maps: Távolság számítás SQL-ben bejegyzéshez 2 hozzászólás

  1. zsolti hozzászólása:

    van már valami útvonaltervező cucc is benne, lehet azzal meg lehetne kapni a valós távolságot is (nem légvonalban)

  2. cadmagician hozzászólása:

    http://www.google.com/apis/maps/documentation/directionsAdvanced.html

    http://www.google.com/apis/maps/documentation/directionsSimple.html

    esetleg úgy lehetne, hogy a háttérben kérni egy routeot, és letárolni a polyline hosszát. ergo kesselés lenne. csak nem tudom, hogy a google hogy jutalmazná a sok túráztatást. egyszer lekéred az útvonalat mikor megjelenik a hely, majd következőleg csak kiíratod a távolságot. Lehetne adott tűréssel is, használva a fenti függvényt:

    minden olyan emberkére igaz lesz ez a távolság, aki pl 3-4 km-es körzeten belül lakik az eredeti lekérőtől. Kicsit csalna…

ITT és MOST VÁRJUK A HOZZÁSZÓLÁST!

Email cím (nem tesszük közzé) A kötelezően kitöltendő mezőket * karakterrel jelöljük

*

A következő HTML tag-ek és tulajdonságok használata engedélyezett: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>