Pl:Relation:multipolygon

From OpenStreetMap Wiki
Jump to navigation Jump to search
Public-images-osm logo.svg multipolygon
Multipolygon Illustration 6.svg
Opis
Grupowanie złożonych obszarów. Show/edit corresponding data item.
Grupa: właściwości
Człony
  • linia – outer (zewnętrzny)
  • linia – inner (wewnętrzny)
Status: w rzeczywistości

Relacja multipolygon (po polsku wielokąt złożony) jest stosowana do przedstawiania złożonych obszarów.

Opis

Proste obszary są odwzorowywane w OSM, poprzez utworzenie jednej linii i dodanie do niej jej znaczników, które sugerują obszar zamiast tylko konturu obszaru.
Na przykład, kontur oznaczony jako landuse=forest będzie można uznać za obszar, natomiast zaokrąglony kontur oznaczony junction=roundabout już takim obszarem nie będzie.

Jednak model ten działa tylko na obszarach, w których kontur składa się z jednej linii i który nie ma otworów. Każdy obszar, który jest bardziej złożony niż ten (np. ponieważ jego kontur składa się z kilku linii połączonych ze sobą, lub powierzchnia składa się z wielu niezależnych części lub ma dziury) wymaga relacji multipolygon.

W skrócie, relacja multipolygon może mieć dowolną liczbę linii w roli rola outer (obrys zewnętrzny) i dowolną liczbę linii w roli rola inner (obrys wewnętrzny), a te znowu muszą, w jakiś sposób, utworzyć z nich wielobok. Zaleca się jednak, aby relacja nie była zbyt duża, jeżeli nie jest to konieczne.

W wielu przypadkach da się wyrysować obszary nie używając do tego wielokąta złożonego, dlatego zawsze przed użyciem zastanów się czy musisz go zastosować i czy nie można podzielić obszaru, który chcesz opisać tą relacją na mniejsze części składowe. Na przykład zamiast jednego wielkiego wielokąta złożonego pól uprawnych możesz zastosować kilka zwykłych obszarów pól. Ułatwia to także późniejsze poprawki tych obszarów, łatwiej poprawić jeden mniejszy obszar pola/łąki itp niż ogromną relację.

Oznaczenia

Klucz Wartość Opis
type multipolygon Korzystanie z zasady budowania obszaru opartego na elementach.

Elementy

Element Rola Liczba Opis
linia rola outer jedna lub więcej Linia tworząca pierścień zewnętrzny danego obszaru.
linia rola inner jedna lub więcej Linia tworząca pierścień wewnętrzny danego obszaru.

Użycie

Zamierzone użycie wieloboków jest następujące:

  • Znaczniki opisujące wielobok (np. landuse=forest) "powinny przejść na relację". Zewnętrzna linia powinna pozostać nieoznaczona.
  • Należy zawsze umieszczać znaczniki wieloboku w relacji a nie na liniach, które wchodzą w jej skład.
  • Jeśli rola inner linia reprezentuje coś w sobie (np. las z otworem, gdzie otwór jest jeziorem), wówczas wewnętrzna linia powinna być oznaczona jako taka, w przeciwnym razie linia wewnętrzna powinna pozostać "nieoznaczona".
  • Kierunek linii nie ma znaczenia.
  • Kolejność członów relacji nie ma znaczenia, jednakże przy posortowaniu członów relacji wiemy na pewno, czy relacja jest zamknięta.

Prawidłowe warunki dla wielokąta

Relacje wielokątów złożonych mogą być używane aby tworzyć wielokąty w zgodności ze standadem OGC Simple Feature (strona w języku angielskim) (Przykłady zgodności ze standardem OGC). Wszystko co nie jest poprawnym wielokątem złożonym w odniesieniu do tego standardu (np. wielokąty z nachodzącymi na siebie pierścieniami) powinno być uznawane za relację błędną, z wyjątkiem przypadku opisanego poniżej.

