8. srpna 2008

Převod WGS na DD a zpět v php

Nedávno jsem potřeboval převádět WGS - tedy obvyklý a zažitý zápis zeměpisné šířky a zeměpisné délky na takzvaný Decimal Degrees - zkráceně DD - který používá Google ve svém Google api - například ve funkci - GLatLng.

DD není nic jiného než převedené zeměpisné hodiny ::M, minuty a sekundy na jedno číslo v desítkové soustavě. Zeměpisné hodiny ::M se nechávají tak jak jsou k nim se přepočnou z šedesátkové soustavy převedené minuty a k nim se připočtnou z 3600tkové soustavy zeměpisné sekundy (včetně desetiných míst. Dále jih a západ prezentují záporné číslo a sever a východ kladné.)

function WGStoDD($x, $y) {
    //Decimal Degrees = Degrees + minutes/60 + seconds/3600
        $x1 = explode("°", $x);
        $y1 = explode("°", $y);
        $x2 = explode("'", $x1[1]);
        $y2 = explode("'", $y1[1]);
        $x3 = explode('"', $x2[1]);
        $y3 = explode('"', $y2[1]);
        if($x3[1] == "S") { $lat = "-"; } else { $lat = "+"; }
        if($y3[1] == "W") { $lon = "-"; } else { $lon = "+"; }
        $allx = $x1[0] +$x2[0]/60 +$x3[0]/3600;
        $ally = $y1[0] +$y2[0]/60 +$y3[0]/3600;
        return ($lat .$allx ."/" .$lon .$ally);
}

A zpět to funguje opačně:

function DDtoWGS($x, $y) {
    $x1 = explode(".", $x); //$x1[0] = hodiny
    $y1 = explode(".", $y); //$y1[0] = hodiny
    if($x1[0] < 0) { $lat = "S"; } else { $lat = "N"; }
    if($y1[0] < 0) { $lon = "W"; } else { $lon = "E"; }
    $x2 = "0." .$x1[1] * 60;
    $y2 = "0." .$y1[1] * 60;
    $x3 = explode(".", $x2); //$x3[0] = minuty
    $y3 = explode(".", $y2); //$y3[0] = minuty
    $x3[3] = ('0.'.$x3[1])*100;
    $y3[3] = ('0.'.$y3[1])*100;
    $x4 = round(($x3[3]-(($x3[3]%60)))*600000)/10000;
    $y4 = round(($y3[3]-(($y3[3]%60)))*600000)/10000;
    return ($x1[0] ."°" .floor($x3[3]) ."'" .$x4 .'"' .$lat .'/' .$y1[0] ."°" .floor($y3[3]) ."'" .$y4 .'"' .$lon);
}

Použití:

        $zemepisna_sirka = "48°58'28.276\"N"; //bacha na escape znak
        $zemepisna_delka = "14°28'27.926\"E"; //bacha na escape znak
        $vysl = explode ('/', WGStoDD ($zemepisna_sirka, $zemepisna_delka));
        $vysl2 = explode ('/', DDtoWGS ($vysl[0], $vysl[1]));
        echo 'Vstup: ' .$zemepisna_sirka .', ' .$zemepisna_delka .'| ';
        echo 'VystupDD: ' .$vysl[0] .', ' .$vysl[1] .''| ';
        echo 'VystupWGS: ' .$vysl2[0] .', ' .$vysl2[1];

Tak snad se to bude někomu hodit...

1 komentář:

Anonymní řekl(a)...

kód se hodí, díky moc :)