Umkreissuche & Entfernung

Daniel Steffen novinet

Angesehenes Mitglied
Hallo,

jetzt mal was für die Freaks unter uns... ich scheitere derzeit an der Abstandsentfernung einer Umkreissuche.

Folgende Sachlage: ich habe eine DB mit plz und Orten der User sowie deren longitude && latitude (in Google-Maps wird alles perfekt angezeigt).

Nun möchte ich ne umkreissuche machen, aber die Abstände sind wohl falsch... er zeigt mir auch komische Entfernungen an etc. Ich möchte das ganze gerne ohne zusätzliche geo-DB Datenbanken lösen, das muss ja zu machen sein. Hier mein Ansatz:

$daniel = read(db_q(user,"WHERE user = 'daniel'")); // Gibt mir die Daten des Users Daniel raus als Objekt.


$laenge = $daniel->map_longitude; // Longitude
$breite = $daniel->map_latitude; // Latitude
$radius = 6367.4; // Erdradius
$umkreis = 50;

$dbQ = db_q_single(user,"id,user,zip,city,(6367.41*SQRT(2*(1-cos(RADIANS(map_latitude))*cos(".$breite.")*(sin(RADIANS(map_longitude))*sin(".$laenge.")+cos(RADIANS(map_longitude))*cos(".$laenge."))-sin(RADIANS(map_latitude))*sin(".$breite.")))) AS Distance","WHERE map_longitude IS NOT NULL && zip IS NOT NULL && country = 'Deutschland' && (ACOS((SIN(radians($breite))*SIN(RADIANS(map_latitude))) + (COS(radians($breite))*COS(RADIANS(map_latitude))*COS(RADIANS(map_longitude)-radians($laenge)))) *6371) <= '$umkreis' ORDER BY Distance");
while($res = read($dbQ))
{.....}

Lasst euch nicht von meinen sql-Funktionen abschrecken, die verpacken nur die eigentlichen SQL-Befehle in schnellere Programmierabfolgen.. sonst nichts.

Ich habe auch mal gelesen, dass man die daten erst in RAD umwandeln muss - ich weiss net. Bin gerne bereit auch für ein fertiges Script was zu bezahlen, mein Ziel ist es einfach eine richtige Abfrage zu erhalten.

Dankeschön im Vorraus, Daniel

 
Dies

CODE (ACos((SIN(A.latitude_r) * SIN(@i_latitude_r)) +
(COS(A.latitude_r) * COS(@i_latitude_r) * COS(@i_longitude_r - A.longitude_r))
) * 6378.137) As Distance



ermittelt die Entfernung zwischen zwei Punkten.

 
Danke, hat funktioniert - hab jetzt auch das mit der Entfernung raus... und zum Schluss hab ich gemerkt, dass ich gestern auch schon genau die Lösung hatte mich aber vertippt habe... so, das hat mich ez 10 Stunden gekostet und ein wenig Geld... aber die Lösung hab ich *lach*

Wen es interessiert:
CODE
$dbQ = db_q_single(user,"id,user,zip,city,(ACos((SIN(map_latitude_rad) * SIN('$breite_rad')) + (COS(map_latitude_rad) * COS(".$breite_rad.") * COS(".$laenge_rad." - map_longitude_rad))) * $radius) AS Distance","WHERE (ACos((SIN(map_latitude_rad) * SIN('$breite_rad')) + (COS(map_latitude_rad) * COS(".$breite_rad.") * COS(".$laenge_rad." - map_longitude_rad))) * $radius) <= '$umkreis' ORDER BY Distance");





Gruß, D.
 
Womit bekommt man aus der PLZ und dem Ort eigtl die longitude und die latidude heraus?
Kann mir nicht vorstellen, dass ein User das eingeben muss.
Gibt es da fertige Datenbanken oder kann man das über Google Maps verwirklichen?
 
QUOTE (danwip @ Mi 30.04.2008, 19:46)Womit bekommt man aus der PLZ und dem Ort eigtl die longitude und die latidude heraus?
Kann mir nicht vorstellen, dass ein User das eingeben muss.
Gibt es da fertige Datenbanken oder kann man das über Google Maps verwirklichen?

Ich nutze innerhalb von server-daten zwei verschiedene Varianten:

Wenn ein Nutzer eine Postleitzahl eingibt und alles in der Umgebung von ... km sehen will, dann genügt es, der Postleitzahl Geokoordinaten zuzuweisen. Das kann man über eine zentrale Variante der OpenGeoDb bereitstellen, die von verschiedenen Kunden gemeinsam genutzt wird. Allerdings muß man sich da Lösungen für den Fall unscharfer Orte (Berl, Beerlin), mehrfacher Orte (Achim), ungenauer Postleitzahlen (102) und ungültiger Postleitzahlen (10248) überlegen.

Eine zweite Variante läuft über google: Beim Eingeben der Daten kann ein Nutzer seine Straße, PLZ und Ort eingeben, per Klick eine google-Maps aufrufen und dort die genauen Geokoordinaten bestätigen bzw. übernehmen.

Auf meiner Startseite ist unter 'Firmen mit mehreren Mitarbeitern' so etwas verlinkt. Das Stammdaten-Formular ist anonym aufrufbar und enthält diese Funktionalität.
 
Ganz einfach gehts so:

CODE
$content = file_get_contents("http://maps.google.com/maps/geo?q=,".city.",".country."&output=csv&key=$deinkey");
list ($ka, $ka2, $Lat, $Lon) = split('[,]', $content);



Lat und Lon sind die gesuchten werte ;-)

Gruß, D.


 
Zurück
Oben