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

Wir haben in letzter Zeit festgestellt, dass die Kommunikation via Slack viel schneller und zielführender ist als ein Beitrag im Forum. Aufgrund der neuen und besseren Möglichkeiten der Kommunikation haben wir uns entschlossen das Forum nur noch als Archiv zur Verfügung zu stellen. Somit bleibt es weiterhin möglich hier nach Lösungen zu suchen. Neue Beiträge können nicht mehr erstellt werden.

Wir empfehlen, für deine Fragen/Probleme Slack zu nutzen. Dort sind viele kompetente Benutzer aktiv und beantworten jegliche Fragen, gerne auch von REDAXO-Anfängern! Slack wird von uns sehr intensiv und meistens "rund um die Uhr" benutzt :-)
Selbst einladen kannst Du dich hier: https://redaxo.org/slack/
Benutzeravatar
RexDude
Beiträge: 2543
Registriert: 22. Apr 2010, 11:24

[NEU] OpenGeoDB AddOn

25. Okt 2014, 16:39

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

derkrebs
Beiträge: 149
Registriert: 4. Okt 2011, 17:27

Re: [NEU] OpenGeoDB AddOn

19. Nov 2014, 16:19

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

Benutzeravatar
RexDude
Beiträge: 2543
Registriert: 22. Apr 2010, 11:24

Re: [NEU] OpenGeoDB AddOn

19. Nov 2014, 23:06

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.

gupi
Beiträge: 286
Registriert: 20. Nov 2008, 13:49
Wohnort: Elsdorf/Rheinland

Re: [NEU] OpenGeoDB AddOn

28. Nov 2014, 21:17

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
read the manual first

gupi
Beiträge: 286
Registriert: 20. Nov 2008, 13:49
Wohnort: Elsdorf/Rheinland

Re: [NEU] OpenGeoDB AddOn

4. Dez 2014, 23:32

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
read the manual first

NGW
Beiträge: 132
Registriert: 1. Mär 2011, 09:12
Kontaktdaten: Website

Re: [NEU] OpenGeoDB AddOn

5. Dez 2014, 08:38

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

gupi
Beiträge: 286
Registriert: 20. Nov 2008, 13:49
Wohnort: Elsdorf/Rheinland

Re: [NEU] OpenGeoDB AddOn

5. Dez 2014, 10:03

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
read the manual first

Zurück zu „Allgemeines [R4]“