Geo Coding Distanz Berechnung

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Geo Coding Distanz Berechnung

    Moin moin,

    ich habe gerade ein kleines Problem und zwar führe ich zb folgenden code aus:
    PHP-Code:
            $result=$this->_db->fetchRow("SELECT lon, lat FROM geo_data WHERE ort='Berlin'");

    // Übergabe der Daten an die Variabelen

    $lon $result['lon'] / 180 M_PI// Umrechnung von GRAD IN RAD
    $lat $result['lat']/ 180 M_PI// Umrechnung von GRAD IN RAD

    $umkreis=10// Übername aus Formular
    $result2=$this->_db->fetchAll("
    SELECT 
        DISTINCT geo.ort, 
        geo.plz,
        (6367.41*SQRT(2*(1-cos(RADIANS(geo.lat))*cos("
    .$lat.")*(sin(RADIANS(geo.lon))*sin(".$lon.")+cos(RADIANS(geo.lon))*cos(".$lon."))-
    sin(RADIANS(geo.lat))*sin("
    .$lat.")))) AS Distance
    FROM 
        geo_data as geo, 
        events as e
    WHERE 
        6367.41*SQRT(2*(1-cos(RADIANS(geo.lat))*cos("
    .$lat.")*(sin(RADIANS(geo.lon))*
    sin("
    .$lon.")+cos(RADIANS(geo.lon))*cos(".$lon."))-sin(RADIANS(geo.lat))*
    sin("
    .$lat."))) <= ".$umkreis." AND e.location = geo.ID 
    ORDER BY Distance"
    ); 
    in der geo_data stehn name, plz, id und koordinaten
    in der events stehen nur die id des veranstaltungsortes und sonstige infos

    das ganze funzt soweit auch ganz gut. d.h. er zeigt mir alle "events" im umkreis von 10km von berlin an. problem ist allerdings, das er mir events DIREKT in berlin nicht mit dazu packt :/ warum aber?

    Wie bekomme ich es jetzt am einfachsten hin um auch events in zb direkt in berlin anzuzeigen?

    MfG
    Alex

  • #2
    Ich gehe mal davon aus, dass deine Formel richtig ist, beurteilen kann ich das nicht. Versuch einmal die folgende Abfrage (kann sie leider nicht testen):
    Code:
    SELECT DISTINCT 
        geo.ort, 
        geo.plz,
        (6367.41*SQRT(2*(1-cos(RADIANS(geo.lat))*cos($lat)*(sin(RADIANS(geo.lon))*
        	sin($lon)+cos(RADIANS(geo.lon))*cos($lon))-
    	sin(RADIANS(geo.lat))*sin($lat)))) AS Distance
    FROM 
        geo_data AS geo, 
    INNER JOIN events AS e
        ON e.location = geo.ID
    HAVING 
        Distance <= $umkreis
    ORDER BY 
        Distance
    Ansonsten lohnt es sich vieleicht auch einmal einen Blick auf die GIS-Funktionen von MySQl zu werfen. Die Daten werden dort allerdings mit UTM-Koordinaten gespeichert, aber dazu gibts auch Umrechnungsfunktionen.
    Gruss
    H2O

    Kommentar


    • #3
      Hi,
      danke aber habs gerade selbst hinbekommen

      ich hab einfach die where in in klammern gepackt und das selbe mit einem OR verknüpft dahinter nocheinmal allerdings als bedingung IS NULL

      MfG
      Alex

      Kommentar

      Lädt...
      X