Poprawny wielokąt (zamknięty) to wielokąt, który składa się z połączonych ze sobą linii, których punkty końcowe są ze sobą połączone i tworzą w ten sposób wielokąt zamknięty.

Linię niezamkniętą definiujemy jako zbiór węzłów w którym pierwszy węzeł jest inny niż ostatni.

Warunki aby utworzyć poprawny wielokąt złożony (multipolygon) są następujące:

  • Linie będące członem relacji wielokąta złożonego muszą tworzyć zamknięte wielokąty. [1]
  • Tylko dwie niezamknięte linie i nie więcej mogą współdzielić ze sobą punkty końcowe.
    • W przypadku, gdy punkt końcowy jest współdzielony przez mniej niż dwie zamknięte linie, wielokąt nie może zostać zamknięty i jest utworzony niepoprawnie.
    • W przypadku, gdy punkt końcowy jest współdzielony przez więcej niż dwie niezamknięte linie jest on utworzony niepoprawnie i nie może być jednoznacznie naprawiony. (Wyjątek – punkty współdzielone przez parzystą liczbę niezamkniętych linii mogą równocześnie stykać się z liniami zewnętrznymi co jest dopuszczalne.)
  • Linie z rolą inner NIE MOGĄ nachodzić na linie z rolą outer bądź być ze sobą sklejone.

Przykłady

Jeden zewnętrzny i jeden wewnętrzny pierścień

Widok relacji wielokąta złożonego z jednym elementem w roli outer i jednym w roli inner w programie JOSM
Najbardziej podstawowy przykład zastosowania tego typu relacji.
<relation id="1">
  <tag k="type" v="multipolygon" />
  <member type="way" id="1" role="outer" />
  <member type="way" id="2" role="inner" />
</relation>
Szkic 1: Jeden zewnętrzny i jeden wewnętrzny pierścień

Jeden zewnętrzny i dwa wewnętrzne pierścienie

<relation id="1">
  <tag k="type" v="multipolygon" />
  <member type="way" id="1" role="outer" />
  <member type="way" id="2" role="inner" />
  <member type="way" id="3" role="inner" />
</relation>
Szkic 2: Jeden zewnętrzny i dwa wewnętrzne pierścienie

Wiele linii, tworzących pierścień

Zaawansowany schemat "multipolygon" pozwala każdemu wewnętrznemu lub zewnętrznemu pierścieniowi składać się z więcej niż jednej linii łamanej. Jest to przydatne w przypadku wielokątów obejmujących bardzo duże obszary, gdzie byłoby to bardzo niepraktyczne, aby mieć jedną linię łamaną biegnącą wokół całości:
<relation id="1">
  <tag k="type" v="multipolygon" />
  <member type="way" id="1" role="outer" />
  <member type="way" id="2" role="outer" />
  <member type="way" id="3" role="inner" />
</relation>
Szkic 3: Multiple ways forming a ring

Dwa rozdzielone pierścienie zewnętrzne

W przeciwieństwie od starego stylu wielokąta, zaawansowana relacja "multipolygon " pozwala również na dowolną liczbę pierścieni zewnętrznych, a tym samym aby były prawdziwymi wielokątami:
<relation id="1">
  <tag k="type" v="multipolygon" />
  <member type="way" id="1" role="outer" />
  <member type="way" id="2" role="outer" />
</relation>
Szkic 4: Dwa rozdzielone pierścienie zewnętrzne

Dwa rozdzielone pierścienie zewnętrzne i wiele linii tworzących pierścień

Możliwość łączenia poszczególnych odcinków w pierścień nie jest ograniczona do pierścieni zewnętrznych, może być również stosowana do wewnętrznych pierścieni:
<relation id="1">
  <tag k="type" v="multipolygon" />
  <member type="way" id="1" role="outer" />
  <member type="way" id="2" role="inner" />
  <member type="way" id="3" role="inner" />
  <member type="way" id="4" role="outer" />
  <member type="way" id="5" role="inner" />
</relation>
Szkic 5: Dwa rozdzielone pierścienie zewnętrzne i wiele linii tworzących pierścień

Złożona kombinacja wszystkich zaawansowanych możliwości

Ten przykład pokazuje złożoną kombinację wszystkich zaawansowanych funkcji: trzy zewnętrzne pierścienie, z których dwa mają jeden lub więcej pierścieni wewnętrznych, a wiele z nich składa się z więcej niż jeden linii.
<relation id="1">
  <tag k="type" v="multipolygon" />
  <member type="way" id="1" role="outer" />
  <member type="way" id="2" role="outer" />
  <member type="way" id="3" role="outer" />
  <member type="way" id="4" role="outer" />
  <member type="way" id="5" role="inner" />
  <member type="way" id="6" role="inner" />
  <member type="way" id="7" role="inner" />
  <member type="way" id="8" role="inner" />
  <member type="way" id="9" role="inner" />
  <member type="way" id="10" role="inner" />
  <member type="way" id="11" role="inner" />
  <member type="way" id="12" role="outer" />
  <member type="way" id="13" role="outer" />
  <member type="way" id="14" role="outer" />
  <member type="way" id="15" role="outer" />
  <member type="way" id="16" role="inner" />
  <member type="way" id="17" role="inner" />
  <member type="way" id="18" role="inner" />
  <member type="way" id="19" role="inner" />
  <member type="way" id="20" role="outer" />
</relation>
Szkic 6: Złożona kombinacja wszystkich zaawansowanych możliwości

Wyspa w otworze

Korzystając z możliwości posiadania wielu pierścieni zewnętrznych w jednej relacji, wynika również, że można łatwo modelować "wyspy" w otworze:
<relation id="1">
  <tag k="type" v="multipolygon" />
  <member type="way" id="1" role="outer" />
  <member type="way" id="2" role="inner" />
  <member type="way" id="3" role="outer" />
</relation>

Taki szkic jak ten, wymagał wcześniej różnych relacji "multipolygon", jeden z "linią 1" jako zewnętrzną i "linią 2" jako wewnętrzną, a także jedną z "linią 2" jest zewnętrzną i "linią 3" jako wewnętrzną. Takie kaskadowe ujęcie jest nadal potrzebne, gdy "wyspa" jest w środku czegoś innego niż obszar na zewnątrz, ale gdzie "wyspa" jest tym samym środowiskiem który może być otworem w otworze.

Szkic 7: Wyspa w otworze

Stykające się pierścienie wewnętrzne

Stykające się pierścienie dowolnego rodzaju powinny być wyrysowane linią zamkniętą (closed ways), jeśli w ogóle, w przeciwnym wypadku są bardzo trudne do obróbki przez innych użytkowników. Tak więc linia #2 i linia #3 powiinny być liniami zamkniętymi. Jeśli to możliwe, najlepiej jest połączyć je w jedną linię łamaną, jeśli reprezentują one tę samą funkcję.

Niektórzy mapujący używają bieżącej relacji "multipolygon" do łączenia stykających się pierścieni wewnętrznych:
<relation id="1">
  <tag k="type" v="multipolygon" />
  <member type="way" id="1" role="outer" />
  <member type="way" id="2" role="inner" />
  <member type="way" id="3" role="inner" />
</relation>

Wdrażanie zaawansowanych wielokątów powinno próbować uczynić je tak, jakby stykające się pierścienie były rzeczywiście jednym pierścieniem. To jest jedyny przypadek, w którym wykorzystanie w OpenStreetMap odbiega od standardowych OGC Simple Features. W Simple Features, stykające się pierścienie wewnętrzne nie są obsługiwane, ponieważ są one zbędne (po co dwa pierścienie wewnętrzne kiedy można je połączyć w jeden).
W OpenStreetMap, czasami ma sens jeśli oznaczamy je indywidualnie, na przykład las z otwarciem, które jest w połowie zajęte przez jezioro a w połowie przez użytki rolne – można wtedy mieć również dwie "dziury" w lesie, jedną oznaczoną jako natural=water a drugą jako landuse=farmland. Jest to bardzo wygodny skrót.
Wymaganie od mapującego stworzenia tylko jednej dziury w lesie, a następnie tworzenie indywidualnych wielokątów dla jeziora i pola uprawnego, byłoby zbyt dużą pracą dla niego.

Unikajmy "building multipolygon", w którym wewnętrzny pierścień dotyka zewnętrznego pierścienia.

Szkic 8: Stykające się pierścienie wewnętrzne

Przykłady jak nie należy postępować

Przykłady nieprawidłowych relacji "multipolygon" do zilustrowania jak nie powinno się postępować z tego typu relacją.

Niezamknięte wielokąty

To jest przykład niepoprawnego wielokąta kiedy "linia #2" i "linia #3" nie są połączone.
Szkic 9: Nieprawidłowe, niezamknięte wielokąty

Nakładające się na siebie, niezamknięte odcinki należące do tej samej roli

To jest przykład' niepoprawnego wielokąta kiedy punkty końcowe "linii #2" i "linii #3" mają wspólne więcej niż dwie linie.


Szkic 9: Nakładające się na siebie, niezamknięte odcinki należące do tej samej roli

Więcej przykładów

Oznaczanie

  • Wszystkie tagi które opisują dany obszar powinny być przypisane do relacji a nie do linii, tj. linie będące członami relacji wielokąta złożonego nie powinny posiadać znaczników.
  • Wyświetlanie i zgodność:
    • Styl wyświetlania relacji jest oparty na znacznikach w niej zawartych.
    • W przypadku relacji bez tagów, linie w niej zawarte są wyświetlane w stylu zwykłej linii bez znaczników.
    • W przypadku innego tagu linii z rolą inner, linia ta będzie się wyświetlać zgodnie z jej tagiem a nie tagiem głownej relacji.

Renderowanie

  • JOSM jest w stanie wyświetlać zaawansowane wielokąty złożone od poprawki 1203
  • Osmarender (T@H) obsługuje zaawansowane wielokąty złożone.
  • Konfiguracja renderowania mapnik na www.openstreetmap.org nie wspiera w pełni zaawansowanych wielokątów złożonych (do zweryfikowania?)
  • W pełni wspierane przez mkgmap od poprawki 1497
  • [GpsMid] wspiera większą część z zaawansowanych fukcji wielokątów złożonych.
  • Istnieje sugerowany algorytm do obsługiwania wielokątów złożonych

Style mapowania, najlepsze sposoby

Wielokąty złożone otwierają możliwość tworzenia identycznych geometrycznie obiektów w różnych stylach: jako linie lub jako wielokąty złożone, używając zamkniętych lub otwartych linii, bądź też współdzielone i nie współdzielone linie.

W związku z tym powstaje pytanie, który styl należy stosować. Pewne style mają zalety, których inne style nie mają i powinny być uznane za dobrą praktykę. Dla innych, wybór jest kwestią osobistych preferencji i kwestią czy użytkownik jest doświadczony czy nie.

W przypadku, gdy duże obszary współdzielą te same znaczniki, można to przedstawić w postaci albo dużej liczby małych wielokątów złożonych/zamkniętych linii albo poprzez małą liczbę dużych wielokątów złożonych. Dla samych wielokątów złożonych istnieją dwie metody mapowania:

Metoda A
Wewnętrzne i zewnętrzne pierścienie tworzone są z linii zamkniętych o ile to możliwe, z wyjątkiem gdy te linie stają się bardzo duże (rzędu 2000 węzłów). Linie nie są zwykle wspólne dla różnych wielokątów
Metoda B
Każdy granica między dwoma wielokątami jest reprezentowana przez unikalną linię która jest następnie wspólna dla sąsiadujących wielokątów. W związku z tym pierścienie często składają się z kilku osobnych odcinków

