[phpBB Debug] PHP Warning: in file [ROOT]/ext/tas2580/seourls/event/listener.php on line 213: Undefined array key "FORUM_NAME"
REDAXO Forum • [NEU] OpenGeoDB AddOn
Seite 1 von 1

[NEU] OpenGeoDB AddOn

Verfasst: 25. Okt 2014, 16:39
von RexDude
Stellt aktuell nur die OgdbDistance Lib zur Umkreissuche für REDAXO bereit.

Changelog:
https://github.com/RexDude/opengeodb/bl ... ANGELOG.md

Dowload:
http://www.redaxo.org/de/download/addons/?addon_id=1202

Bugtracker:
https://github.com/RexDude/opengeodb/issues

Re: [NEU] OpenGeoDB AddOn

Verfasst: 19. Nov 2014, 16:19
von derkrebs
Hej RexDude,

vielen Dank für dieses AddOn - das kommt genau richtig für mich, da ich für ein aktuelles Projekt genau sowas brauche! :D

Bei meinem Projekt soll eine Liste von für den Umkreis der eingegebenen PLZ zuständigen Außendienst-Mitarbeitern ausgegeben werden. Da es hier aber auch Außendienstler in Österreich und der Schweiz gibt, wäre meine Frage, ob und wie man auch länderübergreifend suchen kann (z. B. durch eingeben eines Ländercodes wie D, A, CH o. ä.)? So wie ich das im Moment verstehe, kann man mit dem AddOn immer nur in dem über die Settings eingestellten Land suchen, oder sehe ich das falsch?

Gruß,
Michael

Re: [NEU] OpenGeoDB AddOn

Verfasst: 19. Nov 2014, 23:06
von RexDude
Hi,

du siehst dass schon richtig. Es ist aktuell sehr rudimentär und performant in den Text-Dateien zu suchen ist es auch nicht wirklich. Wie du dein Vorhaben genau realsierst weis wich auch nicht. Evtl. die Klasse anpassen. Oder du gehst den Weg über die DatenbankVersion vom OpenGeoDB. Kannst dass auch ins Addon integrieren bzw. einfach ein Fork machen.

Re: [NEU] OpenGeoDB AddOn

Verfasst: 28. Nov 2014, 21:17
von gupi
Große Klasse, auch ich setze mich derzeit mit der OpenGeoDB auseinander.
RexDude hat geschrieben:Oder du gehst den Weg über die DatenbankVersion vom OpenGeoDB.
Das Einbinden der kompletten Datenbank ist allerdings für die PLZ-Umkreissuche wohl eher "Overkill", denn dazu brauche ich nicht zwingend die komplette DB wie sie in den OpenGeoDB Projekt angeboten wird. Der Lösungsweg zur PLZ-Umkreissuche aus dem OpenGeo-Wiki funktioniert zwar grundsätzlich, ist aber auch nicht wirklich vollständig und muss noch angepasst werden. Denn leider werden in dem Wiki-Beispiel alle Ortsteile einer sog. Flächengemeinde ignoriert.

Hier mal (als Denkanstoß) mein kleines Testmodul um die Entfernung zwischen Adressen zu ermitteln ohne die GeoDb einbinden zu müssen:

Code: Alles auswählen

<?php
$places = array (
    "Sindorfer Str. 46, 50189 Elsdorf, Deutschland",
    "Augsburger Str. 2,50170 Kerpen",
    "50189 Elsdorf" 
);
$p = array();

foreach ( $places as $key=>$place ) {
  $google = getCoordsByName ( $place );
  $p[] = array("lat"=>$google[0],"lng"=>$google[1]);
  echo "(".($key+1).") ".$place;
  echo '<pre>' . print_r ( $google, true ) . '</pre>';
}

$dist = Geo::get_distance ( $p[0] ['lat'], $p[0] ['lng'], $p[1] ['lat'], $p[1] ['lng'] ) ;
Echo "Entfernung 1 nach 2 (Luftlinie): ".round($dist,1)." km<br />";
$dist = Geo::get_distance ( $p[0] ['lat'], $p[0] ['lng'], $p[2] ['lat'], $p[2] ['lng'] ) ;
Echo "Entfernung 1 nach 3 (Luftlinie): ".round($dist,1)." km<br />";
$dist = Geo::get_distance ( $p[1] ['lat'], $p[1] ['lng'], $p[2] ['lat'], $p[2] ['lng'] ) ;
Echo "Entfernung 2 nach 3 (Luftlinie): ".round($dist,1)." km<br />";

function getCoordsByName($place) {
  $content = file_get_contents ( 'https://maps.googleapis.com/maps/api/geocode/json?address=' . urlencode ( $place ) . '&sensor=false' );
  $json = json_decode ( $content, true );
  if (! $content || is_null ( $json )) {
    return false;
  }
  $coordinates = $json ['results'] [0] ['geometry'] ['location'];
  return array (
      $coordinates ['lat'],
      $coordinates ['lng'] 
  );
}

class Geo {
  const RADIUS = 6378.16; // earth radius in km
  
