Pl:IndoorOSM

From OpenStreetMap Wiki
Jump to navigation Jump to search

Zobacz również IndoorOSM on Android.

IndoorOSM
Proposal status: Obsoleted (inactive)
Zaproponowana przez: Gomar1985
Dotyczy: relacja
Definicja: Główne cechy modelu propozycji to:
  • mapowanie pomieszczeń wewnętrznych, w tym różne poziomy (piętra)
  • mapowanie drzwi i okien (zarówno wewnątrz, oraz elewacji)
  • 3D obiekty
Opracowane: 2011-11-29


Schemat tworzenia

Budynek - relacja nadrzędna

information sign

The 3D Development team are currently working on unifying 3D related tags.
For first results see Simple 3D Buildings.
Zdj.1: Główne założenia

Budynek to relacja w naszym modelu, którego typ relacji ustawiony jest na budynku. Dodatkowe (ważniejsze) informacje o budynku takie jak adres, nazwa, wysokość itd. są zapisane w relacji tego budynku (relacji nadrzędnej). Relacje podrzędne relacji nadrzędnej zawierają różne poziomy (piętra) budynku wraz z wejściami i wyjściami. Oznacza to, że dla każdego poziomu budynku istnieje jedna relacja. Rolę tych relacji definiuje się jako numer odpowiedniego piętra (przykładowo level_0, level_1, level_‐1, itd.). Parter jest zawsze oznaczony jako level_0. Wejścia i wyjścia do budynku powinny być również oznaczane jako człony tej relacji, ale ich rola to entrance_exit. Schemat ten pokazany jest na zdj. 1.

Przykładowa relacja nadrzędna modelu IndoorOSM jako kod źródłowy OSM-XML przedstawiona jest poniżej:

<?xml version="1.0" encoding="UTF-8"?>
<osm version='0.6' generator='JOSM'>
  ...
  <relation id='1370729' timestamp='2011-12-02T12:16:49Z' uid='300276' user='gomar1985' visible='true' version='8' changeset='10016221'>
    <member type='relation' ref='1370727' role='level_-1' />
    <member type='relation' ref='1370728' role='level_0' />
    <member type='relation' ref='1370725' role='level_1' />
    <member type='relation' ref='1370726' role='level_2' />
    <member type='node' ref='1098227410' role='entrance' />
    <tag k='addr:city' v='Heidelberg' />
    <tag k='addr:country' v='DE' />
    <tag k='addr:housenumber' v='48' />
    <tag k='addr:street' v='Berliner Straße' />
    <tag k='amenity' v='university' />
    <tag k='building' v='yes' />
    <tag k='building:architecture' v='modern' />
    <tag k='building:buildyear' v='1980' />
    <tag k='building:cladding' v='concrete' />
    <tag k='building:condition' v='good' />
    <tag k='building:facade:colour' v='grey' />
    <tag k='building:levels' v='4' />
    <tag k='building:max_level' v='2' />
    <tag k='building:min_level' v='-1' />
    <tag k='building:roof:colour' v='black' />
    <tag k='building:roof:material' v='cardboard' />
    <tag k='building:roof:shape' v='flat' />
    <tag k='height' v='14.5' />
    <tag k='name' v='Geographisches Institut' />
    <tag k='type' v='building' />
  </relation>
  ...
</osm>

Ze względu na brak ograniczeń w zakresie informacji, jakie możemy przypisać do obiektu możemy dodać jakiekolwiek informacje do relacji budynku. Niemniej jednak, uważamy, że poniższe atrybuty są najbardziej istotne (wiele z nich jest już wykorzystywane w OSM w pewnym kontekście).

Klucz Opis Przykłady
building=* budynek building=yes
building:levels=* liczba pięter/poziomów building:levels=4
building:min_level=* najniższe piętro building:min_level=-1
building:max_level=* najwyższe piętro building:max_level=6
building:roof:shape=* (inne możliwości: building:roof=*, building:roof:type=*, building:roof:style=*) kształt dachu building:roof:shape=flat, building:roof:shape=pitched, building:roof:shape=hipped
building:roof:colour=* kolor dachu building:roof:colour=black
building:roof:material=* materiał z jakiego zbudowany jest dach building:roof:material=cardboard
name=* nazwa budynku name=Federal hospital
building:cladding=* materiał z jakiego wykonana jest elewacja building:cladding=brick, building:cladding=glass
building:facade:colour=* kolor elewacji building:facade:colour=yellow
building:facade:image=* link do zdjęcia elewacji building:facade:image=http://url.de/image.gif
building:architecture=* styl architektoniczny building:architecture=modern
building:buildyear=* rok ukończenia budowy building:buildyear=1987
building:architect=* architekt building:architect=Neumann
height=*, building:height=* (przestarzałe) wysokość w metrach height=25
building:condition=* stan budynku building:condition=renovated

Tworzenie poziomów (pięter)

Każdy poziom budynku (relacja podrzędna relacji budynku) jest oznaczany jako relacja. Typy tych relacji to wartości level. Człony tych relacji to inne elementy (punkty, drogi, relacje), które reprezentują różne części danego piętra (pokoje, korytarze, itp.) Ich rola to buildingpart. Ważne informacje o danym piętrze (np. name - nazwa, usage - zastosowanie itp.) powinny być dołączone jako wartość do odpowiedniej relacji podrzędnej - relacji piętra.

Każde piętro powinno również zawierać kontur piętra - wielokąt taki oznacza się za pomoca roli shell.

Przykładowa relacja piętra w oparciu o użycie schematu IndoorOSM przedstawiona za pomocą kodu OSM-XML:

<?xml version="1.0" encoding="UTF-8"?>
<osm version='0.6' generator='JOSM'>
  ...
  <relation id='1370725' timestamp='2011-12-02T12:16:50Z' uid='300276' user='gomar1985' visible='true' version='6' changeset='10016221'>
    <member type='way' ref='94551306' role='buildingpart' />
    <member type='way' ref='94551291' role='buildingpart' />
    <member type='way' ref='94551309' role='buildingpart' />
    <member type='way' ref='94551293' role='buildingpart' />
    <member type='way' ref='94551280' role='buildingpart' />
    <member type='way' ref='94551479' role='buildingpart' />
    <member type='way' ref='94551407' role='buildingpart' />
    <member type='way' ref='94551384' role='buildingpart' />
    <member type='way' ref='94551345' role='buildingpart' />
    <member type='way' ref='94551321' role='buildingpart' />
    <member type='way' ref='94551352' role='buildingpart' />
    <member type='way' ref='94551323' role='buildingpart' />
    <member type='way' ref='94551312' role='buildingpart' />
    <member type='way' ref='94551295' role='shell' />
    <member type='way' ref='94551468' role='buildingpart' />
    <member type='way' ref='94551456' role='buildingpart' />
    <member type='way' ref='94551411' role='buildingpart' />
    <member type='way' ref='94551389' role='buildingpart' />
    <member type='way' ref='94551418' role='buildingpart' />
    <member type='way' ref='94551392' role='buildingpart' />
    <member type='way' ref='94551363' role='buildingpart' />
    <member type='way' ref='94551325' role='buildingpart' />
    <member type='way' ref='94551282' role='buildingpart' />
    <member type='way' ref='94551482' role='buildingpart' />
    <member type='way' ref='94551470' role='buildingpart' />
    <member type='way' ref='94551458' role='buildingpart' />
    <member type='way' ref='94551472' role='buildingpart' />
    <member type='way' ref='94551460' role='buildingpart' />
    <member type='way' ref='94551428' role='buildingpart' />
    <member type='way' ref='94551394' role='buildingpart' />
    <member type='way' ref='94551315' role='buildingpart' />
    <tag k='height' v='4' />
    <tag k='level' v='1' />
    <tag k='level:usage' v='academic' />
    <tag k='name' v='1. Obergeschoss' />
    <tag k='type' v='level' />
  </relation>
  ...
</osm>

Klucze i wartości, które powinny być dodane do takiej relacji są wymienione w poniższej tabeli:

Klucz Opis Przykładowa wartość
name=* nazwa poziomu name=Parter
level:usage=* opisuje zastosowanie danego poziomu level:usage=academic, level:usage=residential
height=* wysokość w metrach height=4
level=* podaje numer poziomu (-1 - pierwsza piwnica, 0 - parter, 1 - pierwsze piętro) level=0, level=-2, level=3

Mapowanie wnętrz w JOSM

Ponieważ zaproponowany schemat mapowania IndoorOSM bazuje na węzłach, drogach, relacjach i tagach, użytkownicy mogą używać istniejących edytorów, aby mapować wnętrza budynków.

Poniżej znajduje się krótkie wyjaśnienie jak mapować wnętrza budynków stosując się do schematu IndoorOSM z użyciem programu JOSM.

Sytuacja początkowa

W większości budynków publicznych znajdują się plany pięter (plany ewakuacyjne). Zdjęcia tych planów (zrobionych przez Ciebie) moją służyć jako podstawa do mapowania. Zazwyczaj zdjęcia planów są zdeformowane i trzeba dopasować je tak, aby były prostokątne. Można to zrobić używając programów graficznych takich jak Adobe Photoshop .

PicLayer

Zdj. 4: PicLayer

Aby użyć zdjęcia mapy musisz je otworzyć w JOSM. W tym celu należy zainstalować dodatek PicLayer. Można to zrobić w otwierając okno Wtyczki "Edycja -> Ustawienia -> Konfiguracja dostępnych wtyczek -> Wtyczki" (zobacz Zdjęcie 4).

Następnie, zdjęcie może być załadowane do JOSM poprzez wybranie "PicLayer -> Nowa warstwa z pliku". Po aktywacji odpowiedniej warstwy PicLayer możemy dostosować pozycję i wymiary zdjęcia. Aby to zrobić otaguj końce budynku na zdjęciu (przycisk z zieloną strzałką JOSM-Icon-piclayer-movepoint.png). Zaleca się aby wybrać trzy najważniejsze punkty budynku (zobacz Zdjęcie 5).
Zdj. 5: PicLayer

Zdj. 5: Ustaw punkty w PicLayer

Wybranie odpowiednich trzech punktów dla niektórych budynków może być czasami trudne. Zaznaczone punkty mogą być następnie przeniesione do narożników budynku za pomocą przycisku z czerwoną strzałką JOSM-Icon-piclayer-transformpoint.png (patrz Zdj. 6).

Zdj. 6: PicLayer

Zdj. 6: Punkty na właściwej pozycji

Modelowanie

Zdj.8: Prawidłowo otagowane pomieszczenie

Przed rozpoczęciem mapowania należy aktywować warstwę OSM. Następnie można tworzyć pomieszczenia i inne obiekty. Zaleca się, aby poszczególne pomieszczenia przylegały do siebie. Zazwyczaj, podczas tworzenia map, unika się dublowania punktów oraz dróg, ale podczas tworzenia ich wewnętrznych odpowiedników nie uznaje się tego za błąd. Aktualnie jest to najbardziej optymalny sposób na tworzenie pokoi, ponieważ większość z nich to wielokąty. Wyjątkiem mogą być tutaj korytarze i inne nieregularne pomieszczenia. Propozycja rozwiązania tego problemu znajduje się w sekcji Pl:IndoorOSM#Korytarze.

4PoDopasowaniu.jpg

Zdj.7: Budynek gotowy do mapowania

Pomieszczenia

Wartość Opis Przykłady
buildingpart=* Domyślna wartość dla każdego pomieszczenia. Ważnym jest aby prawidłowo określić jego typ. buildingpart=room - zwykłe pomieszczenie lub pomieszczenie dla którego nie możemy określić jego typu
buildingpart=hall - korytarz lub hol, może też oznaczać duże, otwarte pomieszczenie
buildingpart=corridor - domyślna wartość dla korytarzy
buildingpart=verticalpassage - pomieszczenie, które znajduje się na więcej niż jednym poziomie, np. klatka schodowa
name=* Nazwa pomieszczenia name=Reserved, name=Kuchnia
ref=* Numer referencyjny pomieszczenia, np. numer pokoju hotelowego, sklepu. ref=101, ref=01.15
height=* Wysokość pomieszczenia podawana w metrach. height=3, height=2.5
Korytarz o nieregularnym kształcie stworzony za pomocą dwóch części
Korytarze

Wszystkie pomieszczenia będące korytarzami powinny mieć wartość buildingpart=corridor. Jeżeli korytarz ma kształt nieregularny (np. otacza część sklepów) dzielimy go na dwie lub więcej części i tworzymy kilka takich obiektów zamiast jednego. Po renderingu nie widać różnicy, czy dany hol składa się z dwóch czy z jednej części. Jeśli masz inny pomysł na rozwiązanie tego problemu dołącz do dyskusji Talk:Pl:IndoorOSM.

UWAGA! Dzielenie na dwa sąsiadujące obszary jest nieaktualne. Obecnie należy zrobić multipolygon z odpowiednimi tagami i dodać go do relacji piętra!


Wartość Opis Przykłady
name=* Nazwa korytarza name=Foyer
ref=* Kod korytarza. Najczęściej jest to numer pomieszczenia ref=101, ref=01.15
height=* Wysokość podawana w metrach height=3, height=2.5
Parkingi wewnętrzne

Jeżeli parking lub miejsca parkingowe znajdują się poza tworzonym budynkiem, tj. poza jego granicami tworzymy je według standardów OSM. Jeśli parkingi są zabudowane lub znajdują się na dachu możesz postępować według następującego schematu. Na samym początku dla pomieszczenia, w którym znajduje się parking dodaj wartość buildingpart=parking. Następnie wyrysuj parking w miarę swoich możliwości. Możesz tworzyć wszystkie miejsca parkingowe jako oddzielne jeśli dysponujesz szczegółowymi mapami i masz chwilę czasu aby to zrobić. W przeciwnym razie obrysuj odpowiednie pasy miejsc parkingowych lub cały parking.

Wartość Opis Przykład
Wartości dla pojedynczych miejsc parkingowych
ref=* Numer miejsca parkingowego ref=15
disabled=* Miejsce postojowe przeznaczone dla osób niepełnosprawnych disabled=yes
Wartości dla grupy miejsc parkingowych lub całego parkingu. W przypadku tworzenia pojedynczych miejsc parkingowych dodaj te wartości do relacji parkingu.
name=* Nazwa parkingu name=Parking miejski
fee=* Opłaty za korzystanie fee=yes, fee=no, fee=interval - w określonym przedziale czasowym
supervised=* Parking strzeżony supervised=yes, supervised=no, supervised=interval - w określonym przedziale czasowym
disabled=* Miejsca postojowe przeznaczone dla osób niepełnosprawnych disabled=yes, disabled=25 - liczba miejsc dla osób niepełnosprawnych
maxstay=* Maksymalny czas postoju w godzinach maxstay=2

Schody

Na dzień dzisiejszy nie zostały wypracowane standardy dotyczące tworzenia schodów. Dołącz do dyskusji na temat tego oraz innych elementów mapowania wewnętrznego pod adresem Talk:Pl:IndoorOSM.

Drzwi

Prawidłowo stworzone drzwi to punkt leżący w samym ich środku. Dla każdej pary drzwi należy stworzyć oddzielny punkt (węzeł) nawet jeśli jest ich wiele obok siebie.

Wartość Opis Przykłady
door=* Domyślna wartość dla każdej pary drzwi. Możemy zdefiniować również ich typ. door=yes
door=manual - ręczne
door=automatic - automatyczne
width=* Szerokość wyrażona w metrach. width=1
height=* Wysokość wyrażona w metrach height=2


Okna

Okna tworzymy za pomocą węzłów (punktów) tak, aby te punkty możliwie na samym środku okna.

Wartość Opis Przykłady
window=* Domyśla wartość dla każdego okna. Możemy zdefiniować również jego typ. window=yes
window=glass - okno wykonane ze szkła
window=lattice_window - okno z kratami lub witrażowe
width=* Szerokość okna wyrażana w metrach. width=2
height=* Wysokość pojedynczego okna wyrażana w metrach. height=1.2
breast=* Odległość dolnej ramy okna od podłoża. Domyślnie wyrażana w metrach. breast=1.3

Punkty POI

Tagujemy za pomocą standardowych tagów lecz dodatkowo dodajemy z rolą poi to relacji piętra.

Relacje

Ponieważ wszystkie elementy budynku na odpowiednim piętrze należą do jednej relacji, trzeba połączyć wszystkie te elementy (pokoje, korytarze, itp.) w jedną relację. Jeśli panel relacji nie jest widoczny po prawej stronie możesz go aktywować klikając "Okna -> Relacje". Teraz wszystkie obiekty mogą być oznaczone, jako człon jednej relacji, używając przycisku JOSM-Icon-conflict-copystartright.svg. Każdy człon relacji musi mieć nadaną rolę. Tylko zewnętrzna ściana budynku powinna być oznaczona jako "shell" - resztę obiektów oznacza się jako "buildingpart". Później, inne właściwości takie jak wysokość, poziom, typ i inne moga być dodane do relacji (patrz Zdj. 9).

6PrawidlowoOtagowanePietro.jpg

Zdj.9: Relacja podrzędna - relacja piętra

Ponieważ cały budynek jest jedną dużą relacją (wszystkie relacje-piętra są relacjami podrzędnymi relacji tego budynku), relacja piętro musi zostać dodana do relacji budynek. Rola relacji piętro to odpowiedni numer poziomu (piętra). Przykładowo relacja:level_0 odnosi sie do parteru, relacja:level_1 do pierwszego piętra a relacja:level_-1 do piwnicy. Te role sa bardzo ważne ponieważ są one używane do filtrowania (patrz poniżej). Właściwości dla całego budynku mogą zostać również dodane (patrz Zdj.10)
7PrawidlowoOtagowanyBudynek.jpg

