Version 4
05.11.2009 17:20:13
Dies ist die aktuelle Version
wenn die aktuelle Vergleichsposition stets variabel ist, kommmst du um Rechnerei nicht herum.
Aber lass doch einfach die Datenbank rechnen.
die notwendige formel lautet:
r * arccos[sin(lat1/57.2958) * sin(lat2/57.2958) + cos(lat1/57.2958) * cos(lat2/57.2958) * cos(lng2/57.2958 -lng1/57.2958)]
wobei r der erdradius ist, also
r=3437,75 seemeilen
r=6378,16 kilometer
r=3963,2 meilen
jenachdem was du für eine einheit "herausbekommen" möchtest.
ich geme mal davon aus, du hast eine datenbanktabelle [hier a] in der du lat und lng Werte gespeichert hhast
probier es mal damit (getestet auf mysql, aber sicher auch auf andere DBs portierbar):
@set lat1 = [deine GPS-Lat-Variable]
@set lng1 = [deine GPS-Lng-Variable]
@set max_dist = [der maximale Umkreis]
@set max_treffer = [maximale anzahl treffer]
select a.* , round((6378.16 * acos(((sin(@lat1 / 57.2958) * sin(a.lat / 57.2958)) + ((cos(@lat1 / 57.2958) * cos(a.lat / 57.2958)) * cos((a.lng / 57.2958) - (@lng1 / 57.2958))))),2) AS `entf_km`
from a
where (6378.16 * acos(((sin(@lat1 / 57.2958) * sin(a.lat / 57.2958)) + ((cos(@lat1 / 57.2958) * cos(a.lat / 57.2958)) * cos((a.lng / 57.2958) - (@lng1 / 57.2958))))) < @max_dist
order by entf_km asc
limit @max_treffer
Ich hoffe, ich hab mich nicht mit den klammern versehen.