  /**
   * Get distance between two geo coordinates on earth
   *
   * @param $lat1 Lat
   *          for point 1
   * @param $lng1 Lng
   *          for point 1
   * @param $lat2 Lat
   *          for point 2
   * @param $lng1 Lng
   *          for point 2
   * @return (float) the distance in kilometer
   *        
   */
  public static function get_distance($lat1, $lng1, $lat2, $lng2) {
    $dlng = self::radians ( $lng2 - $lng1 );
    $dlat = self::radians ( $lat2 - $lat1 );
    $a = pow ( sin ( $dlat / 2 ), 2 ) + cos ( self::radians ( $lat1 ) ) * cos ( self::radians ( $lat2 ) ) * pow ( sin ( $dlng / 2 ), 2 );
    $angle = 2 * atan2 ( sqrt ( $a ), sqrt ( 1 - $a ) );
    
    return $angle * self::RADIUS;
  }
  private static function radians($x) {
    return $x * pi () / 180;
  }
}
?>
@RexDude
Zur Performance deiner aktuellen Lösung habe ich folgendes festgestellt: dein Beispiel benötigt bei mir 8 Sekunden, dabei liefert lediglich drei PLZs.

Ich denke dass ist noch eine größere Baustelle.
Gruß
Gunter

Re: [NEU] OpenGeoDB AddOn

Verfasst: 4. Dez 2014, 23:32
von gupi
Hallo,
nachdem ich recht intensiv in die Details der OpenGeoDB getaucht bin, komme ich immer mehr zu dem Schluss, dass die PLZ Umkreissuche mit akzeptablen Aufwand und brauchbarer Performance nicht zu lösen ist.

Aber es gibt ja durchaus Alternativen die mit den Schwachstellen der PLZ basierenden Suche weit besser umgehen können.
Folgendes Szenario soll die Schwachstellen der PLZ Lösung aufzeigen:
Ich befinde mich irgendwo in einer Flächengemeinde mit der PLZ 50189 (Elsdorf im Rhein-Erftkreis)
Nun suche ich nach einem Sportverein im Umkreis von 10km.
Ich aktiviere nun im (fiktiven) Vereinssuchportal des Erftkreises die GeoDB basierende PLZ Suche.
Das Portal nutzt nun die GeoDB und ermittelt alle PLZs im Umkreis. Anschließend sucht das Portal nach allen Vereinen innerhalb der gefundenen PLZs.
Dabei werden nicht alle Vereine im Umkreis von 10km gefunden, denn hier wird vom der Geo-Location des Hauptortes Elsdorf ausgegangen und auch nur die PLZs ermittelt bei denen der Hauptort im Radius liegt. Die Gemeinde (50169 bis 50171) Kerpen z. B. bleibt so außen vor


So gehts als nicht! Wie aber dann?

Der (kluge) Programmierer des Portals hat für alle Vereine der Erftkreises ja die Adressen in der Datenbank (gehen wir mal von 1000 Adressen aus) und ergänzt diese über die Google-API mit den Geo-Koordinaten (Längen- und Breitengrad).
Wenn jetzt eine PLZ-Anfrage beim Portal ankommt, so sucht das Portal nicht mehr in den riesigen Datenbeständen der GeoDB sondern in der Adressdatenbank mit ihren 1000 Einträgen. Das geht sehr schnell und die Vereine in Kerpen-Sindorf oder in Bergheim-Zieverich usw. werden gefunden!
Erlaubt der "Suchende" gar die Nutzung seines derzeitigen Standorts (GPS des Smartphones) so wird die Suche noch wesentlich genauer. Auch eine alternative Eingabe des Ortsnamens ohne PLZ und eventuell der Straße können so für eine präzise (und vor allem schnelle) Suche genutzt werden. Zumal ja auch nicht jeder Ortsfremde die richtige PLZ kennt. Oder kennt Ihr alle die PLZs von Köln oder Berlin?

Dem Sucher nach einem Nachtclub (natürlich sucht der nicht im Vereinsportal des Erftkreises) ist an einer genauen Entfernungsangabe des nächsten Clubs gelegen und er weiß auch nicht immer welche PLZ er jetzt als Start für die Suche eingeben soll. Aber auch dem Manne muss doch geholfen werden.

Ich bin durchaus für Kritik an meinen Statements zu haben!
Gunter

Re: [NEU] OpenGeoDB AddOn

Verfasst: 5. Dez 2014, 08:38
von NGW
Hallo Gunter,

meines Wissens untersagen es die Google Nutzungsbedingungen die Maps-API für solche Zwecke zu nutzen. Die API darf nur im Zusammenhang mit Google-Maps funktionen genutzt werden und nicht für das füllen eigener Datenbanken.

https://developers.google.com/maps/docu ... =de#Limits

Brauchbare Performance bekommst du hin indem du die opengeoDB in einer DB-Tabelle hinterlegst und deine Datensätze beim Abspeichern mit den GeoDaten von opengeoDB fütterst. Dann musst du bei Suchanfragen nicht den Umweg über die komplette opengeoDB Tabelle (oder Datei) gehen.

Gruß
Nico

Re: [NEU] OpenGeoDB AddOn

Verfasst: 5. Dez 2014, 10:03
von gupi
NGW hat geschrieben:meines Wissens untersagen es die Google Nutzungsbedingungen die Maps-API für solche Zwecke zu nutzen. Die API darf nur im Zusammenhang mit Google-Maps funktionen genutzt werden und nicht für das füllen eigener Datenbanken.
Danke für den Hinweis. Natürlich muss das beachtet und respektiert werden.
Ich habe in meiner Anwendung die Koordinaten gespeichert, da ich auch zu den Adressen eine Karte (GoogleMaps) anzeigen will. Da ich auch nicht nur eine Entfernung als Luftlinie ausgeben sondern auch einen Routenvorschlag machen will, war meine bevorzugte Berechnungsweise mehr oder weniger ein Nebeneffekt".
Momentan sehe ich noch keine Möglichkeit "adressgenaue" Koordinaten aus der GeoDb zu ziehen. Die PLZ Suche ist mir zu ungenau, siehe "Flächengemeinden".

Gunter