Międzymapowy routing w GARMIN-ie
Z UMP
Linia 2: | Linia 2: | ||
1. Na obu arkuszach drogi muszą się kończyć w punkcie o tych samych współrzędnych | 1. Na obu arkuszach drogi muszą się kończyć w punkcie o tych samych współrzędnych | ||
- | [[Grafika: | + | |
+ | [[Grafika:wi1m.png]] | ||
2. W tym punkcie na obu arkuszach musi zostać wygenerowany szczególny rodzaj węzła (external node) | 2. W tym punkcie na obu arkuszach musi zostać wygenerowany szczególny rodzaj węzła (external node) |
Wersja z dnia 20:47, 20 cze 2008
Mapy dla odbiorników Garmin mogą być tworzone jako pojedyncze mapki i wtedy sprawa routingu jest dość oczywista. Większe mapy tworzone są jako zestawy map i tak jest w przypadku naszej mapy. Aby routing mógł "przeskoczyć" z jednego arkusza na drugi muszą być spełnione dwa warunki:
1. Na obu arkuszach drogi muszą się kończyć w punkcie o tych samych współrzędnych
2. W tym punkcie na obu arkuszach musi zostać wygenerowany szczególny rodzaj węzła (external node)
Można oczywiście wykonać to w używanym przez nas mapedicie (zarówno w wersji "kanonicznej" jak mapedit+) generując najpierw węzły dla routingu a następnie oznaczając każdy graniczny jako external. Jednak w naszym projekcie generowanie węzłów dla routingu odbywa się bezpośrednio przed kompilacją i wykorzystywany jest do tego program netgen Mariusza Dąbrowskiego. Program ten oprócz generowania "zwykłych" węzłów w miejscach przecięcia czy styku dróg potrafi wygenerować węzły "external" w miejscach przecięcia dróg ze specjalnym rodzajem linii (0x4b) nazywanej graniczną. Warunkiem powstania takiego węzła jest istnienie węzła w linii granicznej w punkcie, w którym kończy się droga mająca ciąg dalszy w sąsiednim arkuszu. Zatem każdy z obszarów mających drogi wspólne z sąsiednim jest otoczony liniami granicznymi (są one wspólne dla sąsiednich obszarów). Te linie w źródłach przechowywane są w katalogu narzedzia w pliku granice.txt i z tego pliku pobierane podczas montowania dowolnego obszaru. Dodając nową drogę znajdującą się w dwóch (lub więcej) arkuszach możemy zastosować taką metodę:
1. Montujemy obszar A
2. Rysujemy drogę w pobliże granicy obszaru
3. W linii granicznej dodajemy węzeł w miejscu, gdzie droga będzie przechodziła na sąsiedni arkusz
4. Dociągamy ostatni węzeł narysowanej wcześniej drogi do tego punktu w granicy
5. Zamykamy mapedit zapisując pracę
6. Uzyskujemy !nowości.txt lub diff'a dla pliku z drogami oraz plik granice-wspolne.txt.diff.txt (jeśli używamy mont-demont.bat) lub narzedzia-granice.txt.diff (jeśli używamy mont-demont-perl.bat)
7. Aplikujemy diff'a (paczuj.bat) lub/i dorzucamy nowości do pliku z drogami - zmiany w granicach nie zostaną zaaplikowane, bo plik granic jest poza katalogiem obszaru w którym pracujemy.
8. Aplikujemy zmiany do pliku granice.txt. Można to zrobić ręcznie (odradzam) znajdując odpowiednią linijkę i zamieniając ja na tę z pliku diff lub uwzględniając odpowiednią nazwę pliku diff stworzyć plik bat do tego celu o treści:
if not exist ..\setenv.bat copy ..\narzedzia\setenv.bat ..\setenv.bat
call ..\setenv.bat
rem ## setenv wychwytuje, ze zmiennych nie bylo, i przerywa
%ump%\narzedzia\patch.exe %ump%\narzedzia\granice.txt granice-wspolne.txt.diff.txt
pause 0
9. Montujemy obszar B - w lini granicznej powinien już być nowy punkt
10. Rysujemy ciąg dalszy drogi dbając by kończyła się ona dokładnie w nowym punkcie w granicy.
11. Aplikujemy diif'y lub/i nowości
12. Commitujemy zmiany dla obu obszarów pamiętając by wycommitować też granice.txt z katalogu narzedzia