Car2Go

Hier ein kleines, feines Skript, das ich verwende, um das nächstgelegene Fahrzeug des Carsharing-Systems Car2Go zu ermitteln:

<?

// eigene Stadt
$myCity = "hamburg";

// eigene Koordinaten, wo wohne ich?
$myLon = ???;
$myLat = ???;

// Umkreis in Abweichung von den angegebenen Koordinaten
$diff = 0.5;

// ID der Display-Variable (String)
$myDisplayId = ???;

$data = @Sys_GetURLContent('http://www.car2go.com/api/v2.0/vehicles?loc=' . $myCity . '&format=json');

if($data)
{
	$foundCar = 'Kein Fahrzeug in der Nähe!';
	
	$obj = json_decode($data);
	
	foreach($obj->placemarks as $thisCar)
	{
	   $coord = json_decode($thisCar->coordinates);
	   $thisLat = $coord[0];
	   $thisLon = $coord[1];
	   
	$thisDiff = (6371 * acos(cos(deg2rad($thisLat)) * cos(deg2rad($myLat)) *
		cos(deg2rad($myLon) - deg2rad($thisLon)) + sin(deg2rad($thisLat)) *
		sin(deg2rad($myLat))));

	   if($thisDiff < $diff)
	   {
	      $diff = $thisDiff;
	      $foundCar = utf8_decode($thisCar->address);
	   }
	}

	SetValue($myDisplayId , $foundCar);
}

?>

Man kann das sicherlich noch erweitern; Toll wäre z.B. ein Feature, um Reservierungen durchzuführen. Das geht aber wohl nur mit der 3.0er API, die einige nervige Nachteile hat (muss registriert sein, Nutzergebunden, Erlaubnis des Nutzers muss regelmäßig erneuert werden etc.). Für die reine Anzeige ist die 2.0er einfach besser geeignet, weil unkompliziert.

Pythagoras würde sich im Grab umdrehen :wink:

Den Abstand im einzelnen Car2Go Geschäftsgebiet kann man nach Pythagoras ausrechnen. Die notwendige Korrektur dafür , dass die Längengrade mit höheren Breitengraden immer kürzer werden, macht für Hamburg schon etwa 66 km Längengrad zu etwa 111 km Breitengrad aus und wäre für jede Stadt, die merklich auf einem anderen Breitengrad liegt, anders. Daher einfach die überall gültige Großkreisberechnung:

$Abstand=(6371 * ACOS(COS(deg2rad($lat1)) * COS(deg2rad($lat2)) * COS(deg2rad($lon2) - deg2rad($lon1)) + SIN(deg2rad($lat1)) * SIN(deg2rad($lat2))));

Sowa Ähnliches hab ich auch grad gedacht… :smiley:

@socke:
Mit dem Schnipsel von Rolf kannst du direkt die Entfernung berechnen (Luftlinie) Das ist allemal genauer als deine empirischer Vergleich.

Mit deiner Formel werden Punkte die Nordöstlich, südöstlich, südwestlich und nordwestlich von deinem Standpunkt liegen extrem benachteiligt. Oder anders: Wenn für dich die kürzeste Strecke nach Rio über New York führt hat Rolf nen Direktflug gebucht.

Gruß,

Toni

:o

Ja, was soll ich sagen? Da habe ich mich wohl von der Prämisse „whatever works“ leiten lassen. Dass das so nicht optimal gelöst ist, ist mir gar nicht in den Sinn gekommen, obwohl es mir jetzt natürlich einleuchtet.

Euer Vorschlag ist natürlich ungleich eleganter. Funktioniert hat es in der Praxis allerdings auch schon hinreichend gut, jedenfalls lag das Skript mit der „gefühlten“ Nähe der Fahrzeuge eigentlich immer richtig. Aber vielleicht wird es ja noch besser jetzt. Ich aktualisiere mal den Code oben.

Danke für die konstruktive Kritik!