Wykonanie mapy z użyciem filtra [DICTIONARY]

      

        Opisano tu technikę tworzenia mapy zgodnej z formatem img (txt) jaką stosuje przy robieniu mapy przedstawionej na stronie UMP Powiat Kłobucki (arkusz M-34-38). Jest to mapa typowo topograficzna - nastawiona na przedstawienie jak największej ilości użytecznych w nawigacji szczegółów.

        Moim założeniem było max uproszczenie i przyspieszenie pracy nad mapą. Dlatego zajmuje się bezpośrednio tylko level0 (czyli warstwą najniższą o największej ilości szczegółów) i wszystko do niej wrzucam - nie dziele na osobne mapy (reprezentujące osobne typy obiektów) - dzięki temu już na etapie robienia mapy widzę czy obiekty będą ze sobą współgrały itp. Elementy umieszczam według opisu z pliku:

 uklad_elementow_mapy_KSW.txt

Przy czym odnośnie leve0 interesuje mnie głównie typ obiektów - gdyż to ma wpływ na kolejne levele / warstwy. Tak właśnie - wypracowałem odpowiednie grupowanie obiektów według typów i podtypów w level0 aby na podstawie filtru [DICTIONARY] stworzyć kolejne levele / warstwy - w zasadzie kompletną mapę widać dopiero po kompilacji. I tak np. u mnie nie ma jednego typu jezior - w zależności od jego wielkości nadaje im zróżnicowane typy (akurat jest w czym wybierać), potem odpowiednio duże jeziora trafią do wyższych warstw a te mniejsze tam nie trafią - i tak byłyby ledwo widoczne. To samo rzeki - mam trzy typy (nadając małym strumykom typ 0x26 - Intermittent river od razu mogę zadecydować że będą widoczne tylko w level0). Użycie filtra  [DICTIONARY] sprawiło że w level0 obiekty są bardzo przemyślnie utworzone - nic nie jest przypadkowe. Np. ostatnio do grupy dróg gruntowych dodałem typ 0x0016: szlak - trail który trafia też do level1 - wiec już w level0 oceniam co warto dać wyżej i zamiast ścieżce dać typ 0x000a daje jej 0x0016 - ten sam wygląd na ekranie a jakie przyspieszenie pracy nad mapą (a że akurat ten typ trafia na ważniejsze ścieżki często mające status szlaku - posiadającego nazwę - więc wszystko jest zgodne z ideą tego typu. Choć czasami robię wyjątki: zamiast białej plamy w level1 (gdyż typ 0x000a zostaje odfiltrowany w level1) wole nadać typowo polnej ścieżce typ  0x0016 aby tą białą plamę "wymazać" ...)

To tyle odnośnie leve0 ... to co wpływa na wygląd pozostałych warstw mapy projektuje w sekcji [DICTIONARY] - jeśli uznam że czegoś mi brakuje lub jeśli coś dodam i poprawi mi to wygląd mapy jednocześnie jej nie psując/zaciemniając - to po prostu stawiam czerwoną kropeczkę obok danego typu w wybranym level - szybko i bezboleśnie ...

Przejdźmy teraz do szczegółów.
        Aby zmusić cgpsmappera do automatycznego generowania elementów pomiędzy warstwami w zależności od typu, trzeba skorzystać z sekcji [DICTIONARY] - sekcji którą działa jak filtr.

[DICTIONARY]
Level0RGN10=010000000....
(w sumie 255 '0' lub '1')
...

Powyższa linia deklaruje założenie filtru na importowane typy do warstwy 0 dla elementów RGN10, pierwszy znak (tutaj 0) oznacza filtrowanie elementów typu 0x01 (tj, elementy takie nie będą importowane do warstwy 0), kolejny znak (tutaj 1) oznacza, ze elementy typu 0x02 (lub inaczej 2) będą importowane do warstwy 0, następnie mamy same zera - co oznacza że RGN10 o typach od 3 do 255 nie będą importowane do warstwy 0.

               Aby nie bawić się w 0 i 1 bezpośrednio w pliku txt można skorzystać z programu UMP_Edit. Czerwona kropka to '1' a niebieska to '0' - reszta obsługi na wyczucie bo mi się tu nie chce tego opisywać .... dodam tylko że po uruchomieniu programu automatycznie jest wczytywana zawartość pliku: DICTIONARY.txt. Więc w miarę rozbudowywania własnego filtra możną go tam skopiować na stałe. Wynik jest zapisywany domyślnie do pliku: DICTIONARY_out.txt. Można też otworzyć dowolny plik ale zawierający tylko sekcje [DICTIONARY]. Oczywiście po zapisaniu DICTIONARY_out.txt zawartość tego pliku kopiujemy do pliku txt z zawartością mapy. W obecnej wersji program jest na sztywno ograniczony do edycji filtra dla czterech warstw.


Aby poprawnie skorzystać z sekcji [DICTIONARY] należy zaznaczyć, że dany element ma być importowany do innych warstw (a nie tylko do jednej), np.