Fig.10: Relacja nadrzędna - relacja budynku

Tworzenie kolejnego piętra

Jeśli utworzyłeś już całe piętro i chcesz stworzyć następne, piętra już stworzone mogą zostać ukryte. Można to zrobić za pomocą filtrów (patrz "Zasady tworzenia filtrów"). Relacje mogą być powielane (CTRL + D), więc schody, windy, itp. mające taką samą pozycję mogą być łatwiej przemieszczane. W tym przypadku nazwa i rola odpowiedniego piętra muszą zostać zmienione.

Tworzenie zasad filtrowania

Zdj. 11: Wybieranie panelu filtrowania w JOSM

JOSM umożliwia nam filtrowanie danych. Ponieważ dane budynków wewnętrznych zazwyczaj się nakładają, bardo wygodnym jest aby stworzyć filtry. Pozwalają nam one wybrać tylko jeden poziom budynku, więc mapowanie jest łatwe i proste.

Panel filtrów znajduje się w prawym dolnym rogu interfejsu graficznego. Zazwyczaj nie jest on wyświetlany, ale można go łatwo włączyć klikając Okna > Filtry (patrz Zdjęcie 11). Poprzez kliknięcie przycisku Dodaj pokaże się nowe okno dialogowe. Tutaj należy zdefiniować reguły filtrowania. Najłatwiejszym sposobem na filtrowanie danych IndoorOSM jest filtrów w oparciu o rolę relacji (pamiętaj: każda relacja piętra ma odrębną rolę w relacji budynku. Przykładowo parter ma rolę level_0, pierwsze piętro level_-1 i tak dalej).

Ponieważ chcemy ukryć całe piętro, musimy filtrować wszystkie relacje podrzędne z ich odpowiednimi rolami. Ponadto chcemy ukryć wszystkie punkty (okna, drzwi, itp.). Te dwie zasady mogą być połączone w jeden filtr używając operatora logicznego OR (LUB).

Przykłady reguł filtrowania:

  • (child role:level_-1) OR (child child role:level_-1)
  • (child role:level_0) OR (child child role:level_0)
  • (child role:level_1) OR (child child role:level_1)
  • (child role:level_2) OR (child child role:level_2)

Alternatywna możliwość filtrowania to filtrowanie według numeru poziomu.

Alternatywne zasady filtrowania:

  • (child level=-1) OR (child child level=-1)
  • (child level=0) OR (child child level=0)
  • (child level=1) OR (child child level=1)
  • (child level=2) OR (child child level=2)

W JOSM możesz stworzyć dowolną liczbę filtrów, więc możesz łatwo dodać filtry dla wszystkich wymaganych poziomów. Jeśli aktywujesz wszystkie reguły filtrowania oprócz jednej, JOSM pokaże pożądany poziom budynku. Przykładowo na zdjęciu 12, JOSM pokaże poziom 1 - reszta poziomów będzie ukryta. Aktywowanie filtra następuje poprzez kliknięcie pierwszego, lewego pola wyboru. Drugie (po prawo) pole wyboru może być wykorzystane do ukrycia elementów filtra (pole wyboru jest zaznaczone) lub zamazania elementów (pole wyboru jest odznaczone).

Filters.jpg

Figure 12: Przykładowe filtry w OSM

Elementy w budynku

Pomieszczenia

Lotnisko

Obiekty na lotnisku

Tagi Opis
buildingpart=room,room=passport control + do relacji piętra jako buildingpart Kontrola paszportowa
buildingpart=room,room=security check + do relacji piętra jako buildingpart Kontrola bezpieczeństwa
amenity=check-in + do relacji piętra jako poi Stanowiska check-in

Dworzec

Galeria handlowa

Przykłady

Za pomocą tego schematu zostało stworzonych wiele budynków. Wzorcem jest tutaj budynek w Heidelbergu, który można brać za przykład do tworzenia swoich map wewnętrznych.

Budynki

Przeglądanie

Aktualnie nie istnieje oficjalna strona fundacji OSM, która pozwala na przeglądanie map budynków. Istnieją jednak projekty dzięki którym jest to możliwe.

Problemy

Budynek nie wyświetla się na mapie

  • Strona pobiera dane za pomocą Overpass więc należy chwilę poczekać
  • Zapytanie do overpass jest skonstruowane w ten sposób, że obrys budynku otagowany powinien być za pomocą level=0 building=yes (przykład: http://www.openstreetmap.org/browse/way/167670413 )