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