[RGN40]
Type=4
Label=droga
Levels=3
Data0=...
[END]


Oznacza to, że 'droga' ma zostać zaimportowana do warstw od 0 do 3 włącznie. Ponieważ filtrowanie stosujemy do całej naszej mapy powinniśmy parametr Levels=x nadać wszystkim obiektom w mapie. Można to wykonać na kilka sposobów. W GPSMapEdit zaznaczamy wszystkie obiekty i w menu podręcznym: Modify -> Extended all elements up to level - ustawiamy np. 3, co da w efekcie dla każdego elementu wpis Levels=3.W Programie UMP_Edit jest też "prymitywna" opcja dodania Levels=3 dla każdego obiektu we wczytanym pliku txt. Jeśli zapomnimy o tym Levels=x dla jakiegoś obiektu to mimo że w filtrze jest zdefiniowane że ten typ ma być umieszczany w wyższych warstwach to ostatecznie zostanie umieszczony tylko w leve0.

Mamy nasz plik txt z mapą z ustawionym Levels=x dla każdego obiektu - teraz do tego pliku (zaraz za [IMG ID]) dodajemy zawartość pliku DICTIONARY.txt - czyli następującą sekcje:

[DICTIONARY]
Level0RGN40=111111...
Level1RGN40=111111...
Level2RGN40=111000...
Level3RGN40=111000...

...
[END]

W pliku ump_out.txt umieściłem fragment przykładowej mapy ze wszystkimi informacjami jakie opisano powyżej - beż nich nie ma sensu poddawać plik txt kompilacji w cgpsmapper jeśli chcemy użyć techniki filtrowania.

Niestety GPSMapEdit nie posiada na razie wsparcia dla filtrowania, tak wiec metoda ta raczej pozostaje dla tych, którzy obrabiają dane 'hurtowo' - dla dużych map. Dla małych projektów można ręcznie dla każdego obiektu lub ich grupy definiować Levels=x i w ten sposób zarządzać układem obiektów na warstwach. Jednak nawet dla małych map polecam tą technikę - w końcu kiedyś nasza mała mapka się rozrośnie a wtedy dla tak dużego pliku ręczne kopiowanie obiektów do kolejnych warstw będzie meczące i czasochłonne - po każdym dodaniu nowego obiektu danego typu trzeba pamiętać o powieleniu go do wyższych warstw, a raz zdefiniowany filtr załatwia nam ten temat ostatecznie.

Z RGN10 sprawa jest trudniejsza

W przypadku RGN10, filtrować można tylko wg. pierwszego bajtu - typu głównego, podtypy nie mogą być filtrowane, jeżeli otworzymy plik
RGNtype.txt (dołączony do programu cgpsmapper), zobaczymy tam miedzy innymi:

0x2A00 Dining(Other)
0x2A01 Dining(American)
0x2A02 Dining(Asian)
0x2A03 Dining(Barbecue)
0x2A04 Dining(Chinese)
0x2A05 Dining(Deli/Bakery)

Filtrowane odbywa się tylko wobec starszego bajtu (tj. 0x2a - co oznacza '1' na pozycji 42 - ale uwaga - w przypadku obiektów opisanych przez jeden bajt (np. 0x2a jest obiektem 'generic' Dinning) - filtrowanie jest dla jedynego (w tym wypadku młodszego) bajtu. Generalna zasada - filtrowany jest zawsze główny typ. W MapEdit umieszczony jest podtyp (np. 0x2a00), przez co można przyjąć, że mamy zawsze do czynienia ze starszym bajtem - nie ma to większego znaczenia dla pracy z programem cgpsmapper).

        Więc jak to wyszło na przykładzie POI jeśli chcemy zarządzać konkretnymi obiektami, to po prostu pojedynczo nadajemy im parametr Levels=x - ale nie zapominając o tym aby w filtrze [DICTIONARY] dać filtr na max-a dla tego typu co by nam nie wycięło obiektu z wyższych warstw (to przy założeniu że pozostałe elementy mapy w pełni filtrujemy przez  [DICTIONARY] - czyli dla każdego ustawione np. Levels=3) oraz dla danej grupy typu elementów po prostu musimy zrezygnować jako tako z filtrowania przez  [DICTIONARY] a cały ciężar musi spocząć na nas.

Ostatnia uwaga - ponieważ domyślnie program cgpsmapper przyjmuje, że w definicji filtrów są same '1', nie ma potrzeby definiowania filtrowania dla warstwy 0 (jeżeli chcemy tam zaimportować 'wszystko') - możemy zacząć definicje filtrów od warstwy 1.

W opisie tym wykorzystano materiały otrzymane bezpośrednio od autora programu cgpsmapper.

O filtrowaniu przez  [DICTIONARY] napisano też w dokumencie UMP.

Więcej o pracy w GPSMapEdit napisano na stronie GPS Maniak.

 

Wróć