* MapEdit cz.3 - Nowości 2005r  (luty 2005)
 
 

Service Pack 1 dla edytora MapEdit

   Bodaj od jesieni 2004r Michaił Sotin przygotowuje dla każdej nowej wersji MapEdit pakiet "Service Pack". Zmodyfikowany Service Packiem MapEdit ma kilka istotnych ulepszeń:
  • Tools-->Garmin-->GPS panel.    Opcja umożliwia pobranie nagłówków map załadowanych do odbiornika, a także  pobranie samych map. Osobiście sprawdzałem pobieranie plików IMG na jednej niedużej mapce, a i tak dość długo to trwało. Dodam, że obsługa panelu GPS odbywa się wyłącznie za pomocą portu com.
  • Zdecydowanie szybsze ładowanie podkładów - plików jpg, a także możliwość ładowania większych plików jpg niż w wersji standardowej MapEdit. Pomimo sprawniejszej obsługi plików jpg, nadal zalecam w ustawieniach Windows we właściwościach ekranu stosowanie 16 bitowego kodowania kolorów. Przy 24 bitowym MapEdit zbyt często odmawia posłuszeństwa.
  • Bardzo rozbudowaną opcję Snap to... w której zwłaszcza opcja "przyciąganie do puntku" istniejącego obiektu bardzo ułatwia przygotowywanie mapek z routingiem.
   Publikowany przez Michaiła Service Pack - jest w postaci nie do zaakceptowania przez zwykłego śmiertelnika (o ile się zorientowałem - to nieskompilowane źródła), zatem polecam wizytę na stronie Rafała Fitta (sekcja: linki o GPS) i pobranie pełnej skompilowanej wersji MapEdit+Service Pack. Zwracam uwagę na tekst umieszczony na stronie Rafała: Skompilowany z optymalizacją dla Pentium 3 (i lepszych) oraz z użyciem instukcji SSE. Nie działa komputerach ze starszym procesorem lub bez SSE.

 UWAGA  Przypominam, że w celu uniknięcia przypadkowych przesunięć obiektów ZDECYDOWANIE zaleca się wyłączenie opcji Snap to Gird !!!

(Tools --> Options)

101.jpg (16200 bytes)
cgpsmapper i "wycinanie" dziur
   W styczniu 2005r na pl.rec.gps autor cgpsmappera - Staszek Kozicki poinformował, że definicja obiektów typu wielokąt wykonana w formacie polskim w następujący sposób:
[RGN80]
Type=0x3c
Data0=(52.26748,16.77402),(52.26690,16.77359),(52.26649,16.77288), ...............
Data0=(52.26883,16.77990),(52.26861,16.77943),(52.26836,16.77926),................
Data0=(52.26793,16.78814),(52.26763,16.78780),(52.26728,16.78788),................
[END-RGN80]
zostanie przez kompilator potraktowana tak, że:  pierwszy obiekt zdefiniowany jako Data0 zostanie uznany jako obiekt właściwy (podkład), a pozostałe obiekty zdefiniowane jako Data0, jeżeli ich lokalizacja pokrywa się z lokalizacją pierwszego zostaną potraktowane jako "dziury" w tym pierwszym.
   W ten sposób przygotowanie mapek zwłaszcza z dużymi kompleksami leśnymi i zlokalizowanymi na nich polanami ulega zdecydowanemu ułatwieniu. Wystarczy najpierw zdefiniować las jako całość. Następnie polany jako odrębne obiekty - scalić to do jednego obiektu i .... gotowe.   Z punktu widzenia formatu polskiego sprawa jest oczywista, a jak praktycznie wykonać to w edytorze map ?

Mapedit_100.jpg (102596 bytes)

W artykule poświęconym MapEdit - przykład Jeziora Góreckiego kreśliliśmy w postaci trzech odrębnych części - po to, aby "ominąć" występujące na jeziorze dwie wyspy.

Wykorzystując nowe właściwości cgpsmappera jezioro w chwili obecnej możemy wykreślić jako jeden pełen obiekt.

Mapedit_101.jpg (74969 bytes)

Na tak wykreślonym jeziorze, przy włączonej opcji Transparent polygons możemy wykreślić wyspy.

Typ obieku użyty  do wykreślenia wysp powinien być inny niż typ obiektu podstawowego.

W omawianym przykładzie użyłem typ różniący się od jeziora "Lake" również kolorystyką.

To: Airport runway.

Mapedit_102.jpg (103511 bytes)

