FoundTime - doplní čas nálezu podle nejbližšího bodu z prošlých stop v GPX souborech

V diskusi GeoGet a GgStat - pořadí nálezů se ukázalo, že je dobré mít v databázi GeoGetu časy nálezů. To se běžně řeší tak, že se napíšou na začátek logu a GeoGet je odtud při importu získá.
Co však mají dělat ti, co časy nelogovali, nelogují, nebo dokonce logovat nechtějí?

Motto:

Pokusil jsem se zautomatizovat tuto ideu a napsal jsem skript FoundTime pro GeoGet, který metodou geotaggingu prohledá GPX soubory s prošlými stopami, najde v nich nejbližší bod ke keši ze dne nálezu a jeho čas doplní k datu nálezu do databáze GeoGetu.

Na první pohled jednoduché, ale záhy se objevilo několik problémů.

Předpokládám totiž, že kačer je zodpovědný a vždy používá kalendář a hodiny nastavené přesně dle platné legislativy v místě nálezu keše. Ovšem do tracklogů v GPX souborech se ukládá časový údaj zásadně v čase UTC. Pokud chceme z takového záznamu zjistit jaký byl v daném bodě místní čas, musíme zjistit:

  1. jaká tam (tehdy) byla časová zóna
  2. jaká ta zóna má (tehdy měla) vlastnosti, resp. posun oproti UTC (včetně případného letního času)
    Jelikož časové zóny mají hranice často na hranicích států a definice vlastností časových zón se občas mění (i definice států a jejich hranic) nejde o nějaký triviální výpočet, resp. je k němu potřeba velké množství dat. Například až nejnovější GPS Garmin (Oregon) obsahují (aktuální) mapu časových zón a umí automaticky přepočítávat na místní čas.
    Databáze časových zón http://www.twinsun.com/tz/tz-link.htm sice existuje ve formě knihovny pro Deplhi, ale pro nějaké o hodně modernější než je v GeoGetu.
    Složitější úloha s mapou hranice časových zón by možná šla pojmout jako nějaké polygony, ale nejjednodušší je použít webové služby.

Nenašel jsem ovšem žádnou, která by pro zadané GPS souřadnice a (minulý) UTC čas vrátila (tehdejší) místní datum a čas.
Na http://www.geonames.org/export/web-services.html#timezone jsem našel službu pro přepočet souřadnic na časovou zónu (je hned vedle služby, kterou používá skript Elevation). Jen teoretický problém je, že pracuje s aktuálními hranicemi.
Na druhou operaci jsem nenašel webovou službu, ale jen stránku http://www.timezoneconverter.com/cgi-bin/tzc.tzc, která převádí i starší časové údaje mezi velkou nabídkou časových zón.

Druhý problém je, zda lze spolehnout na segmentaci prošlých stop tak, jak je vytváří Garmin. Zda body z „jednoho dne“ jsou v jednoum souboru a jak je vlastně ten „jeden den“ definován. Zdá se, že nikoliv dle UTC času, ale podle místního času (dle nastavení GPS). To je pro naše účely vhodné. Ale nevím, zda na to lze spolehnout. Nezkoušel někdo poblíž půlnoci a poblíž hranice časového pásma (a speciálně mezinárodní datové hranice) přaskakovat tam a zpět (ze dne do dne) a pozorovat, jak se mu ukládají stopy do GPX?

Sestavil jsem skript, který:

  • Zpracuje zadané keše (dle konfigurace všechny, nebo jen vybrané), a z toho jen:
    • nalezené
    • s datem nálezu
    • bez času nálezu (lze vypnout)
  • Pro tyto keše:
    • najde dle dne nálezu příslušný GPX soubor
    • v něm nejbližší bod ke keši resp. finálce
    • pomocí geonames.org najde časovou zónu v daném bodě
    • UTC čas bodu pomocí timezoneconverter.com převede do zjištěné zóny bodu
    • výsledný čas doplní do času nálezu keše
    • a poznamená i do tagu FoundTime (s přesností ne sekundu :wink: a s časovou zónou).

Skript má několik konfiguračních parametrů, zejména adresář s GPX.
U mystery a multi je trochu nesmyslné hledat dle výchozích souřadnic (lze to vypnout), ale pokud jste výchozí bod navštívili, může to být použitelný výsledek. Proto také lze stanovit toleranci blízkosti.
Kromě použití jednodenních GPX souborů, lze zvolit prohledávání všech GPX souborů v adresáři.
Nedávno server geonames.org zavedl nové dostupnější služby pro registrované uživatele (na http://www.geonames.org/login). To lze také zadat do konfigurace.

Zatím jsem se nezabýval automatickou instalací a skript dávám zájemcům k otestování jako přílohu zip v tomto příspěvku. Připomínky jsou vítány. :slight_smile:
Jsem si vědom, že zejména pokročilí uživatelé GeoGetu píší časy do logu, takže tento skript nepotřebují.
Proto jsem jako bonus sestavil skript VisitTime, který pro vybranou keš projde všechny GPX soubory v daném adresáři a vypíše všechny „návštěvy“ tohoto bodu (z každého souboru nanejvýš jednu v zadané toleranci).
Další bonusový skript DeleteFoundTime smaže čas nálezu pokud je stejný jako zaznam o editaci logu ve tvaru např. „This entry was edited by PiTeam on Tuesday, 28 September 2010 at 12:23:25.“, což GeoGet bez rozpaků importuje do času nálezu.

Součástí jsou 4 unity:
Jedna parsuje a prohledává GPX tracklogy.
Druhá provádí převody časů mezi zónami a zjišťuje zónu bodu.
Třetí umožňuje skriptu zapisovat do jeho konfigurace.
Čtvrtá pro stanovení ohraničujícího boxu pro zadané souřadnice a vzdálenost.

Skripty vypadají zajímavě, bohužel ho nevyužiji, protože jsem se naučil si časy zapisovat, ale i přesto přeji hodně úspěchů.

Tenhle plugin vypadá jako velice dobrý pomocník, tak jsem to hned chtěla vyzkoušet. Nějak se mi ho ale nedaří rozchodit.

Mám soubor keší s už vyplněnými přibližnými časy v Geodetu a chtěla jsem zkusit s pomocí pluginu a uloženého GPX logu cesty zpřesnit časy. GPX trasa mi na mapě sedí hezky, takže odchylky by měli být minimální.

Timezone jsem vyplnila - Europa/Prague
GeonamesUserName - prázdné
PozadovanaBlizkost - už jsem zkoušela až 500
Prepisovat - 1

Plugin se rozjede, ale nakonec vypíše: Zjištěn a uložen čas nálezu: 0, Nefunguje mi ani DeleteFoundTime.

Ještě jsem zkoušela si v Geogetu ručně vytvořit tag FoundTime a změnit v nastavení skriptu ChybyDoTagu=1, ale nic mi to do Tagu nezapíše.

Jako poslední možnost, co mě napadla, jsem se zaregistrovala na Geonames a nechala pak Timezone prázdné ale nepomohlo to.

Kde může být chyba?

Celé tohle udělátko má jednu zásadní slabinu… po update nalezených keší z gc.com se logy přepíší a můžeš začít znovu. Jediná správná cesta je zapsat časy nálezu do logu na gc.com

Pockej, geoget vazne prepise pri importu myfinds ty casy, co sem si do nej rucne ulozil?

Chyba může být leckde:

  • žádná keš neprojde výběrem
    pokud projde, zobrazí se v okně GeoGet pracuje… její název a datum, pokud se najde vhodný bod, přepíše se to na blízkost, pak zónu a nalezený datum a čas
    probíhalo to?

  • GPX soubory jsou jiné než jsem čekal
    jsou z Garmina?
    nešlo by jeden malý dát sem jako přílohu nebo mi poslat mailem?

  • chyba při parsování nebo dalším zpracování
    ta by se ale měla nějak zobrazit

Europa/Prague sice správně nebylo (má být Europe/Prague), ale fatálně to nevadí, jen se nepřepočte čas z UTC.

Prosím o kopii celého závěrečného výpisu a díky za beta test. :wink:

Ano. Pokud je v logu něco jako čas, přepíše hodnotu tímto a pokud to tam není, tak to nastavuje na 00:00…

co to pak doplnit přes geocache_visits.txt? :wink:

Podle mých pozorování se honny nemusí ničeho obávat a funguje to dobře.
GeoGet použije čas z nálezového logu jen pokud je v databázi čas 00:00.
Takže jedině půlnoc je zapovězená :wink:

presne tak. casy se pri importu doplnuji jen tehdy, kdyz tam zadne nejsou.

Zkontrolovano, a import HTML listingu cas nalezu nezmeni.

Ano, ověřil jsem si to, nevím jak se mi to včera povedlo. Proto jsem svůj předchozí příspěvek smazal. B)

Jo to by šlo.
Ale gc.com není tak dokonalý jako GeoGet s FoundTime. :wink:
Kromě toho že časové pásmo nepočítá dle místa keše, ale jen z předvolby v profilu, tak neumí aktualizovat staré logy, ale jen vkládat nové.
Takže by se rázem zdvojnásobil počet nálezů. :o
Ale třeba by se to někomu hodilo.

Uděluji mpistorovi 1* za pomoc při rozchození tohohle skriptu i pro moji méně chytrou GPS od Holuxu. :slight_smile:

Ukázalo se, že problém byl v domalovaných:o bodech, které byly bez času. Zodolnil jsem skript, aby ho to nerozházelo.

Když už jsem byl v úpravách XPath dotazu, doplnil jsem i předběžnou filtraci dle časoprostorového kvádru - tedy jak omezujících časů, tak i omezujících souřadnic. S omezením souřadnic je problém okolo pólů (ze čtverců tam jsou trojúhelníky :o) a poblíž 180. poledníku.
Je to pravda trochu teoretický problém, protože na pólech (zatím) žádné keše nejsou.
Použil jsem algoritmus dle http://janmatuschek.de/LatitudeLongitudeBoundingCoordinates (Jan Philip Matuschek).
Lze tak nyní rychleji prohledávat velké GPX (třeba sloučené za celý rok).

Aktuální verze skriptu je v příloze prvního příspěvku.

Musím to vyzkoušet, myšlenka je super. :slight_smile:

Aktuální verze FoundTime i s popisem a automatickým instalátorem je na
http://geoget.ararat.cz/doku.php/user:skript:foundtime