GPS souřadnice udávají zeměpisnou šířku (latitude) a délku (longitude) ve stupních. Principiálně se tedy jedná o dvě desetinná čísla v rozsahu (-180, 180). Souřadnice lze např. zapsat jako lat 50.047506, long 14.454411.
V zájmu zmatení uživatelů a programů se ale často používá též zápis ve stupních a minutách, případně stupních, minutách a vteřinách. Navíc se obvykle nepoužívají záporná čísla, ale uvádí se, zda se jedná o serverní (N, lat > 0) nebo jižní (S, lat <0> 0) nebo západní (W, long < 0) délku. Tentýž údaj lze tedy zapsat jako:
Stupně: 50.047506°N 14.454411°E
Stupně a minuty: 50°2.850360'N 14°27.264660'E
Stupně, minuty a vteřiny: 50°2'51.022"N 14°27'15.880"E
Ale pro nás je tedy nejvhodnější poslední uvedený. Tento formát totiž, mimo jiné, vyhovuje i z hlediska astronavigace.
Počítáme rovněž ve formátu:
Stupně, minuty,vteřiny a destiny vteřin, příklad 50°2'51.022"N 14°27'15.880"E
Otázkou je zda desetiny uvádět na 2 či 3 destinná místa

Dvě by asi mohly stačit.
Citace z ČSN (verze 1997):
7.10 Úhlový stupeň, minuta, vteřina
Mezi číslem a následující značkou se nevynechává mezera.
A pro úplnost informace (a budoucí využití):
Práce se zeměpisnými souřadnicemi
Zeměpisné souřadnice jsou svým charakterem nepřesná data, takže je vhodné je ukládat v datovém typu float. V této podobě se s nimi navíc dobře pracuje, dá se z nich např. vypočítat vzdálenost dvou bodů. Pokud číslo ale chceme prezentovat uživateli, obvykle je lepší místo desetinného čísla použít zápis s minutami a vteřinami. K tomu se dá použít jednoduchá převodní funkce:
Kód: Vybrat vše
?php
/** Převod desetinného čísla na stupně, minuty a vteřiny
* @param float $float stupně vyjádřené desetinným číslem
* @param string $positive řetězec doplněný při kladné hodnotě (např. N nebo E)
* @param string $negative řetězec doplněný při záporné hodnotě (např. S nebo W)
* @return string řetězec ve tvaru s°m'v.vvv"N
* copyright Jakub Vrána, http://php.vrana.cz
*/
function float2gps($float, $positive, $negative) {
$x = abs($float);
$deg = floor($x);
$min_sec = ($x - $deg) * 60;
$min = floor($min_sec);
$sec = ($min_sec - $min) * 60;
return $deg . "°$min'" . number_format($sec, 3) . '"' . ($float >= 0 ? $positive : $negative);
}
/** Převod zeměpisné šířky a délky v desetinném čísle na stupně, minuty a vteřiny
* @param float $lat zeměpisná šířka vyjádřená desetinným číslem
* @param float $lng zeměpisná délka vyjádřená desetinným číslem
* @return string řetězec ve tvaru s°m'v.vvv"N, s°m'v.vvv"E
* copyright Jakub Vrána, http://php.vrana.cz
*/
function floats2gps($lat, $lng) {
return float2gps($lat, "N", "S") . ", " . float2gps($lng, "E", "W");
}
?
Stupně jsou zapsány znakem k tomu určeným. Tento znak je vyjádřený bajty s hodnotou vyšší než 127, proto není $deg přímo součástí vraceného řetězce. Kdyby tomu tak bylo, PHP by hledalo proměnnou $deg°, protože bajty s touto hodnotou jsou v PHP platné v identifikátorech. Ve znakových sadách, které tento znak neobsahují, jde při vypsání do HTML použít entitu °.
Převod opačným směrem – tedy ze stupňů, minut a vteřin na desetinné číslo – je jednoduchý:
Kód: Vybrat vše
?php
/** Převod stupňů, minut a vteřin na desetinné číslo
* @param int $deg stupně
* @param int $min minuty
* @param float [$sec] vteřiny
* @return float stupně vyjádřené desetinným číslem
* copyright Jakub Vrána, http://php.vrana.cz
*/
function gps2float($deg, $min, $sec = 0) {
return $deg + $min/60 + $sec/60/60;
}
?