Kwestia dobrych praktyk dla wielokątów złożonych była intensywnie omawiana w ostatnich latach, zobacz Talk:Relation:multipolygon i na forach. Konsensus dotychczas nie został osiągnięty, ale z dyskusji wyniknęły następujące wnioski:

  • Mapowanie prostych zamkniętych obszarów jako wielokątów złożonych zwiększa liczbę obiektów w bazie danych i zwiększa czas renderowania. Powinna się unikać zbyt dużego stopnia skomplikowania danych.
  • Współdzielenie części linii pomiędzy wielokątami złożonymi (metoda B) oferuje unikanie zbędnego przedstawiania nakładających się na siebie linii.
  • Wielokąty złożone składające się z niezamkniętych linii (metoda B) są cięższe w edycji dla niedoświadczonych użytkowników i prostych edytorów jak Potlach 2. To często prowadzi do nieświadomego zniszczenia takich wielokątów złożonych przez niczego nie podejrzewających użytkowników.
  • Wielu doświadczonych użytkowników wyraziło swój dyskomfort co do metody B, szczególnie w przypadku, gdy wielokąty złożone są bardzo duże.
  • Ogromne wielokąty złożone powodują spowolnienie procesu renderowania.
  • Edytowanie skomplikowanych geometrii w JOSM jest łatwiejsze, szybsze i powodujące mniejszą liczbę błędów w przypadku użycia metody A. Związane to jest z tym, że metoda B wymaga kasowania, tworzenia i wstawiania wielu segmentów do odpowiednich relacji wielokątów złożonych.

Dotychczas nie ma oficjalnych zakazów w jaki sposób używać wielokątów złożonych dopóki są one geometrycznie poprawne. Jednakże wprowadzenie rozsądnego stylu mapowania może pomóc utrzymanie czystości bazy danych i utrzymanie łatwego mapowania dla każdego użytkownika.

Jednakże POWINNO SIĘ stosować tylko metodę A, ponieważ wady metody B przewyższają jej zalety. Dlatego stosowanie metody B jest niezalecane.

Krótki poradnik tworzenia prostej relacji w JOSM

Dwie linie, które wkrótce staną się członami relacji:
Aby utworzyć relację naciśnij zaznaczony przycisk
Na twoim ekranie pojawi się takie okienko, wpisz w zaznaczonym na czerwono miejscu opisujące ją znaczniki tj podstawowy type=multipolygon i znacznik jakim opisujesz obszar, w tym przypadku natural=wood
Przesuń okienko na bok i wybierz linie które chcesz dodać do relacji. Obiekty, które wybierzesz pojawią się w okienku relacji w kategorii zaznaczenie. Do relacji dodajesz je używając zaznaczonego na czerwono przycisku.
Po dodaniu obiektów do relacji nadaj im odpowiednie role. Dla linii zewnętrznej rola outer a dla linii wewnętrznej rola inner. Naciśnij przycisk OK i relacja zostanie utworzona.
Relacja jest gotowa. Zaznacz teraz obiekt wewnętrzny aby dodać mu jego własne znaczniki. W tym przypadku będzie to staw i znaczniki natural=water i water=pond.
Jeżeli wszystko wykonaliśmy poprawnie po zaznaczeniu relacji będzie ona w JOSM w domyślnym stylu podświetlona na fioletowo. Pojawi się też ona po prawej stronie w spisie relacji.

Historyczne funkcje dziś niestosowane

multipolygon miał zastosowanie głównie w Niemczech, zamiast type=boundary dla relacji granic. Metoda ta nie była powszechnie zaakceptowana i dziś nie jest już stosowana.
Oprócz ról rola outer i rola inner istniały także "puste" role oraz rola enclave i exclave. Obecnie nie są one stosowane.

Zobacz też

multipolygon