opengeodb nach Ort suchen

xthetronx

Erfahrenes Mitglied
Hallo zusammen,

ich habe eine Suche, welche mir schon anhand der PLZ verschiedene Adressen aus einer neuen Tabelle heraussucht, was auch soweit gut klappt.
Leider stehe ich jetzt auf dem Schlauch, was die Suche nach einem Ort anbelangt.
Die Suche nach der PLZ ist ja relativ einfach, da diese ja eindeutig und in der Tabelle zip_coordinates nur 1x vorkommt.
Bei der Stadt sieht das ganze dann aber schon anders aus, da eine Stadt ja viele PLZ hat und sie auch teilweise doppelt (Frankfurt a. M., Frankfurt a.d.O, etc.) vorkommen kann und somit nicht eindeutig klar ist, wenn jemand nach Frankfurt sucht, welches er nun meint.
Teilweise funktioniert es, wenn ich nach einer Stadt suche, aber so unzuverlässig, dass es natürlich Unsinn ist, damit zu arbeiten.

Ich könnte mir vorstellen, dass ich noch einen Parameter übergeben müsste, der quasi, wie das Zentrum der Stadt symbolisiert und sich zusätzlich dazu nur einen der Einträge herausnimmt.

Im Moment sieht meine Suche für die Postleitzahl so aus.

Code:
    $Plz_ort = $_POST["plz_ort"];
    #$Plz_ort = 40479 ODER ort = Frankfurt;
    $tabelle = $_POST["tabelle"];
    #$tabelle = "zc_zip" (plz) oder "zc_location_name" (ort);
    $umkreis = $_POST["umkreis"];
     #$umkreis = 15;
    
    $sql = "SELECT zc_id, zc_zip, zc_location_name, zc_lat, zc_lon 
    FROM zip_coordinates
    WHERE $tabelle LIKE '%$Plz_ort%'";
        
    $SQLresult = mysql_query($sql, $db);   
    $SQLnum = mysql_num_rows($SQLresult);
    $SQLrow = mysql_fetch_array($SQLresult);
     
    $partner = "SELECT 
        lat,
        lon,
        name,
        strasse,
        plz,
        ort,
        telefon,
        ID,
        webseite, 
        ACOS(
             SIN(RADIANS(lat)) * SIN(RADIANS(".$SQLrow["zc_lat"].")) 
             + COS(RADIANS(lat)) * COS(RADIANS(".$SQLrow["zc_lat"].")) * COS(RADIANS(lon)
             - RADIANS(".$SQLrow["zc_lon"]."))
             ) * 6380 AS distance
    FROM partner
    WHERE ACOS(
             SIN(RADIANS(lat)) * SIN(RADIANS(".$SQLrow["zc_lat"].")) 
             + COS(RADIANS(lat)) * COS(RADIANS(".$SQLrow["zc_lat"].")) * COS(RADIANS(lon)
             - RADIANS(".$SQLrow["zc_lon"]."))
             ) * 6380 < $umkreis
    ORDER BY distance";

Hat jemand eine Idee?

Vielen Dank

Gruß

Torsten
 
Moin Torsten,

eigentlich eine schwere Frage, woher soll dein Skript erraten können, welche Stadt derjenige meint :-(

Was ich mir vorstellen könnte, dass du zumindest bei Städten mit mehreren PLZ nur eine einzelne ausgegeben bekommst, wäre, dass du die Treffer gruppierst nach gerundeten Werten für zc_lat und zc_lon.
 
Hallo Sven,

danke erstmal für Deine Antwort.
Leichte Fragen wären ja auch langweilig oder? :p

Ich habe es zum Teil nun so hinbekommen:

Code:
        $sql = "SELECT MIN(zc_zip) AS kleinste_plz 
        FROM zip_coordinates 
        WHERE zc_location_name LIKE  '$Plz_ort%'";   
        
        $SQLresult = mysql_query($sql, $db);   
        $SQLnum = mysql_num_rows($SQLresult);
        $SQLrow = mysql_fetch_array($SQLresult);  
        
        $Plz_ort = $SQLrow["kleinste_plz"];

Obiges bewirkt, dass ich die kleinste Postleitzahl suche und diese dann wieder an mein vorheriges Script übergebe, was soweit schon mal fast gut funktioniert.
Zwei Dinge fehlen jetzt noch.
Zum einen, gibt es ja mehrere Städte mit gleichem Namen (siehe Frankfurt), da werde ich wohl noch eine Ajax-Auswahlmöglichkeit vorher einbauen müssen und
daran sitze ich jetzt wieder seit Stunden:
Das leidige Thema mit den Umlauten.
Denn meine Suche funktioniert soweit, solange ich keine Stadt wie Köln oder Düsseldorf suche.
Anscheinend werden die Daten nicht richtig übermittelt.:confused:

Gruß

Torsten
 
Die "Städtenamen" werden dort in diversen Formen in der DB gespeichert, unter anderem als durchgängige Grossbuchstaben, wobei dort Umlaute umgeandelt werden.

Aus Köln wird also KOELN, aus Düsseldorf DUESSELDORF usw.
Diese Umwandlung müsstest du wohl auch mit dem Suchwort vor dem Query vornehmen.
 
Moin Jungs,

vielen Dank erstmal für eure Hilfestellung.
Wie so häufig im Leben, sind es die einfachen Dinge die es bringen.
In meinem Fall:
utf8_decode();

$Plz_ort = utf8_decode($_POST["plz_ort"]);
und schon funktioniert es!

Jetzt muss ich nur noch eine Ajax-Abfrage für die vielen gleichnamigen Städte...

Schönen Sonntag noch.

Gruß

Torsten
 
Könnte es nicht evtl. auch sinnvoll sein, mehrere Ergebnisse zu liefern?
Ist halt die Frage, wie du mit dem Ergebnis weiter arbeiten willst.
Mehrere Punkte auf einer Karte könnten ja durchaus auch sinnvoll sein, oder?
 
Dieses Thread ist zwar schon etwas älter, aber das Problem mit utf-8 hat mich auch längere Zeit verfolgt. Die folgende Zauberanfrage kann ich nur empfehlen:
PHP:
mysql_query("SET NAMES 'utf8'");
Diese Anfrage muss nur einmal pro Datenbankverbindung an MySQL gesendet werden und die Probleme lösen sich in Luft auf.
 
Zurück