Berechnung der zu fahrenden Distanz zwischen zwei Orten

7 04 2012

Bei der Punkkonzerte Datenbank setze ich eine Umkreissuche ein. Hierzu verwende ich die Daten der OpenGeoDB. So ist es möglich, nur nach Konzerten zu suchen, die in einem Umkreis von beispielsweise 50 km von meinem Heimatort stattfinden. Schön und gut, nur erfolgt diese Berechnung immer nach der Luftlinie, also dem kürzesten Weg von A nach B. Hier zeigt sich jedoch aufgrund der Straßenführung teilweise eine hohe Diskrepanz zur tatsächlich zu fahrenden Strecke.

Glücklicherweise stellen uns aktuelle Online-Routenplaner ihre Daten zur Berechnung des Straßen-Weges mittels einer API zur Verfügung. Freie Daten habe ich hierzu leider noch keine finden können. Die OpenStreetMap stellt ihre Daten zwar kostenfrei zum Download zur Verfügung, doch für ein paar Abfragen lohnt es erstmal nicht, sich gigabyteweise Daten in die eigene Datenbank zu pumpen.

Die Lizenzbedingungen der Google Maps sind recht verwirrend, dürften aber so zu verstehen sein, dass man die Daten nur in Verbindung mit der Anzeige einer Karte nutzen darf. Da ich lediglich die Distanz erhalten möchte und somit keine Verwendung für eine Karte habe, nutze ich für dieses Beispiel die Konkurrenz von Microsoft, Bing Maps.

Zunächst besorgen wir uns eine Windows Live ID im Bing Maps Account Center. Hier können wir unsere eigene E-Mail Adresse registrieren oder wir legen uns ein Hotmail Postfach an. Sind wir nun im Besitz eines Windows Live Zugangs, müssen wir uns nun den Account für die API erstellen. Sobald dies geschehen ist, finden wir im Menü unter „Create or view keys“ endlich die Möglichkeit, unseren Key zu erzeugen. Heraus kommt ein 64stelliger String, der so aussehen sollte (Beispiel-Key, zum Testen muss ein korrekter Key verwendet werden):
eN_U1StXBLh5N5mreI7RtdNXBS0_Ju9mclnMRNoNGyVkNeS7RcYRwVcP9NMCZMlS

Um nun eine Strecke von A nach B zu berechnen, benötigen wir nur noch die folgende URL:
http://dev.virtualearth.net/REST/v1/Routes?wp.1=%5BWegpunkt 1]&wp.2=[Wegpunkt 2]&key=[API Key]

Nehmen wir nun an, wir möchten von Gschlachtenbretzingen nach Michelbach an der Bilz fahren. Testen wir doch einfach einmal diese URL:
http://dev.virtualearth.net/REST/v1/Routes?wp.1=Gschlachtenbretzingen&wp.2=Michelbach an der Bilz-Gschlachtenbretzingen&key=eN_U1StXBLh5N5mreI7RtdNXBS0_Ju9mclnMRNoNGyVkNeS7RcYRwVcP9NMCZMlS

Das liefert uns einen riesigen Schwulst an Informationen im JSON Format. Irgendwo ziemlich am Ende versteckt sich die von uns gewünschte Information, die uns sagt, dass die travelDistance 3.158 km beträgt. Zwar ist das zurückgelieferte Format prädestiniert für die Weiterverarbeitung per JavaScript, doch wir möchten diese Informationen jetzt lieber im PHP haben, beispielsweise um diese gleich weiterzuverarbeiten.

<?php

// Die URL zum Dienst
$url = 'http://dev.virtualearth.net/REST/v1/Routes';

// Unser API Key
$key = 'eN_U1StXBLh5N5mreI7RtdNXBS0_Ju9mclnMRNoNGyVkNeS7RcYRwVcP9NMCZMlS';

// Alle Wegpunkte in einem Array. Koennen bis zu 25 sein. Es werden hier 
// verschiedene Moeglichkeiten der Angabe gezeigt
$a_wp = array(
	'Gschlachtenbretzingen',
	'Michelbach an der Bilz, BW, Deutschland',
	'74538 Rosengarten'
);

// Wie viele Wegpunkte haben wir im Array?
$anz_wp = count($a_wp);

// Erweitern der URL um die Wegpunkte
$url = $url.'?';
for($i = 0; $i < $anz_wp; $i++){
	$url .= 'wp.'.($i+1).'='.urlencode($a_wp[$i]).'&';
}

// Nun noch den API Key an die URL anhaengen
$url .= 'key='.$key;

// Wir holen uns die Daten vom Bing Server
$json_datei = file_get_contents($url);

// Der Server liefert die Daten im JSON Format, das ist eigentlich fuer
// Javascript gedacht. Deshalb muessen wir dieses umwandeln
$daten = json_decode($json_datei);

// Pruefen, ob wir die Daten auch korrekt erhalten haben
if ($daten->{'authenticationResultCode'} == 'ValidCredentials'){
	// Formatiere die Strecke
	$strecke =  number_format($daten->{'resourceSets'}[0]->{'resources'}[0]->{'travelDistance'}, 1, ',' , '.');
	// Formatiere die Dauer fuer die Fahrt
	$dauer = number_format(ceil($daten->{'resourceSets'}[0]->{'resources'}[0]->{'travelDuration'} / 60), 0, ',', '.');

	// Ausgabe unserer Informationen
	echo '<p>Die Strecke ';
	for($i = 0; $i < $anz_wp; $i++){
		echo $a_wp[$i];
		if($i+1 < $anz_wp) echo ' -> ';
	}
	echo ' beträgt '.$strecke.' Kilometer. Die Fahrt dürfte ohne Stau etwa '.$dauer.' Minuten dauern.</p>';
}

// Testausgabe mit allen erhaltenen Daten vom Bing Server zur Info
echo '<hr />';
echo '<p>Die zusammengesetzte URL: <a href="'.$url.'">'.$url.'</a></p>';
echo '<pre>';
print_r($daten);
echo '</pre>';

?>

Die Ausgabe sieht in diesem Fall wie folgt aus. In unserem Ergebnis sind noch viele weitere interessante Informationen versteckt. Ein genauerer Blick in die $daten kann sich also durchaus lohnen.

Die Strecke Gschlachtenbretzingen -> Michelbach an der Bilz, BW, Deutschland -> 74538 Rosengarten beträgt 12,1 Kilometer.
Die Fahrt dürfte ohne Stau etwa 17 Minuten dauern.
Advertisements

Aktionen

Information

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s




%d Bloggern gefällt das: