Pasidaryk pats žemėlapius Garminui

Posted: 2022-01-06 in Pezalai

Šiuo metu mano vienintelis turimas Garmin įrenginys galintis rodyti žemėlapius yra mano sportinis laikrodis Forerunner 945. Nepaisant mažo ekrano aš labai pamėgau būtent šitą savybę. Ir, be abejo, panorau turėti laikrodyje tokius žemėlapius, kokių norisi man. Perspėjimas: čia toks mega įrašas, gal net keliom dienom skaitymo 🙂

Tiesą sakant, pats pirmas mano pirkinys po laikrodžio buvo Lietuvos Topo Offroad žemėlapis, gaminamas, jei neklysu, UAB Fedingas. Bent jau kai jiems į supportą rašinėjau su užknisančiais klausimais, atsakinėjo labai mielai ir informatyviai.

Kodėl aš tą žemėlapį pirkau? Ogi dėl miško keliukų, kuriais man patinka bėgioti. Arba gal patiko, nes šiuo metu į mišką bėgioti išsiruošiu rečiau, dažniau išminu su vienaračiu.

Be abejo, nėra tobulų žemėlapių. Topo Offroad turi krūvą pasenusios informacijos ir yra retokai atnaujinamas. Štai kad ir dabar neseniai išėjo atnaujinimas į 4.1 versiją, pusantrų metų po to, kai įsigijau 4.0 versiją. Ir ką – tarp Vilemų plento ir Ežerėlio vis dar nėra naujai nuasfaltuoto kelio. Kuris ten irgi jau daugiau, nei metai.

Aišku, seni miško keliukai dažnai nesikeičia, topografinės ir batimetrinės linijos taip pat. Tačiau Topo Offroad žemėlapis visai netinkamas turistavimui ar valkiojimuisi mieste: tiek dėl to, kad jame mažai POI, tiek dėl to, kad mieste daug pokyčių ir takučių, kurie tokiam žemėlapiui „neįdomūs“.

O štai OpenStreetMap ypač tinka turistavimui būtent dėl to, kad ten pilna visokių turistinių ir kitų atrakcijų, miestuose sužymėti takučiai tarp daugiabučių ir netgi kai kur daugiabučių laiptinės. Miškuose, tiesa, liūdesėlis, bet kiek tas nuo manęs priklauso, pats irgi stengiuosi papildyti OSM savo pasivalkiojimų rezultatais. Štai vieno tokio savaitgalinio pasivalkiojimo rezultatas papildant miško žemėlapį (kairėje prieš, dešinėje po):

Yra daugybė įvairių paslaugų tiekėjų, kurie gamina Garmin žemėlapius iš OpenStreetMap. Man labai patiko garmin.openstreetmap.nl žemėlapiai ir būtent „Generic New“ stilius su ryškiomis spalvomis. Išbandžiau ir frikart.no bei opentopomap.org žemėlapius. Bet nė vienas man neprilipo. Yra ir lietuviškas projektas garmin.openmap.lt, bet jo stilius toks negražus, kad man visai nepatiko.

Todėl, blė, pradėjau iš man patikusių stilių lipdytis man pačiam mielą žemėlapį. Radau dar vieną pačiuožusį čeką, kuris frikart.no pavyzdžiu pasitobulino žemėlapio stilius, kad žemėlapiuose būtų išryškinti spalvoti žygių ir pažintinių takų maršrutai – aš su šituo jau atvargau behakindamas Locus Map žemėlapius. Į laikrodį aš dažniausiai iš anksto pasiruošiu GPX maršrutus, kuriais paskui laikrodis veda. Bet visai gerai būtų ir be to, tiesiog matant žemėlapyje spalvotą liniją, kuria galima sekti. Ši mano svajonė buvo pati didžiausia ir man ją pavyko įgyvendinti.

Kaip darytis Garmin žemėlapius?

Pirmiausia iš geofabrik.de parsitempiam naujausią Lietuvos žemėlapį PBF formatu (tiksliau OSM/PBF). Paskui mokomės ir graužiam dokumentaciją apie mkgmap – atviro kodo projektą, kuris iš OSM gamina senojo pavyzdžio Garmin IMG žemėlapius.

Pirmas dalykas – reikia PBF failą sukapoti gabaliukais, tam reikia kapojimo programos. Kapoti galima įvairiai, bet maksimalus dydis yra kažkur apie 3200000 žemėlapio taškų.

Antras dalykas, su kuriuo baisiai daug vargau ir vis nesupratau, ką darau ne taip… parametrų eilės tvarka. mkgmap yra viena iš tų retų programų, kurioms paduota parametrų eilės tvarka turi įtakos. Aš paprastai nurodydavau pirma, kokius žemėlapius surinkti, tada parametrus, tada rezultato failus. Ir gaudavosi nesąmonė. Pasirodo, reikia pirmiausia surašyti visus parametrus, o tik paskui pradinius OSM žemėlapių failus…

Tad reikia prisirašyti krūvą parametrų mkgmap programai, kad ji sugeneruotų žemėlapį su norimom savybėm: galimybe sudarinėti maršrutus, sudėlioti punktus prie tam tikrų objektų ir… ten gali velnias koją nusilaužti.

Trečias dalykas – pasidaryti savo stilius (tiksliau, pasikoreguoti kokį nors pagal dūšią artimą stilių rinkinį). Kai jau generavimas maždaug veikia 🙂 OSM turi savo struktūrą, kuri yra gan paprasta: taškai ir linijos iš taškų su visokiais parametrais. Na, dar ryšiai, kurie kiek sudėtingesni. Garmin tuo tarpu yra binarinis formatas, turintis visokiems objektams skaitmeninius kodus. Tad stiliai yra failai, kuriuose surašyta, kaip tam tikras OSM taškų/linijų/poligonų žymes paversti atitinkamais ar panašiais Garmin objektais. Gerai yra tas, aišku, kad mkgmap komplekte turi pavyzdinių stilių ir apie juos paskaičius dokumentaciją viskas po biškį nugula į vietas. Bet dar yra gerai ir OSM žymėse orientuotis…

O štai ketvirtas dalykas yra grožis. T.y. specialus failas, kuris Garmin įrenginiui pasako, kaip kokius objektus vaizduoti. Kad mišką piešti žaliai, o ne mėlynai – nebent norisi mėlynai. Kokią piktogramą rodyti prie kokios nors atrakcijos. Kaip vaizduoti stambius kelius ir miško keliūkščius. Ir kaip išryškinti pažintinių takų ar žygių maršrutus. Tai vadinamas TYP failas. Jis gali būti sukompiliuojamas iš tekstinio failo su daug ASCII meno šedevrų 🙂 Taip taip, tekstiniame faile piktogramos, poligonų užpildai ir netgi kelių linijos aprašomos XPM formatu – vieno seno ir trenkto linuxoido išmislu, kuris iš esmės ir yra ASCII-Art pavyzdys. Kažkos simboliukas turi spalvą ar yra permatomas ir iš tų simboliukų sudėliojamos piktogramos. Štai pavyzdys kelių Garmin žemėlapių su skirtingais generavimo stiliais ir, be abejo, pritaikytais TYP failais:

Šančiai – OpenTopo
Šančiai – FrikartNo
Šančiai – Darau, blė

Visa tai dabar reikia surankioti į vieną IMG failą ir jį įsikelti į laikrodį. Prieš tai pratestuoti su QMapShack ar Garmin BaseCamp. Uch.

Šiek tiek daugiau apie grožį

Yra kelios programos TYP failų tvarkymui/redagavimui. Kadangi išeitinis failas yra tekstinis, galima apsieiti visai be tų programų ir viską ASCII menu susipaišyt, po to su mkgmap susikompiliuoti į TYP failą.

Pora subtilybių. Piktogramose permatomumą galima užduoti su spalva none, arba su normalia spalva, bet permatomumo lygiu alpha=15. Su alpha galima daugiau permatomumo lygių pasidaryti, kas yra visai faina.

Piktogramos pavyzdys su none:

[_point]
Type=0x066
SubType=0x14
;GRMN_TYPE: Geographical Named Points of Interest - Land Related/ROCK/Rock/Non NT, NT
String1=0x04,Rock
ExtendedLabels=N
dayxpm="5 3 2 1" colormode=16
"$ c #390000"
"% c none"
"%%$%%"
"%$$$%"
"$$$$$"
;12345
[end]

Su alpha:

[_point]
Type=0x066
SubType=0x0f
;GRMN_TYPE: //
String1=0x04,Barrier
ExtendedLabels=N
dayxpm="16 16 3 1" Colormode=32
"$ c #000000"  alpha=15
"% c #FFFFFF"  alpha=0
". c #000000"  alpha=0
"$$$$$$$$$%%%%$$$"
"$$$$$$$$%%%%%%$$"
"$$$$$$$$%%..%%$$"
"$%%%%%%%%%..%%%$"
"%%%%%%%%%..%%%%%"
"%%............%%"
"%%............%%"
"%%%%%%%..%%%%%%%"
"%%%%%%%..%%%%%%%"
"%%............%%"
"%%............%%"
"%%%%%..%%%%%%%%%"
"$%%%..%%%%%%%%%$"
"$$%%..%%$$$$$$$$"
"$$%%%%%%$$$$$$$$"
"$$$%%%%$$$$$$$$$"
;1234567890123456
[end]

Piktogramoms aš pasirinkau naudoti alpha. Pastebėjau, kad jeigu yra daugiau, nei viena spalva (plius permatoma), Garmin BaseCamp ir laikrodis kartais „supainioja“ piktogramų spalvas. Naudojant alpha to niekada nebūna, rodo viską puikiai.

Laikrodžio subtilybės ir sluoksniai

Garmin žemėlapiai yra sluoksniniai. Pats IMG failas yra ne šiaip sau su tokiu plėtiniu – tai yra tarsi failų sistemos atvaizdas. Viduje iš tikro yra failų sistema ir daugybė vidinių failų, įskaitant ir minėtą TYP grožio failą. Skirtinguose failuose guli skirtingo mastelio žemėlapiai. Vieną mastelį įrenginys rodo smarkiai priartinus vaizdą, kitą – nutolinus. Tiesa, tie masteliai yra sąlyginiai. Internetuose vyrauja vienokie aprašymai, man laikrodyje gaunasi visai kitokie.

Su sluoksniais reikalas maždaug toks. mkgmap stilių failuose mes nurodom kokį objektą kokiame priartinimo lygyje rodyti. Aprašyti stilius galima naudojant resolution metriką arba level. resolution atseit atitinka Garmin naudojamą raišką. level tuo tarpu yra mkgmap išmislas, kur kažkokį sluoksnį priskiriam raiškai. Pvz. žemiausias nulinis sluoksnis bus 24-os raiškos. Ar panašiai. Aš stiliuose naudoju sluoksnių (level) numeravimą, nes jis aiškesnis: sluoksniai numeruojami nuo nulinio iki kažkokio, kokio norim. Tuo tarpu raiškos skaičiukai eina ne iš eilės, juose yra tarpai.

Kodėl čia dabar aš apie tuos sluoksnius užsiminiau? Ogi todėl, kad šiuo atveju mažiau yra daugiau. Aš gal ir norėčiau žemėlapį prisigrūsti kuo daugiau visokių objektų, bet tada nutolinus vaizdą jie užgrūda vaizdą, nebesimato paties žemėlapio ir dar kraunasi lėtai. Pvz. mano laikrodyje nulinis sluoksnis yra iki 300 m mastelio. Kai nutolinu iki 500 m, persijungia į pirmą sluoksnį. Laikrodyje 500 m yra tikrai smulku – tad nėra jokios prasmės, sakykim, tokiame mastelyje matyti pastatus ar suoliukus. Į mastelį reaguoja tik linijų ilgiai, bet ne jų storiai ir ne piktogramų dydžiai. Jei piktograma yra 32×32 taškų, ji tokia bus visą laiką, nepaisant mastelio. Jei kelio storis 5 taškai, tai tiek išdidinus žemėlapį, tiek sumažinus jo storis toks ir bus. Šitą su Garmin reikia žinoti. Tad ir galvoti, ką kokiame mastelyje rodyti, kad ekranas neužsikimštų.

