PDA

View Full Version : Umkreissuche SQL mit KM begrenzung



Malte
17-10-13, 09:36
Hallo alle zusammen,

ich möchte wie der Titel schon sagt eine
Umkreissuche mit SQL machen zur verfügung habe X und Y als Kordinaten.

Bis jetzt habe ich es aber nur hin bekommen das er mir die Daten sortiert ausgiebt welche am nächsten sind.

Ich brauchen jetzt aber den Distanz wert in KM damit ich das vernüftig eingrenzen kann und nicht nur dir so und so viel nächsten.

Mein SQL-Befehl sieht bis jetzt so aus:

SELECT DATEI.*,
(ACOS(SIN(51.130546*PI()/180)* SIN(XKO*PI()/180) +
COS(51.130546*PI()/180)*COS(XKO*PI()/180)* COS((8.120452
-YKO)*PI()/180))) AS DISTANCE
FROM DATEI ORDER BY DISTANCE DESC

XKO und YKO sind die Datenbankfelder.

51.130546 und 8.120452 sind die felder die variabel eingesetzt werden.

DISTANCE bräuchte ich jetzt irgentwie in KM damit ich sagen kann alle innerhalb von 10KM oder so.

vielen Dank schon mal,
Malte

Robi
17-10-13, 09:50
Hier ist das gelöst (http://stackoverflow.com/questions/2296824/php-mysql-compare-long-and-lat-return-ones-under-10-miles)
Robi

Malte
17-10-13, 09:59
danke für die schnelle Antwort aber mit
HAVING geht das nicht der Sag mir immer 'Spalte oder globale Variable DISTANCE nicht gefunden.' und ohne HAVING sehen die werte nicht wirklich nach KM aus

MFG Malte

Fuerchau
17-10-13, 10:56
Having ist auch der falsche Ansatz, das geht nur beim Groupby.

In der Where-Klausel ist der Ausdruck zu wiederholen und kann dann abgefragt werden:

where ... and abs(Ausdruck) <= 10 ...

Da das aber Tipparbeit ist (und Fehler sich einschleichen können), kannst du auch

select * from (
originalselect ) hugo
where abs(distance) <= 10

Die Umrechnung in KM findest du ja in dem anderen Link.

malzusrex
17-10-13, 11:06
Ich denke deine Formel ist nicht ganz vollständig

SELECT DATEI.*,
Cast(6378,388*
(ACOS(SIN(51.130546*PI()/180)* SIN(XKO*PI()/180) +
COS(51.130546*PI()/180)*COS(XKO*PI()/180)* COS((8.120452
-YKO)*PI()/180))) as dec(10, 4))
AS DISTANCE
FROM DATEI ORDER BY DISTANCE DESC

Guckst du auch hier (http://www.kompf.de/gps/distcalc.html)

Gruß Ronald

malzusrex
17-10-13, 11:17
with x as (
SELECT DATEI.*,
Cast(6378,388*
(ACOS(SIN(51.130546*PI()/180)* SIN(XKO*PI()/180) +
COS(51.130546*PI()/180)*COS(XKO*PI()/180)* COS((8.120452
-YKO)*PI()/180))) as dec(10, 4))
AS DISTANCE
FROM DATEI
)
Select x.* from x where DISTANCE < 10 ORDER BY DISTANCE DESC

Malte
17-10-13, 13:00
danke für die ganze Hilfe

malzusrex du hats rechte jetzt nach vervollständiegung und nach dem ich ich gemerk habe das ich x und y vertauscht habe funktioniert es.

MFG Malte