Du bist nicht angemeldet. Der Zugriff auf einige Boards wurde daher deaktiviert.
Seiten: 1
#1 08. Januar 2011 01:48
- nhaack
- Server-Pate
- Ort: Bonn
- Registriert: 12. Dezember 2010
- Beiträge: 171
- Webseite
Distanz und Richtung zwischen zwei Coordinaten berechnen
[== distance ==]
//
// Prüfen ob Parameter vorhanden sind, ansonsten Default-Werte
//
// In welchem maßstab soll gerechnet werden (default: Meilen ... siehe weiter unten für andere)
if (isset($params['convert']) AND ($params['convert'] != '')) {
$convert = strtolower($params['convert']);
} else {$convert = 'mi';}
// LATITUDE (Breitengrad) des ersten Ortes
if (isset($params['lat_1']) AND ($params['lat_1'] != '')) {
$lat_1 = (float)$params['lat_1'];
} else {return false;}
// LATITUDE des zweiten Ortes
if (isset($params['lat_2']) AND ($params['lat_2'] != '')) {
$lat_2 = (float)$params['lat_2'];
} else {return false;}
// LONGITUDE (Längengrad) des ersten Ortes
if (isset($params['long_1']) AND ($params['long_1'] != '')) {
$long_1 = (float)$params['long_1'];
} else {return false;}
// LONGITUDE des zweiten Ortes
if (isset($params['long_2']) AND ($params['long_2'] != '')) {
$long_2 = (float)$params['long_2'];
} else {return false;}
$distanz = new StdClass;
//
// Berechnung der Distanz nach "great circle distance" und Ausgabe US Meilen
//
$distanz->strecke = sin(deg2rad($lat_1)) * sin(deg2rad($lat_2)) + cos(deg2rad($lat_1)) * cos(deg2rad($lat_2)) * cos(deg2rad($long_1 - $long_2));
$distanz->strecke = rad2deg(acos($distanz->strecke)) * 69.09;
//
// Optionales Konvertieren in andere Maßstäbe
//
switch($convert) {
case 'km':
$distanz->strecke = $distanz->strecke * 1.609344;
break;
default:
$distanz->strecke = $distanz->strecke;
}
//
// Berechnen der Richtung (360 Grad)
//
$dLon = deg2rad($long_2) - deg2rad($long_1);
$dPhi = log(tan(deg2rad($lat_2) / 2 + pi() / 4) / tan(deg2rad($lat_1) / 2 + pi() / 4));
if(abs($dLon) > pi()) {
if($dLon > 0) {
$dLon = (2 * pi() - $dLon) * -1;
}
else {
$dLon = 2 * pi() + $dLon;
}
}
//Normalisierung des Winkels
$distanz->winkel = (rad2deg(atan2($dLon, $dPhi)) + 360) % 360;
//Kompass Ausgabe
switch(round($distanz->winkel / 45)) {
case 1:
$distanz->kompass = "Nord-Osten";
break;
case 2:
$distanz->kompass = "Osten";
break;
case 3:
$distanz->kompass = "Südosten";
break;
case 4:
$distanz->kompass = "Süden";
break;
case 5:
$distanz->kompass = "Südwesten";
break;
case 6:
$distanz->kompass = "Westen";
break;
case 7:
$distanz->kompass = "Nordwesten";
break;
case 8:
$distanz->kompass = "Norden";
break;
default:
$distanz->kompass = "Norden";
}
//
// Rückgabe des Ergebnis an Smarty
//
$smarty->assign($params['assign'], $distanz);
return;
Anwendung:
[== Template ==]
{ distance
lat_1=50.1
lat_2=52.2
long_1=10.3
long_1=12.4
assign="distanz"
}
<p>Ort 2 liegt {$distanz->strecke|round:0} Meilen im {$distanz->kompass} von Ort 1.</p>
Freue mich wie immer über Feedback, Anregungen und Korrekturen. Die Implementierung als UDT nur als kompakteres Beispiel.
Grüße
Nils
Offline
#2 10. Januar 2011 07:21
- Andynium
- Moderator
- Ort: Dohna / SN / Deutschland
- Registriert: 13. September 2010
- Beiträge: 7.018
- Webseite
Re: Distanz und Richtung zwischen zwei Coordinaten berechnen
Coole Sache - ich glaub, ich muss mich mit dem Wiki ranhalten .
Offline
Seiten: 1