Po wykreśleniu wszystkich "wysp" przy wyłączonej opcji Transparent polygons (lepiej widać) wykorzystując funkcję Select objects - lewym przyciskiem myszy zaznaczamy w pierwszej kolejności jezioro, a następnie przytrzymując klawisz shift lewym przyciskiem myszy zaznaczamy (a może odznaczamy ?) po kolei wszystkie wyspy.

Mapedit_103.jpg (99845 bytes)

Na koniec prawym przyciskiem myszy klikamy na jezioro wywołując okienko dialogowe i wykonujemy funkcję Join objects (połącz obiekty).

W efekcie uzyskamy to, czego od nas oczekuje kompilator. Tzn. definicję poszczególnych obiektów w .... jednym RGN80

 

Własna mapka z Routingiem

   12 stycznia 2005r    na pl.rec.gps   napisałem:   Miałem taki sen: Idę z Murowańca przez Krzyżne do "piątki", a na moim 60CS piękna fioletowa krecha prowadzi mnie po szlaku jak po sznurku :-))) Do szczęścia to potrzebne może nie jest, ale pobawić się można.

    A już 18 stycznia 2005r  Staszek GPSmapper  napisał:    Udostępniłem program MapRoute (odsyłam do 'Routable maps' na mojej stronie - przykład użycia, oraz 'Toolbox')

    W ten sposób wraz z umieszczoną wcześniej na MapCenter wersją cgpsmappera, obsługującą routing trafił w ręce użytkowników program MapRoute generujący na amatorskich mapkach odpowiednie dane do routingu. W sumie w pełni funkcjonalny zestaw dla amatorów UMP-owców.   Na razie (stan na dzień 22-02-2005) dostępny kompilator ma ograniczenie związne z routingiem do 1500 ulic/dróg.

   Temat routingu jest dla mnie tematem nowym. Nie ukrywam, że względu na specyfikę moich mapek - routing tyrystyczny dla piechurów - nie interesowałem się takimi zagadnieniami jak: ulice jednokierunkowe, zakazy ruchu numeracja budynków itp.

    W moim przykładzie pokażę jak wygląda "techniczna" strona przygotowania mapki z routingiem. Nieznane mi szczegóły w tym dotyczące specyficznych zagadnień mapek samochodowych musisz już rozwiązać sam lub - korzystając z pomocy kolegów obeznanych z "miejskimi" projektami UMP: zobacz Porady z UMP_Warszawa

 UWAGA 
  • Kompilator cgpsmapper jest dość czuły na błędy w lokalizacji węzłów. Dlatego osobiście polecam wykonywanie mapki małymi etapami (góra pół godziny pracy) i codzienne jej kompilowanie na MapCenter. W przypadku błędu będziesz miał okazję wrócić do prawidłowej wersji z poprzedniego dnia i stracisz co najwyżej pół godziny pracy.
  • Z dokumentacji udostępnionej przez Staszka GPSmappera wynika, że minimalna odległość pomiędzy dwoma węzłami to ok. 5m dla mapki postawowej oraz ok. 10m dla mapki Preview. Dlatego proponuję w miarę uważnie klikać, aby odległość węzłów wynosiła powiedzmy te minimum kilkanaście metrów. Zapewniam, że to dużo łatwiejsze niż późniejsze szukanie błędu gdy kompilator się "wyłoży".
  • Z moich obserwacji wynika również, że nie można (przynajmniej na dłuższych odcinkach) lokalizować "drogi na drodze". Z tego też powodu musiałem Karkonosze i Tatry praktycznie kreślić od nowa, bo we wcześniejszych ich wersjach często szlak biegł po drodze. Były też takie sytuacje, że dwa, trzy szlaki biegły razem. Z punktu widzenia kompilatora z routingiem to jest nie do przyjęcia.
   Osobiście (czytelność obiektów na etapie kreślenia) wykonywałem odrębną mapkę (nazwijmy ją umownie NR1) z elementami do routingu (drogi, szlaki itp.), a osobno mapkę z pozostałymi elementami (NR2) obejmującą punkty, obszary, linie kolejowe, warstwice itp. Dopiero kiedy miałem pewność że mapka z drogami jest pozbawiona błędów (można ją skompilować), przed końcową kompilacją do pliku źródłowego mapki   NR1 dodawałem  obiekty z mapki   NR2.   Ta "ręczna" precedura została obecnie przeze mnie całkowicie zarzucona. W chwili obecnej proces generowania pliku wynikowego build.mp mam całkowicie zautomatyzowny. Szczegółowo całą procedurę - odpowiadającą turystycznemu charakterowi moich mapek opisałem w artykule "Routing GPS Maniaka". Jeżeli zamierzasz tworzyć mapki turystyczne polecam skorzystać z "mojej" metody. Przedtem jednak proponuję zapoznać z dalszą częścią bieżącego artykułu wyjaśniającego ogólne zasady tworzenia mapek z routingiem.
