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:
<?php /** Převod desetinného čísla na stupně, minuty a vteřiny * @param float stupně vyjádřené desetinným číslem * @param string řetězec doplněný při kladné hodnotě (např. N nebo E) * @param string ř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, https://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 zeměpisná šířka vyjádřená desetinným číslem * @param float 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, https://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ý:
<?php /** Převod stupňů, minut a vteřin na desetinné číslo * @param int stupně * @param int minuty * @param float vteřiny * @return float stupně vyjádřené desetinným číslem * @copyright Jakub Vrána, https://php.vrana.cz/ */ function gps2float($deg, $min, $sec = 0) { return $deg + $min/60 + $sec/60/60; } ?>
Diskuse je zrušena z důvodu spamu.