Du bist nicht angemeldet. Der Zugriff auf einige Boards wurde daher deaktiviert.

#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  cool .

Offline