Freitag, 8. Oktober 2010

PLZ Umkreissuche

Eine “PLZ Umkreissuche” erlaubt die Auswahl von Datensätzen innerhalb eines beliebigen Radius um eine gegebene PLZ.

Viele Webseiten benutzen diese Technik um Ihren Benutzer die Möglichkeit zu geben Suchergebnisse nur aus Ihrem näheren Umkreis (z.B. 50 km ) anzeigen zu lassen.

Typische Anwendungsgebiete sind die Filialsuche (Dealer Locator) oder Dating Websites, Immobilienportale, An/Verkauf bzw. Kleinanzeigen und Auktionsportale wie Ebay.

Dazu benötigt man eine Datenbank mit allen Postleitzahlen und den dazugehörigen Geo-Koordinaten (Längengrad / Breitengrad).

Des Weiteren benötigt man ein Script dass die notwendige Berechnung durchführt und die in Frage kommenden Postleitzahlen berechnet.

Die Entfernungsberechnung auf einer Kugeloberfläche (Erde) zwischen 2 Punkten nennt man Orthodromie und erfolgt mittels folgender Formel:

Distance(A,B) = 6371 * ACos( Cos(LatA) * Cos(LatB) * Cos(LngB - LngA) + Sin(LatA) * Sin(LatB) )

Das Ergebnis ist die Entfernung zwischen Punkt A und Punkt B in Kilometer.

Im Folgenden sehen Sie ein auf PHP und MySQL basierendes Script dass diese Berechnung umsetzt:


// Form
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="get">
<input type="text" name="postcode" value="<?php echo $_GET['postcode']; ?>" maxlength="5"/><br />
<input type="text" name="distance" value="<?php echo $_GET['distance']; ?>" maxlength="5"/><br />
<input type="submit" name="Search" value="Search" />
</form>

// PHP-Code

<?php
if(isset($_GET['Search']))
{
$zipcode = $_GET['postcode'];
$distance = $_GET['distance'];

$conn = mysql_connect('127.0.0.1', 'root', '') or die('db connect error: ' . mysql_error());
mysql_select_db('igonow', $conn) or die('could not select database');

$sqlstring = "SELECT * FROM geodb WHERE postcode = '".$zipcode."'";
$result = mysql_query($sqlstring);

$row = mysql_fetch_assoc($result);

$lng = $row["longitude"] / 180 * M_PI;
$lat = $row["latitude"] / 180 * M_PI;

mysql_free_result($result);

$sqlstring2 = "SELECT DISTINCT geodb.postcode,geodb.place,(6367.41*SQRT(2*(1-cos(RADIANS(geodb.latitude))*cos(".$lat.")*(sin(RADIANS(geodb.longitude))*sin(".$lng.")+cos(RADIANS(geodb.longitude))*cos(".$lng."))-sin(RADIANS(geodb.latitude))* sin(".$lat.")))) AS Distance FROM geodb AS geodb WHERE (6367.41*SQRT(2*(1-cos(RADIANS(geodb.latitude))*cos(".$lat.")*(sin(RADIANS(geodb.longitude))*sin(".$lng.")+cos(RADIANS(geodb.longitude))*cos(".$lng."))-sin(RADIANS(geodb.latitude))*sin(".$lat."))) <= '".$distance."') ORDER BY Distance";

$result = mysql_query($sqlstring2) or die('query failed: ' . mysql_error());

$str = "<table width=\"300\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">";
$str .= "<tr>";
$str .= "<th>Postcode</th>";
$str .= "<th>Town</th>";
$str .= "<th>Distance</th>";
$str .= "</tr>";

while ($row = mysql_fetch_array($result, MYSQL_ASSOC))
{
$str .= "<tr><td>".$row["postcode"]."</td><td>".$row["place"]."</td><td>".round($row['Distance'])."km</td></tr>";
}

$str .= "</table>";

mysql_free_result($result);
mysql_close($conn);
echo $str;
}
?>

Die im Script genannte Tabelle ‚geodb’ enthält alle Postleitzahlen aus dem in Frage kommenden Raum (z.b. Deutschland, Österreich, Schweiz) mit mindestens folgenden Datendeldern:

postcode, town, longitude, latitude. D.h. PLZ, Ortschaft, Längengrad, Breitengrad

Für diese Art von PLZ Datenbanken gibt es mehrere Anbieter.

Dieser ist der empfehlenswerteste was die Aktualitaet und die Qualitaet der Daten angeht:

PLZ Umkreissuche

Viel Erfolg!