Routing-1.jpg (79423 bytes) Byłem niestety przyzwyczajony kreślić proste odcinki dróg liniami prostymi bez zbędnych punktów pośrednich.

Dla potrzeb routingu ta droga jest wykreślona nieprawidłowo. Brak węzłów w miejscu potencjalnego skrzyżowania.

Routing-2.jpg (77170 bytes) Dlatego też drogę należy wykreślić (bądź uzupełnić) z  punktami pośrednimi w miejscach przyszłych skrzyżowań.

Zwracam uwagę na napis michus addons, co oznacza że używam MapEdita z Service Packiem Michaiła Sotina

Routing-3a.jpg (63644 bytes)  

Uaktywniona opcja Snap to .. z przyciąganiem do punktu obiektu (pozostałe opcje nie są aktywne) ułatwia idelane połączenie dwóch różnych obiektów.

Podkreślam: różnych.

MapEdit z ServicePackiem blokuje przyciąganie do punktu na tym samym obiekcie. Nie próbowałem zrobić tego na siłę. Dlatego też nie wiem czy cgpsmapper potrafiłby wygenerować routing przy skrzyżowaniu ulicy nr1 z ulicą nr1.

Może lepiej nie próbować ?

Routing-3.jpg (62126 bytes) Stosując w.wym. zasadę nie łączenia tego samego obiektu,  pętelki takie jak na ilustracji kreśliłem jako dwa różne obiekty.

Czy słusznie ? Nie wiem, ale mapka działa.

Routing-4.jpg (31057 bytes) Kreśląc "normalną" mapkę turystyczną zapewne zrobiłbym to tak jak po lewej. Szlak i droga zgodne z tym co widzę na podkładzie. Nietrudno jednak wymyśleć, że przejście pomiędzy ścieżką (szlakiem) a drogą w rzeczywistości  jednak jest. Zatem dla potrzeb routingu, aby była możliwość "przeskoku" z obiektu na obiekt musiałem sobie pozwolić na małe oszustwo i "nagiąć" szlak w kierunku drogi dając wspólny węzeł. Takie połączenie umożliwi wygenerowanie prawidłowej trasy gdyby od widocznej drogi odchodziła jakaś ścieżka na wschód.

Można też to rozwiązać poprzez dodanie łącznika np. krótkiego odcinka obiektu "unpaved road". Należy jednak pamiętać o "minimalnej odległości" pomiędzy dwoma węzłami.

Routing-5.jpg (34442 bytes)
 UWAGA   Dalsza obróbka mapki z routingiem powoduje utratę zdefiniowanych leveli. Zatem wykonywanie mapki z danymi pod routing proponuję ograniczyć do Level_0 (ustawionego na 120 lub 200/300m)

    No a teraz najważniejsza i zarazem ...... najprostsza sprawa. Wygenerowanie danych do routingu. Zapisujemy naszą mapkę w formacie polskim w dowolnym katalogu (folderze) pod dowoloną nazwą.  Tu w przykładzie: 1.mp

Routing-6.jpg (57960 bytes) Następnie do tego samego katalagu kopiujemy kompilator (freewarowy cgpsmapper) oraz dodatkowo pobrane ze strony Staszka GPSmappera pliki MapRoute.exe i MapRoute.ini.

Aby uniknąć ręcznego pisania poleceń, proponuję w tym samym katalogu umieścić plik:  !go.bat

W efekcie w naszym katalogu powinniśmy mieć pliki takie jak widoczne na ilustarcji obok.

Następnie uruchamiamy !go.bat

i .......

Routing-7.jpg (59160 bytes)

Plik wsadowy wykonuje następujące polecenia:

  • cgpsmapper shp 1.mp w wyniku czego z pliku "1.mp" otrzymujemy dane ESRI

  • maproute maproute.ini 14 gdzie powstaje gotowy plik "mp" z danymi do routingu zamieniany dalej na "build.mp"

  • porządkuje katalog usuwając zbędne pliki

W efekcie tych transformacji z pliku "1.mp" otrzymujemy prawie gotowy plik "build.mp".

Routing-8.jpg (47149 bytes) Za pomocą Notatnika w pliku "build.mp" zmieniamy ID oraz nazwę mapki.

