[PHP,MySQL] Orte aus Datenbank geokodieren

Für ein Projekt war es nötig, eine Geokodierung vorhandener Daten von Orten inkl. Adresse durchzuführen.
Die erste Idee für mich war es, Google Maps dafür einzusetzen. Hier braucht man nur für die Geokodierung sogar kein Javascript einzusetzen, sondern
man kann dies direkt mit PHP und natürlich MySQL erledigen.

Ich setze an dieser Stelle eine erfolgreiche Verbindung per mysql_connect() zur MySQL-Datenbank voraus. Außerdem benötigt ihr einen Google Maps-API Key, den ihr hier erhaltet.
Wie ich feststellen musste, ist dieser IP- bzw. Domainabhängig, d.h. er funktioniert nur unter der IP/Domain, die ihr bei der Anmeldung des Keys angegeben hat.

Um schön modular und nicht reduntant zu arbeiten habe ich 2 Funktionen geschrieben.
Eine dient für die Geokodierung eines Ortes geocodeOrt($adresse, $orts_id) , die andere itteriert durch alle in der Datenbank vorhandenen Orte namens alleOrte() und übergibt an geocodeOrt($adresse, $orts_id) die Parameter $adresse bestehend aus Straße, Hausnummer, PLZ , Ort und die $orts_id, was die ID des geokodiertem Ort ist.

Funktion alleOrte():

function alleOrte() {
 $query_alleOrte = "SELECT orts_id as id, concat(strasse,',',plz,' ',ort) as adresse FROM orte";
 $query_alleOrte_result = mysql_query($query_alleOrte);

 while ($row = mysql_fetch_array($query_alleOrte_result)) {
  geocodeOrt($row['adresse'], $row['id']);
 }
}

Und nun die spannendere Funktion geocodeOrt($adresse, $orts_id):

function geocodeOrt($adresse, $id) {
 define("MAPS_HOST", "maps.google.com");
 define("KEY", KEY); // hier euren Key als String eintragen

 $delay = 0;
 $base_url = "http://" . MAPS_HOST . "/maps/geo?output=xml" . "&key=" . KEY;
 $geocode_pending = true;
 while ($geocode_pending) {
  $request_url = $base_url . "&q=" . urlencode($adresse);
  $xml = simplexml_load_file($request_url) or die("url not loading");

  $status = $xml->Response->Status->code;
  if (strcmp($status, "200") == 0) {
   // Successful geocode
   $geocode_pending = false;
   $coordinates = $xml->Response->Placemark->Point->coordinates;
   $coordinatesSplit = split(",", $coordinates);
   // Format: Laenge, Breite, Hoehe
   $breite = $coordinatesSplit[1];
   $laenge = $coordinatesSplit[0];

   $query_update = "UPDATE orte
   SET laengengrad = '$laenge',
   breitengrad = '$breite'
   WHERE orts_id = '$id'";

   $update_result = mysql_query($query_update);
   if (!$update_result) {
    die("Invalid query: " . mysql_error());
   }
 } else if (strcmp($status, "620") == 0) {
  // sent geocodes too fast
  $delay += 100000;
 } else {
   // failure to geocode
   $geocode_pending = false;
   echo "Address " . $adresse . " failed to geocoded. ";
   echo "Received status " . $status . "\n";
  }
  usleep($delay);
 }
}

Da die Funktion geocodeOrt($adresse, $id) seperat ist, könnt ihr nun auch praktisch diese Funktion aufrufen, wenn in eurem z.B. CMS einen neuen Ort anlegt und direkt dann die Geokodierung durchführen möchtet.
So braucht ihr nicht wieder komplett alle Orte neu geokodieren zu lassen.

Ich hoffe, euch ist nun einiges klarer damit geworden und ich konnte euch helfen.

Advertisements
Veröffentlicht in PHP. Schlagwörter: , , , , , , . Leave a Comment »

[PHP,MySQL] Datumsformate

Bei Interaktionen von Datumsformaten zwischen PHP und MySQL kann man nicht ohne weiteres direkt aus der Datenbank auslesen und ausgeben. Genau das gleiche Problem gilt auch für die andere Richtung.
Während das Format „date“ und „datetime“ in MySQL fix sind, kann man in PHP bequem sich die Ausgabe des Datums aussuchen. Folgende Zeilen geben in PHP das für MySQL nötige Format aus:

$heute_datetime = date("Y-m-d H:i:s"); // Mit Uhrzeit
$heute_date = date("Y-m-d"); // Ohne Uhrzeit

Wird allerdings aus MySQL ausgelesen, muss man diesen Wert allerdings in das deutsche Format umwandeln:

$datum = explode("-",$wert_aus_db);
$datum = $datum[2].'.'.$datum[1].'.'.$datum[0]; // Nur Datum ohne Uhrzeit

Ich hoffe, ich konnte euch bei diesem Problem helfen.

Veröffentlicht in PHP. Schlagwörter: , , , . 1 Comment »

[MySQL,PHP] Probleme mit Umlauten

Beruflich entwickele ich zur Zeit ein Web-Projekt mit PHP, MySQL und ExtJS auf einem iMac mit MAMP, das Mac-Pendant zu XAMPP.

Hier habe ich ein interessantes Umlaute-Problem, welches ich nicht sofort lösen konnte.
Umlaute wurden erst nicht richtig vom JavaScript zur Serverseite (PHP) geschickt und anschließend kamen auch Umlaute nicht richtig vom DBMS MySQL zurück.

Die Lösung für dieses Problem ist allerdings eigenartig:

	mysql_query('set character set utf8;');

Dieser Code-Schnipsel muss nach dem mysql_connect() eingefügt werden und sorgt somit, dass wirklich auch immer per UTF8 übertragen bzw. erzwungen wird.

Weitere Möglichkeiten um Probleme mit Umlauten zu lösen:

header('content-type: text/html; charset=UTF-8');

(am Besten direkt am Anfang nach dem <? – Tag)

UND/ODER

<meta http-equiv=„Content-Type“ content=„text/html; charset=UTF-8″ />

(oben innerhalb des HEAD-Tags einer HTML/PHP-Seite einbinden)

Natürlich ist es auch empfehlenswert, die erstellten Dateien direkt im UTF8-Format abzuspeichern.
Notepad++, mein Favorit in einer Windows-Umgebung, kann das zum Beispiel sehr fix und ist kinderleicht einzustellen.

Weiterhin sehr hilfreich und manchmal sogar notwendig ist es besonders auch in JavaScript (nicht nur), wenn man Umlaute HTML-codiert ausgibt oder umschreibt.
Dazu hilft folgende Tabelle:

ä / Ä &auml; / &Auml;
ü / Ü &uuml; / &Uuml;
ö / Ö &ouml; / &Ouml;
ß &szlig;

Man sieht, es ist nicht schwer sich den Aufbau zu merken: Erst ein „&“ (Ampersand), dann vom Umlaut der normale Laut und danach ein „uml;“ .
Mehr Kodierungen gibt es bei SELFHTML.

Veröffentlicht in MySQL. Schlagwörter: , , . Leave a Comment »