Mano vienas iš pirmųjų bandymų. Labai norėjau, kad žemėlapyje būtų rodomi užkardai. Pavyzdinio stiliaus viršuje buvo išvardinti masteliai, pagal juos pasirinkau, kokiuose sluoksniuose tuos užkardus rodyti. Pasirodė, kad mano laikrodis turi savo mastelių struktūrą ir va kas gavosi žemėlapį nutolinus:

Garmin Forerunner 945 su pernelyg detaliu žemėlapiu stambiam mastelyje | Darau, blė

Nesąmonė visiška. Man užkardus užtenka matyti žemėlapyje tik nuliniame sluoksnyje, t.y. kai mastelis yra 300 metrų ir dar „arčiau“. Apskritai, kiek pats radau, mano laikrodis ima informaciją iš skirtingų trijų sluoksnių pagal tokius mastelius (t.y. pagal „liniuotę“ rodomą jo ekrane, nuotraukoje – 800 m):

  • 0: iki 300 m
  • 1: iki 1.2 km
  • 2: iki 5 km

Bet čia išlenda kitas reikalas. Jeigu išimame kokį nors objektą iš tam tikro sluoksnio, tai tada taip – laikrodis ar kitas Garmin įrenginys jo neberodys, kai į tą sluoksnį „pataikysime“. Bet Garmin įrenginiai pagal savo paskirtį kiekvienas dar individualiai ir neprognozuojamai turi savo nuomonę, kokius apskritai objektus rodyti pagal smulkesnius to paties sluoksnio mastelius.

Mano laikrodis tam tikrus objektus rodo iš to paties nulinio sluoksnio, tačiau priartinus tik iki 80 m mastelio. Gan logiška. Tačiau kai kuriuos iš jų norėčiau matyti ir kiek tolėliau nustūmęs mastelį. Ir ką tada daryt? Laikrodis akivaizdžiai pagal savo paskirtį, t.y. turistavimą, bėgiojimą ir pan. rodo objektus pagal kažkokią jame įsiūtą selektyvią logiką. Tuo tarpu kitus rodo bet kokiame mastelyje, jei jie yra tame sluoksnyje.

Yra tam tikri objektų kodai, kurie rodomi per visą mastelį. Kiti – tik ypač priartinus. Kadangi yra „laisvų“ kodų, mes galim kai kuriuos objektus priskirti ne visai jiems priklausantiems kodams, svarbu tik vaizdavimą TYP faile apsirašyti. Pvz., kaip minėjau prie Locus Map, aš mėgstu matyti žemėlapyje kryželius, skulptūras, koplytstulpius, suolelius ir panašias valkiojimosi atrakcijas. Tad kryželių kodą aš tiesiog pasikeičiau į tą, kuris yra rodomas per visą mastelių diapazoną, o ne tik iš visai arti.

Šie kodai, kurie yra rodomi Forerunner 945 (ir, įtariu, Fenix serijoje) yra nuo 0x64 iki 0x67 su visais potipiais. Tuo tarpu iš kitų kodų rinkinių tik tam tikri yra rodomi, tai pavyzdžiui stovyklavietės, informacinės lentos, tualetai. Bet ne visi potipiai iš tų kodų. Taigi jei kažką norisi matyti per visą mastelių diapazoną, lieka naudotis tais kodais, kurie taip ir yra rodomi, net jei tie kodai ne visai atitinka prasmę pagal savo paskirtį.

Informacija apie Garmin objektų kodus čia ir čia.

Detalumas

Ką norite susikrauti į žemėlapį – visiškai jūsų reikalas. Neįdomius objektus points/lines/polygons failuose galima užkomentuoti ir tiek. Aš, kaip jaunas maksimalistas, susikroviau viską, įskaitant pastatus ir medelius.