W końcu plik "build.mp" zipujemy i wysyłamy na MapCenter w celu kompilacji pełną wersją cgpsmappera.

   Tu drobne wyjaśnienie na temat parametru "14" z polecenia maproute.  Otóż z części opisowej pliku MapRoute.ini wynika, że parametr wynikowy budujemy jako sumę składników cząstkowych:

; work code
; - work code is sume of the following basic operations :
;    1 - Merge and correct wrong elements
;    2 - Generate generic routing table
;    4 - Bounds detection
;    8 - Polish Format output (default is ESRI)

    Nie ulega wątpliwości, że na pewno musimy zastosować "8" i "2". Opcja "4" jako generująca punkty łącznikowe pomiędzy mapami też może się przydać (chociaż mi na razie nie udało się zrobić dwóch sąsiadujących mapek współpracujących ze sobą). Znaczenie parametru "1" jest dla mnie niejasne. Wykonałem wiele prób zarówno z "11" jak też "14" i "15". Ponieważ przy "15" zauważyłem pewne błędy w działaniu mapki w odbiorniku (może to przypadek ?), na razie pozostałem przy "14".

  Wracamy do mapy.  Jeżeli okazało się że nasze drogi na mapcenter skompilowały się prawidłowo, to czas na połączenie mapek. Z mapki "nr 2" (tj. mapki zawierającej obiekty nie objęte routingiem) kopiujemy np. za pomocą notatnika (nie skopiuj przez pomyłkę nagłówka !!!) do pliku build.mp wszystkie obiekty. Następnie (jeżeli istnieje taka potrzeba) modyfikujemy (uzupełniemy) nagłówek.
[IMG ID]
ID=90000000
Name=MapRoute......
Routing=Y
Levels=5
Level0=24
Level1=22
Level2=20
Level3=19
Level4=18
[END]

Dla porównania nagłówek wygenerowany przez MapRoute i fragment nagłówka moich Tatr z routingiem. Znaczenia TreSize i TreMargin nie rozumiem, więc nie będę się upierał, ale na pewno warto do nagłówka pliku build.mp wpisać informację o indeksacji POI

Pamiętaj też o prawidłowym ID oraz Name

[IMG ID]
ID=48060011
Name=TATRY_3_0
Elevation=M
Preprocess=F
TreSize=1000
TreMargin=0.00000
POIIndex=Y
Routing=Y
.......
[END-IMG ID]
 

Zwracam uwagę, że mapka "build.mp" została wygenerowana z filtrem [Dictionary] zobacz:

;Followind DICTIONARY section can/should be modified to meet your requirements

[DICTIONARY]
; 0 1 2 3 4 5 6
; 123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef0.....
Level1Rgn10=100001000011110000010111111101011111111101111111000000000000000111111111111111111111.....
Level2Rgn10=000000000000000000000000000000000000000000000000000000000000000000000000000000000000......

..................


Level8Rgn80=111000000000000000011100000000000000000100000000010000000001111000000100000000010000.....
Level9Rgn80=111000000000000000011100000000000000000100000000010000000001111000000100000000010000.....
[END-DICTIONARY]

    Więcej na temat tego zagadnienia możesz przeczytać tu: KSW   Ja mogę tylko wspomnieć, że sekcja Dictionary jest odpowiedzialna za automatyzację wyświetlania obiektów w poszczególnych levelach. Dlatego też, tak jak pisałem wyżej mapki dla routingu można wykonywać tylko dla warstwy 0. Ustawienie pozostałych warstw załatwi za Ciebie MapRoute.

    Gdybyś nie był zadowolony z automatyki zaproponowanej przez MapRoute możesz po zapoznaniu się z artykułem KSW samemu wprowadzić odpowiednie zmiany w sekcji Dictionary. Możesz też sekcję Dictionary usunąć i po połączeniu mapek NR1 i NR2 spróbować ustawić lokalizację obiektów w poszczególnych warstwach "po staremu" czyli MapEditem. Próbowałem (ver. 1.021) Mapka była OK, routing działał.

    Można też zrobić tak jak ja to uczyniłem. W  artykule "Routing GPSManiaka" (kwiecień 2005) pokazałem w jaki sposób przygotowuję swoje mapki z routingiem. W moim przypadku jest to proces w 100% zautomatyzowany.

 

    Na koniec jeszcze jedna sprawa.  Podłączanie mapek do MapSource W tej materii odsyłam do artykułu: Routowalne pliki IMG, a MapSource