Adresacja

Z UMP

(Różnice między wersjami)
Linia 157: Linia 157:
== Problem: adresacja 2a, 2b, 2c, 2d etc. ==
== Problem: adresacja 2a, 2b, 2c, 2d etc. ==
-
Niestety, nie ma supportu dla "podnumerów". W numeracji możemy podawać jedynie liczby. Aby spróbować jakoś to rozwiązać mamy dwa wyjścia: oznaczyć mniej więcej miejsce występowania 2a, 2b itd. zbiorczo jako "2" (w jednym miejscu ulicy), albo wskazywać każdy budynek jako "2" przy innych, '''nie przylegających do siebie'' odcinkach ulicy.
+
Niestety, nie ma supportu dla "podnumerów". W numeracji możemy podawać jedynie liczby. Aby spróbować jakoś to rozwiązać mamy dwa wyjścia: oznaczyć mniej więcej miejsce występowania 2a, 2b itd. zbiorczo jako "2" (w jednym miejscu ulicy), albo wskazywać każdy budynek jako "2" przy innych, '''nie sąsiadujących ze sobą''' odcinkach ulicy.
 +
 
 +
Nie sąsiadowanie jest o tyle ważne, że jeśli na jednym węźle ''before'' będzie równe 2, i ''after'' też 2, zostanie to potraktowane jako ciągłość (patrz wyżej). Jeśli natomiast bedą to dwa osobne odcinki, przy zapytaniu nawigacji o ulicę Asnyka numer "2" (nie można i tak podać "a", "b" etc) użytkownik dostanie do wyboru dwie lokalizacje "Asnyka 2", analogicznie jak przy nienumerowanej ulicy składającej się z dwóch polyline dostaje do wyboru dwie ulice "Asnyka". Żadnej dodatkowej informacji poza "Asnyka 2" niestety miał nie będzie.
 +
 
 +
Trzecim wyjściem, zapewniającym lepsze doprowadzenie do niektórych miejsc, jest oczywiście postawienie POI, czyli założenie że użytkownik będzie szukał sklepu najpierw przez POI, a dopiero potem po adresie. Oczywiście nie jest to de facto żadne rozwiązanie problemu, ale coś, o czym warto pamiętać jeśli kwestia nie dotyczy tylko budynków mieszkalnych. Np. jeśli budynek mieszkalny ma numer "2", a odległy od niego sklep numer "2a", można według mnie spokojnie skierować numer "2" na budynek, a przy sklepie postawić POI właściwy dla typu sklepu.
 +
 
 +
 
 +
TxF, 2008.07
-
Nie przyleganie jest o tyle ważne, że jeśli na jednym węźle ''before'' będzie równe 2, i ''after'' też 2, zostanie to potraktowane jako ciągłość (patrz wyżej).
 

Wersja z dnia 13:22, 17 lip 2008

Spis treści

Po co?

Odpowiedź jest dość prosta - adresacja jest po to, aby w urządzeniu można było podać Piłsudskiego 13, i dojechać na tę ulicę właśnie pod ten numer.

Konsekwencją tego jest sposób wyboru celu podróżu podczas podawania adresu -- po podaniu nazwy ulicy odbiornik GPS pokaże adresy, jakie zna na tej ulicy (jako alternatywę do numeru, który można i tak wpisać samemu, niżej będzie napisane dlaczego ma prawo go zlokalizować mimo iż nie jest na liście znanych). Warunkiem jest istnienie numeracji na wszystkich jej częściach.

Jeśli ulica nie ma numeracji, ale składa się z kilku części (polyline), mamy dość kłopotliwą sytuację gdy odbiornik daje nam możliwość wyboru między Piłsudskiego, Piłsudskiego a Piłsudskiego, tyle że bez żadnej dodatkowej informacji. Użytkownik wybiera więc "w ciemno" miejsce, do którego jedzie.

Podstawy

Niniejszy opis dotyczy wprowadzania numerów za pomocą programu MapEdit++. ME++ zmienia to następnie na format pliku mapy, czyli linie które możemy zobaczyć później obok definicji polyline naszej ulicy.

Do wprowadzania numerów przydatne będzie włączenie opcji Show Numbers along Roads w menu View programu ME++. Samych zmian dokonuje się w trybie edycji węzłów (Edit nodes, czyli M), przez wybranie właściwości węzła (prawy przycisk myszki nad danym węzłem, Node Properties), zakładka Numbers.

Uwaga: numery ulicy to własność odcinka danej ulicy. Nie są definiowane jak POI przez jakiś punkt, ale przez zakres zdefiniowany dla danego odcinka. Zakres ten definiowany jest z kolei w węzłach, z podziałem na prawą i lewą stronę (idąc od początku polyline).

Nazwa ulicy przypisana jest do konkretnej miejscowości atrybutem Miasto=, zwykle nie musimy go dodawać, jeśli w jej atrybutach w polu Extras zdefiniowany jest plik np. Plik=src\WĄBRZEŹNO.ulice.txt. Atrybut ten podany jest wtedy na początku tego pliku i podczas kompilacji mapy przypisywany jest wszystkim zawartym w niej ulicom (polyline). Jeśli to my go stworzyliśmy plik MOJEMIASTO.ulice.txt, należy pamiętać o dodaniu tego atrybutu.

Wyjątkiem są pliki typu inne.ulice.txt, gdzie każda ulica powinna mieć własny atrybut Miasto=.

Zaczynamy

Prosta numeracja

Dla przykładu: mamy piękną, prostą ulicę, która jest numerowana idealnie, tzn. z jedej strony są numery od 1 do 31 (wszystkie budynki na równych działkach), a z drugiej od 4 do 14, co prawda mniej numerów bo działki szersze, ale jednak wciąż wszystkie równe. Oznacza to, co dla nas ważne, że zmiana numeru nastepuje co N metrów, i jest to wartość stała dla całej ulicy.

Załóżmy, że ulicę narysowaliśmy chwilkę wcześniej od lewej do prawej, numery nieparzyste są na dole, a patrzyste u góry, i rosną w prawo.

Ponieważ jest to prosta ulica bez skrzyżowań (poza wjazdem i wyjazdem z niej), jest to jeden odcinek prostej, a więc posiada ona jedynie dwa węzły. Aby określić, który z nich jest początkiem ulicy (w sensie mapy, ważna jest bowiem kolejność węzłów tej polyline, którą numerujemy, niezależnie od tego czy geograficznie jest to początek, środek czy koniec ulicy), patrzymy na kolory węzłów - ME++ oznacza pierwszy węzeł zaznaczonej polyline na różowo (w trybie edycji węzłów, oczywiście). Gdyby jakaś wersja ME++ tego nie robiła, można kliknąć prawym przyciskiem na polyline, wybrać "Nodes...", i zobaczyć które współrzędne są pierwsze od góry.

Ulica z węzłami, różowy jest pierwszy.
Ulica z węzłami, różowy jest pierwszy.

Klikamy więc na pierwszym węźle (zaczynać należy od prawym przyciskiem, wybieramy "Node Properties", a nastepnie zakładkę "Numbers". Wygląda ona tak:

Zakładka Numbers
Zakładka Numbers

Zaznaczamy This node has associated house numbers info.

Mamy teraz możliwość podania numeracji dla lewej i prawej strony ulicy. Dla stworzonej wcześniej ulicy lewą stroną będzie góra (bo zaczynaliśmy od lewej). W Left side numbers, after point wybieramy więc Even (parzyste), a jako Start wpisujemy 4. Podajemy w ten sposób, że w tym węźle rozpoczyna się odcinek, na którym po lewej stronie mamy parzystą numerację, a pierwszy budynek ma numer 4 (nie ma znaczenia w tej chwili, gdzie i czy w ogole jest numer 2).

W Right side numbers, after point wybieramy Odd (nieparzyste), wpisujemy jako Start 1'.

Jak widać, nie podajemy tu zakresu ani ostatniego numeru. Opisujemy pierwszy węzeł odcinka, i numery, jak opisane jest nad polami, after point, czyli za tym punktem (węzłem). Nie jest to więc cała praca - trzeba jeszcze zdefiniować koniec zakresu. Robi się to na drugim węźle odcinka, w naszym przypadku na ostatnim (na razie) węźle ulicy:

Na tym węźle po zaznaczeniu znów This node has associated house numbers info nie możemy podać jak poprzednio początku zakresu, aktywują się jedynie okienka Left/Right side number, before point. W tym miejscu podajemy więc ostatni numer zakresu. Będzie to w naszym przypadku 4 dla lewej strony i 31 dla prawej.

Uwaga: jeśli zdarzy nam się zapomnieć ustawienia końca zakresu dla jakiegoś odcinka, i zostanie tam domyślne 0, skutek będzie zapewne mało oczekiwany, tzn. ME++ potraktuje to 0 jako koniec zakresu, i będziemy tam mieli wszystkie numery pośrednie. Tu początkiem było 1, ale gdyby było to np. 13, będzie nieco gorzej.

Wnioski z prostej numeracji

W ME++ ulica powinna w tym momencie wyglądać tak:

Jak widać, ME++ narysował nam numerację ulicy, przy czym na niebiesko zaznaczył punkty zdefiniowane przy danych węzłach, a na czerwono punkty wyliczone.

Jeśli teraz podamy w wyszukiwaniu Piłsudskiego, urządzenie wyświetli nam w "podpowiedzi" Piłsudskiego 1, 4, 14 i 31, wpisanie jednak numeru "17" spowoduje skierowanie nas do punktu w okolicy czerwonej siedemnastki w ME++.

Prosta numeracja cz. 2

A teraz załóżmy, że numery od 16 do 22 są przy jednej ze stron przecznicy od naszej ulicy, idącej "w górę", ale gdzieś ze środka aktualnego odcinka. Przecznica jest gruntówką, rysujemy ją więc jako "Unpaved road". W tym celu w ciągu ulicy musimy stworzyć nowy węzeł w ciągu ulicy, i pociągnąć od niego nowy odcinek.

Ważne jest, aby nazywał się tak samo, z oczywistych względów: adresacja przypisana jest do nazwy polyline.

Jak widać na załączonym obrazku, dodanie nowego węzła nie zburzyło dotychczasowej numeracji:

Dzieje się tak, ponieważ nowy węzeł (starego odcinka) nie ma włączonej informacji o numerach (brak zaznaczenia This node has associated house numbers info). Jest to wygodne ze względu na równą numerację ulicy, i dość logiczne, ale niestety nie możemy tego tak zostawić. Zdarza się bowiem że na etapie kompilacji jest to błędnie interpretowane, i numery danej ulicy są później przeliczane nieprawidłowo. Dodajemy więc definicje before i after dla punktu pośredniego:

I pamiętamy, że zakresy definiujemy zawsze na dwóch sąsiadujących węzłach. Nie zostawiamy węzłów "pośrednich" (do czasu usunięcia problemów przy kompilacji).


Teraz trzeba podać numerację dla nowego odcinka. Ponieważ był rysowany od dołu, a hipotetyczne budynki są po jego prawej stronie, konfiguracja węzłów wyglądała będzie tak:


A uliczka wyglądała będzie tak:

Prosta numeracja cz. 3

Mamy więc dwa kawałki Piłsudskiego, okazuje się jednak że z biegiem lat wybetonowali idącą dalej ścieżkę, bo zaczęli się przy niej budować ludzie. Z jednej strony jest skarpa, więc nie ma tam ani domów ani nawet krzaków, nie było więc sensu dawać tam numeracji - numery poleciały już kolejno z jednej strony.

Dorysowana droga:

Jak widać, tym razem wykorzystany został tryb Both, czyli adresacja ciągła (parzyste i nieparzyste).


Problem: inny kierunek ulicy

Jeżeli odcinek został narysowany w odwrotnym kierunku, niż idzie numeracja, wyjścia są dwa.

Jeśli ulica nie jest jednokierunkowa, można sobie dla wygody polyline odwrócić: prawy przycisk na polyline (ale nie na węźle), i Reverse Polyline.

Ale można też (albo trzeba, gdy ulica jest jednokierunkowa w "odwrotną" stronę) po prostu podać jako początek zakresu np. 12, a jako koniec 2 - numeracja może także być malejąca.


Problem: nierówne rozłożenie budynków

Okazuje się jednak, że nie jest tak różowo - na nowym odcinku numery wcale nie są rozłożone równomiernie, na początku jest gęściej, potem dość rzadko.

Musimy więc zmodyfikować numerację. Robimy to wyznaczając węzeł lub węzły pośrednie, tak aby z jednej strony odwzorować rozłożenie numeracji, a z drugiej - nie przesadzić. Nawigacja ma pomóc w trafieniu do budynku samochodem, rowerem lub na piechotę, a nie rakietą ziemia-ziemia. Błąd rzędu 10 czy 20 metrów nie ma większego znaczenia, szczególnie gdy właściwy budynek jest w zasięgu wzroku. Ważne jest, aby "gość" trafił w miejsce, w którym nie będzie już dylematów "gdzie skręcić" albo czy to ta dzielnica ;)

Przykład wstawienia dodatkowego węzła poniżej. Należy zauwazyć, że dla węzła pośredniego danego odcinka definiujemy zarówno numery poprzedzające (before), jak i nastepujące (after):

Uwaga: przy wstawianiu węzłów pośrednich i włączaniu informacji o numeracji ME++ lubi wrzucić sobie błedne ustawienia domyślne, w tym wypadku po stronie lewej proponował mi Both, a po prawej None, trzeba więc za każdym razem sprawdzić czy ustawienia są właściwe.


Problem: "obce" budynki

Z zaszłości historycznych wynika jednak, że przy "nowym" kawałku ulicy stoi budynek, którego adres to np. "Ogrodowa 4". Ulica Ogrodowa jest co prawda dalej, ale nie bardzo jest jak dopisać na jej odcinku budynek o numerze 4 - nikt w ten sposób tam nie trafi.

Do zaadresowania go posłużymy się więc ścieżką (walkway/trail), której najważniejszym atrybutem będzie nazwa, tj. "Ogrodowa". Ważne, aby ścieżka ta dołączona była do sieci ulic, aby dało się wyliczyć trasę na tej podstawie, wystarczy jednak że będzie to krótki kawałek przy budynku (lub budynkach), które chcemy opisać:


Jak widać, początek i koniec zakresu to "4". W ten sposób opisujemy pojedynczy budynek.


Problem: jeszcze bardziej nierówne rozłożenie budynków, pomieszana numeracja

W praktyce numeracji ulic niestety dość często nie da się w pełni zrealizować z zastosowaniem zakresów. Pojedyncze numery, lub ich większą liczbę, trzeba wskazać "ręcznie". Robimy to korzystając z opisanego powyżej sposobu opisania pojedynczego budynku jednym odcinkiem polyline. Może się nam więc zdarzyć, że będziemy mieli kolejne węzły zdefiniowane na przykład tak:



Czyli numerujemy częściowo zakresami, częściowo odcinkami nieopisanymi, częściowo odcinkami opisującymi pojedynczy numer.

Uwaga: jak widać, jeden numer można "rozciągnąć" na dwa odcinki, podając after = 11, na następnym before = 11, after = 11, i na kolejnym znów before = 11.


Problem: adresacja 2a, 2b, 2c, 2d etc.

Niestety, nie ma supportu dla "podnumerów". W numeracji możemy podawać jedynie liczby. Aby spróbować jakoś to rozwiązać mamy dwa wyjścia: oznaczyć mniej więcej miejsce występowania 2a, 2b itd. zbiorczo jako "2" (w jednym miejscu ulicy), albo wskazywać każdy budynek jako "2" przy innych, nie sąsiadujących ze sobą odcinkach ulicy.

Nie sąsiadowanie jest o tyle ważne, że jeśli na jednym węźle before będzie równe 2, i after też 2, zostanie to potraktowane jako ciągłość (patrz wyżej). Jeśli natomiast bedą to dwa osobne odcinki, przy zapytaniu nawigacji o ulicę Asnyka numer "2" (nie można i tak podać "a", "b" etc) użytkownik dostanie do wyboru dwie lokalizacje "Asnyka 2", analogicznie jak przy nienumerowanej ulicy składającej się z dwóch polyline dostaje do wyboru dwie ulice "Asnyka". Żadnej dodatkowej informacji poza "Asnyka 2" niestety miał nie będzie.

Trzecim wyjściem, zapewniającym lepsze doprowadzenie do niektórych miejsc, jest oczywiście postawienie POI, czyli założenie że użytkownik będzie szukał sklepu najpierw przez POI, a dopiero potem po adresie. Oczywiście nie jest to de facto żadne rozwiązanie problemu, ale coś, o czym warto pamiętać jeśli kwestia nie dotyczy tylko budynków mieszkalnych. Np. jeśli budynek mieszkalny ma numer "2", a odległy od niego sklep numer "2a", można według mnie spokojnie skierować numer "2" na budynek, a przy sklepie postawić POI właściwy dla typu sklepu.


TxF, 2008.07



ciąg. dalszy. nastąpi.