Pl:IndoorOSM
Zobacz również IndoorOSM on Android.
IndoorOSM | |
---|---|
Proposal status: | Obsoleted (inactive) |
Zaproponowana przez: | Gomar1985 |
Dotyczy: | |
Definicja: | Główne cechy modelu propozycji to:
|
Opracowane: | 2011-11-29 |
Schemat tworzenia
Budynek - relacja nadrzędna
For first results see Simple 3D Buildings.
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).
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
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ą ). Zaleca się aby wybrać trzy najważniejsze punkty budynku (zobacz Zdjęcie 5).
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ą (patrz Zdj. 6).
Zdj. 6: Punkty na właściwej pozycji
Modelowanie
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.
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 |
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 . 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).
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)
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
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).
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.
- Instytut Geografii w Heidelberg
Budynki
- Indoor#Places Lista budynków na świecie
- WikiProject_Poland/Indoor Lista budynków w Polsce
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.
- Indoor | OpenStreetMap Polska - strona w fazie rozwojowej
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 )