Kas iš to gaunasi? Gaunasi, aišku, gražus ir smulkus žemėlapis. Bet toks žemėlapis apkrauna laikrodį jį paišant. Man laikrodis su pilna įkrova ilgame žygyje po miestą ištempė apie 10 valandų, ties 10% perjungiau iš žemėlapio ekrano į paprastą. Fone žemėlapis neperpaišomas. Tad yra keli variantai: arba pasidaryti ne tokį detalų žemėlapį (realiai pastatai tikrai nereikalingi, nebent dėl smagumo norisi juos žemėlapyje turėti) arba valkiojantis žemėlapio ekraną įsijungti rečiau: tik tada, kai reikia. Nusistačius kursą laikrodis rodo krypties rodyklę bet kuriame ekrane, galima visai pusėtinai pagal tai orientuotis. Na o bet tačiau – kaip dažnai išsiruošiam pasivalkioti visą dieną? Tikrai kasdien nereikia. Visgi ilgesniems žygiams nedidelis powerbankas nepakenktų. Arba Fenix serijos laikrodis 🙂

Spalvos

Man labai patinka pasteliniai žemėlapiai. Bet ant laikrodžio su jo ekranu tos spalvos pasidaro visos vienodos. Dėl Garmin laikrodžių ciferblatų technologijos jie yra tikras liūdesėlis spalvų vaizdavimui. Kad spalvos atrodytų gražios ant laikrodžio, jos turi būti „antifrizinės“, t.y. smarkiai įkyrios. Tada ant laikrodžio atrodo gan gerai. Dėl to mano susirankiotas „stiliukas“ irgi yra pošlykščiai ryškių spalvų žiūrint per normalų kompiuterio ekraną, bet visai jaukus spoksant į laikrodį.

Kas įdomu, kad laikrodis akivaisdžiai turi savo color space’ą. T.y. jei padarau ekrano nuotrauką būtent pačiame laikrodyje (jo, turi jis tokią funkciją), tai gauti atvaizdai yra dar šlykštesnių spalvų, nei mano paties užkeltas sodrumas:

Debuginimas

Aš sugeneruotus žemėlapius peržiūriu su QMapShack, nes ans gan gerai veikia Linuxe. Kartais dėl visa ko pasižiūriu per Garmin BaseCamp.

QMapShack man su kai kuriais žemėlapiais lūždavo, nors Garmin BaseCamp ar laikrodyje jie veikdavo. Išsiaiškinau, kad taip yra dėl kreivų TYP failų. QMapShack labai jautrus klaidoms TYP failuose. Sužinojau, kad jei TXT failas nesikompiliuoja su mkgmap į TYP failą dėl kokių nors klaidų – nuo tokio QMapShack ir nulūžta. Tad jei pavyksta TXT faile ištaisyti visas klaidas ir sukompiliuoti TYP – veiks gerai ir korektiškai.

Telefone irgi galima naudoti šiuos žemėlapius su OruxMaps, nors kažkodėl anas rodo ne visas piktogramas, kai kurias subjauroja.

Su Garmin BaseCamp galima pasižiūrėti žemėlapius ir anas parodo visus žemėlapio POI – net jei jie neturi piktogramų TYP faile. Garminas standartines ikonėles priskiria. Tuo tarpu QMapShack rodo tik tas, kurios yra TYP faile – griežtai. Defaultinių neturi.

Kas dar gerai su QMapShack – ši programa leidžia on the fly pakeisti TYP failą žemėlapiui. Taigi jei redaguojate piktogramytes ir norisi patikrinti, kaip atrodo – nebūtina kompiliuoti viso žemėlapio. Man tas užtrunka apie 3 minutes, tuo tarpu TYP sukompiliuoja per sekundės dalį. Tad užkrauti perkompiluotą TYP su QMapShack yra tiesiog produktyviau. Deja, jeigu kaitaliojate patį generavimo stilių – linijas, POI ar poligonų strūktūras, žemėlapį perkompiliuoti teks pilnai.

Topografinės linijos

Iš esmės atskira tema. Labai trumpai, tai radau, kaip Lietuvai parsisiųsti vienos kampinės sekundės raiškos topografiją, tada per kelias konvertavimus pasidariau vien iš tų linijų sudarytą PBF failą (vos 5 MB) ir jį kartu su Lietuvos žemėlapio gabaliukais sukompiliuoju į galutinį žemėlapį.

