| 1 |
Wie sind denn die Koordinaten ind er Datenbank gespeichert? Sind es Strings ala N 51° 01.872 E 013° 56.493 oder MySQL Geometry Points? (siehe http://dev.mysql.com/doc/refman/5.0/en/opengis-geometry-model.html)
– Scout 03.11.09
|
|
|
Als Strings ala 48,423232. Das kann ich aber noch korrigieren, dh zu MySQL Geometry Points ändern.
– ermin 03.11.09
|
||
|
Nicht Strings, Doubles.
– ermin 03.11.09
|
@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
|
Bringt das denn was, wenn man seinen aktuellen Standort wechselt? In dem Fall müssten ja alle Abstände erneut berechnet werden...
Ich denke er kommt da nicht wirklich um eine Sortierung herum :-/ – Dustin Klein 03.11.09
|
||
|
Ich war davon ausgegangen, das die gegebene Koordinate auch schon in der Datenbank ist. Wenn das allerdings, wie von dir angenommen, nicht der Fall ist, bringt mein Vorschlag tatsächlich nichts.
– fenchurch 03.11.09
|
SELECT X(b.pt) as X, Y(b.pt) Y, b.city
FROM cities as a, cities AS b
WHERE MBRCONTAINS(POLYFROMTEXT(''), b.pt);
-- und dann die Entfernung berechnen
SELECT X(b.pt) AS x, Y(b.pt) AS y, b.city,
ROUND(GLENGTH(LINESTRINGFROMWKB(LINESTRING(ASBINARY(a.pt),ASBINARY(b.pt))))) AS dist
FROM cities AS a, (
SELECT * FROM cities
WHERE MBRContains(PolyFromText(''), pt)
) AS b
HAVING dist < $radius ORDER BY dist;
-- Alternativ auch mit Distance() möglich, ja nach MySQL Version