Práce se zeměpisnými souřadnicemi

Školení, která pořádám

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 &deg;.

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;
}
?>
Jakub Vrána, Seznámení s oblastí, 10.10.2007, diskuse: 1 (nové: 0)

Diskuse

Darda:

Tady je převod z GPS řetězce na float, který se kromě toho, že vypadá hrozivě, navíc snaží odstranit uživatelovy překlepy:
http://weblog.blackwolf.cz/webdesign/parsovani-gps-souradnic

Vložit komentář

Používejte diakritiku. Vstup se chápe jako čistý text, ale URL budou převedeny na odkazy a PHP kód uzavřený do <?php ?> bude zvýrazněn. Pokud máte dotaz, který nesouvisí s článkem, zkuste raději diskusi o PHP, zde se odpovědi pravděpodobně nedočkáte.

Jméno: URL:

avatar © 2005-2018 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.