SRTM informaciją tempiausi iš čia. Reikia registracijos. Paskui pagal koordinates reikia susitempti padengtus žemėlapio gabalus ir su phygtmap juos pasikonvertuoti į kokį nors OSM formatą. Tada su osmium-merge sujungti visus tuos gautus failiukus į vieną ir galiausiai su osmosis pasiversti į PBF, kad vietos mažiau užimtų. Kaip ir viskas. Tie kontūrai nesikeičia, tad PBF failą galima daug kartų panaudoti iš naujo generuojantis šviežius žemėlapius. Mano kontūrų failą galite pasiimti iš GitHubo.

Ne pabaiga…

Deja, šita rašliava gavosi ir taip labai ilga bei sudėtinga, be to – iki galo visko neišaiškinanti. Mano Linux skriptukai yra GitHube, galite juos imti ir naudoti, kaip tinkami. Ten matysite: susitempus visus įrankius, valstybių ir jūrų ribas užtenka naudoti skriptukus 03-05: partempti naują žemėlapį, sukapoti jį ir sugeneruoti IMG failą.

Ateityje turiu planų gražiau sutvarkyti generavimo stilius ir išskaidyti juos į mažesnius failiuks, pavyzdžiui, atskirti miestus nuo gamtos, atskirti pastatus ir kitus daiktus, sudėlioti POI pagal kategorijas. Tuomet galutiniam vartotojui (jeigu toks, be abejo, atsiras iš viso) bus galimybė lengviau susikomplektuoti patinkantį žemėlapį. Sakykim, „lengvesnį“ žemėlapį be pastatų ir kitų miesto POI, kad mažiau apkrautų laikrodžio procesorių. Ar panašiai.

Komentarai
  1. PDNamas parašė:

    Šaunus įrašas, motyvavai mane pasidaryt žemėlapius su miškų kvartalinėm į naująjį 7 Fenix’ą. Vienas dalykas ko lyg neradau įraše, ir ką teko išmokti per skausmą, tai kad tarkim jei norėtume pasidaryti Lietuvos ir Latvijos žemėlapį (mano atveju LT ir kvartalinių) tai negalima splitinti atskirai jų. Reikia sumerginti į vieną pbf failą ir tą merged failą splitinti. Kitu atveju jei sušeri skirtingus split failus į mkgmap, tai jie vienas kitą perdengia, ir rodo arba vieną arba kitą. Galvojau gal čia QmapShack bug’as, bet laikrodis elgiasi identiškai. Gal kažkaip splitinant galima nurodyti range, ar kokį prefixą, nes paprastas failų pervadinimas nepadėjo (jie buvo skirtingose direktorijose). Sumerginus viskas suvažiavo puikiai be trūkstamų dalių galutiniam rezultate.

    • Darau, Blė parašė:

      Jo, teisingai, norint sujungti skirtingus žemėlapius būtina prieš tai juos sumerginti. Kiek pamenu, ten problema yra su bounds tagu, ir nors jis teoriškai persineša į sukapotus gabalus, kažkokiu būdu mkgmap „mato“ tik vieną regioną ir nuo jo ima atskaitą.

      Kadangi aš pats darausi žemėlapius kiekvienai valstybei atskirai, tai su šita problema kaip ir nesusiduriu. Yra dar vienas niuansas, kurio neaprašiau: išsikirpus nedidelį regioną laikrodis kartais ignoruoja ypač mažus žemėlapius. Tokie gali būti pvz. vieno kurortinio miesto, į kurį keliauji žinodamas, kad aplink 100 km spinduliu tikrai nesivalkiosi. Nežinau tik, kokia ta riba, tingėjau aiškintis.

      • PDNamas parašė:

        Na man problema pasidarė ne dėl skirtingų valstybių, o kad miškų kvartalinių žemėlapis visai didelis ir teko splitinti. Ir tada gavos, kad žemėlapį kur nors ties Kaunu gražiai nukerpa ir Lietuvos pusė kur Vilnius jau pačio žemėlapio nebėra, nors kvartalines piešia gražiai 🙂

Palikti atsakymą: PDNamas Atšaukti atsakymą

Brukalų kiekiui sumažinti šis tinklalapis naudoja Akismet. Sužinokite, kaip apdorojami Jūsų komentarų duomenys.