Umkreissuche anhand Schweizer Postleitzahlen (Tutorial)

(Kopie aus dem vorherigen CMS!)

was habe ich nicht schon alles gelesen betreffend .
die wildesten geschichten. und in wirklichkeit ist alles sehr einfach.
in diesem tutorial verwenden wir die api von map.search.ch.

was wollen wir nach diesem tutorial überhaupt machen können?

  • eine plz eingeben, sowie einen radius in kilometer eingeben und
    dann alle
    plz ausgeben lassen, welche in diesem radiusbereich liegen

1. zuerst benötigen wir eine tabelle mit den schweizer postleitzahlen und deren koordinaten
(siehe diesen beitrag, oder direkter Download des Files mit den Schweizer Städten und deren Koordinaten hier). ich gehe davon aus, dass du ein grundlegendes datenbank-know-how
hast um die tabelle anzulegen.

in meine beispiel heisst die tabelle `plz` in der datenbank `geocode`.

und jetzt gehts schon ans coden (ich möchte hier anmerken dass ich kein php profi bin und
deshalb wohl einiges umständlich, kompliziert und speicheraufwendig programmiert habe.
änderungsvorschläge sind hier äusserst willkommen!).

grundsätzlich benötigen wir lediglich nur ein php (nur SQL geht natürlich auch…) file welches die ganze
logik beinhaltet um die postleitzahl suche mit umkreis zu realisieren.

ich möchte an dieser stelle nicht gross darauf eingehen wie man geotargeting mit einem
kartendienst macht. hierzu folgt demnächst ein weiteres tutorial. jedoch brennt es einigen lesern
unter den fingernägeln wie man eine umkreissuche anhand einer schweizer plz machen kann.
diese frage soll nun quick and dirty beantwortet werden.

 $conn = mysql_connect('localhost', 'geodbuser', 'password')
         or die('db connect error: ' .
    mysql_error());
mysql_select_db('geocode', $conn) or die('could not select database');

nun, als erstes brauchen wir in zwei variabeln die längen (longitude) – und breitengrade (latitude) der
gewählten plz. diese werte holen wir aus der datenbank und hauen sie in zwei variabeln. siehe folgenden code:

 $sqlstring = "SELECT * FROM plz WHERE plz.PLZ like '$zipcode';";
$result = mysql_query($sqlstring) or die('query failed: ' . mysql_error());

$row = mysql_fetch_assoc($result);
$lng = $row['Longitude'];
$lat = $row['Latitude'];
mysql_free_result($result);

$random = rand(100000, 999999);

die fetten ;-) variabeln werden gleich im nächsten schritt verwendet…
$random benötigen wir um eine temporäre tabelle anzulegen, welche später abgefragt
werden kann.

jetzt kommt das paradestück mit der umkreisberechnung welches uns erlaubt die
koordinaten der umliegenden plz zu finden. der findige leser wird bestimmt merken, dass ich eine tabelle anlege.
diese dient dazu, mehrere abfragen gleichzeitig handhaben zu können. einen eleganteren weg ist mir nicht eingefallen.

$q1 = "create table geocode.geo$random engine = myisam
SELECT geocode.plz.plz as 'Zip', (ACOS( (SIN(RADIANS($lat))
       * SIN(RADIANS(latitude)))
       + (COS(RADIANS($lat))
       * COS(RADIANS(geocode.plz.latitude))
       * COS(RADIANS(geocode.plz.longitude) - RADIANS($lng))))
       * '6378.388')  AS distance
      FROM geocode.plz
     WHERE (ACOS( (SIN(RADIANS($lat)) * SIN(RADIANS(geocode.plz.latitude)))
             + (COS(RADIANS($lat))
                * COS(RADIANS(geocode.plz.latitude))
                * COS(RADIANS(geocode.plz.longitude) - RADIANS($lng))))

        * '6378.388') <=
          '$distance'
          order by
          distance asc

          limit 99";

mysql_db_query(geocode, $q1);

erklärung der verwendeten variabeln:
$lng: enthält den längengrad wert der plz von der aus ausgegangen wird.
$lat: dito $lng, jedoch der breitengrad.

$distance:
oberwichtig! diese variable beschreibt den radius für die umkreissuche.
dies ist eine zahl in kilometer!

that’s it! nun kannst du die temporär erstellte tabelle abfragen und diese mit einer anderen
tabelle matchen um die objekte innerhalb der karte darzustellen.

In einem weiteren Teil werde ich dieses Tutorial umbauen, damit alle Schritte detaillierter erklärt werden. Ebenfalls wirst du hier eine Anleitung finden, wie man die gewonnen Daten in eine Karte einbindet.


Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.