Cs:Relation:multipolygon

From OpenStreetMap Wiki
Jump to navigation Jump to search
Public-images-osm logo.svg multipolygon
Multipolygon Illustration 6.svg
Popis
Relace multipolygon slouží ke kreslení složitých ploch. Show/edit corresponding data item.
Skupina: Vlastnosti
Členy

  • cesta - outer (vnější)
  • cesta - inner (vnitřní)
Status: de facto

Relace typu multipolygon slouží ke kreslení složitých ploch.

Jednoduché plochy se v OSM kreslí jako cesty uzavřené do kruhu a označí se nějakou značkou, která vyjadřuje, že se ve skutečnosti jedná nikoliv o uzavřenou cestu, ale o plochu. Například o uzavřené cestě označené landuse=forest se předpokládá, že je to plocha, ale byla-li by označená junction=roundabout, pak je na ni stále nahlíženo pouze jako na cestu.

Jenže tato metoda funguje pouze pro plochy, jejichž hranice se skládá pouze z jedné cesty a ve které nejsou žádné díry. Jakákoliv plocha, která je složitější (například její hranice je složena z více cest spojených za sebe, nebo se skládá z několika nesouvislých částí, nebo jsou v ní díry) vyžaduje pro své zakreslení použití relace multipolygon.

Jednoduše řečeno relace multipolygon může mít libovolný počet cest v roli outer (vnější obvod) a libovolný počet cest v roli inner (díry), tyto cesty musí nějak dohromady dávat uzavřené kruhy, ze kterých je polygon sestaven.

Poznámka: Dříve byly relace type=multipolygon používány zejména v Německu namísto relací type=boundary pro kreslení hranic zemí. Tento způsob použití ovšem nebyl přijat většinou a nyní by se již neměl používat.

Značky

Klíč Hodnota Vysvětlení
type multipolygon Sděluje aplikaci, že má pro vykreslování prvků použít pravidla pro vytváření ploch.

Prvky

Cesta nebo Uzel Role Počet Vysvětlení
cesta outer jedna nebo více Cesty, ze kterých se skládá vnější hranice plochy.
cesta inner žádná nebo více Cesty, které tvoří vnitřní hranice plochy.
cesta žádná Nepoužívat, zastaralé. Nástroje by to měly zpracovávat stejně jako outer.
cesta enclave Nepoužívat, zastaralé. Nástroje by to měly zpracovávat stejně jako inner. Toto využívaly hlavně relace boundary.
cesta exclave Nepoužívat, zastaralé. Nástroje by to měly zpracovávat stejně jako outer. Toto využívaly hlavně relace boundary.

Použití

Doporučené použití multipolygonu je takovéto:

  • Značky, které popisují multipolygon (např. landuse=forest) se vždy přidávají na relaci. Vnější cesty by měly zůstat bez značek, pokud ovšem značky nepopisují něco přímo souvisejícího s vnější cestou. Například les může být ohraničen čtyřmi ploty, v tomto případě tedy ony čtyři cesty budou označeny značkou barrier=* a stále mohou být použity jako vnější prvky outer relace lesa.
  • Pokud vnitřní cesta inner popisuje něco sama o sobě (např. les s dírou, kde díra je jezero), pak můžete vnitřní cestu označit přidáním značek přímo na ni.
  • V ostatních případech by vnitřní cesta měla zůstat bez značek.
  • Na směru cest nezáleží.
  • Na pořadí prvků v relaci nezáleží (ovšem dobře seřazený seznam prvků relace může pomoci ve snazší orientaci, až další uživatelé budou vaši relaci kontrolovat či dále upravovat).

Pravidla pro vytváření multipolygonů

Pravidla pro vytváření multipolygonů v OSM se řídí standardem OGC Simple Feature standard(en) (Obrázkové příklady vytváření multipolygonů(en)). Jakýkoliv multipolygon, který nesplňuje podmínky tohoto standardu (např. multipolygon s protínajícími se kruhy) není platným multipolygonem ani v OSM s jedinou výjimkou, kterou jsou dotýkající se vnitřní kruhy (viz dále).

Platný (uzavřený) polygon je definován jako spojení podmnožiny jeho cest které, když jsou spojeny jejich koncové uzly, vytvoří uzavřený polygon.

Otevřená cesta je definována jako spojnice uzlů, ve které první uzel je odlišný od posledního.

Podmínky pro vytvoření platné relace multipolygonu jsou následující:

  • Cesty obsažené v relaci multipolygonu MUSÍ tvořit jeden nebo více uzavřených polygonů. Když jsou cesty patřící do relace spojeny, musí tvořit jeden nebo více uzavřených řetězů ( Polygon).
  • Právě dvě neuzavřené cesty a nikoliv více mohou sdílet koncový uzel.
    • Je-li koncový uzel sdílen méně než dvěma cestami, pak polygon nemůže být uzavřen a tedy není správně vytvořen. Příklad nesprávného použití 1
    • Je-li koncový uzel sdílen více než dvěma cestami, pak ho nelze jednoznačně uzavřít a je tedy nesprávně vytvořen. Příklad nesprávného použití 2 (Výjimka - uzly sdílené sudým počtem neuzavřených cest mohou být částí dotýkajících se vnitřních kruhů, což je v pořádku.)
  • Vnitřní polygony se nesmí překrývat s vnějšími polygony ani se dotýkat společnými částmi (kromě izolovaných uzlů, jak je popsáno výše). Překrývání se dá zcela vyhnout přetvarováním polygonu.

Příklady

Jeden vnější a jeden vnitřní kruh

Starý hodně používaný typ relace multipolygon dovoloval použít pouze jeden kruh jako vnější hranici a libovolný počet vnitřních kruhů, všechny kruhy ovšem musely být tvořeny jedinou kruhovou cestou. Tento druh multipolygonu (který se měl jmenovat spíše jen multi-way) je samozřejmě stále používaný, ale pravidla byla od té doby více uvolněna, takže dnes je to jeden zvláštní případ obecného multipolygonu.
<relation id="1">
  <tag k="type" v="multipolygon" />
  <member type="way" id="1" role="outer" />
  <member type="way" id="2" role="inner" />
</relation>
Obrázek 1: Jeden vnější a jeden vnitřní kruh

Jeden vnější a dva vnitřní kruhy

<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>
Obrázek 2: Jeden vnější a dva vnitřní kruhy

Více cest tvořících kruh

Rozšířená definice multipolygonu dovoluje, aby se jakýkoliv vnější nebo vnitřní kruh skládal z více než jedné cesty. To je často využíváno při kreslení multipolygonů pokrývajících rozsáhlé oblasti, kde by nebylo praktické muset mít jen jednu cestu obklopující celou oblast.
<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>
Obrázek 3: Více cest tvořících kruh

Dva disjunktní vnější kruhy

Na rozdíl od dřívějších dob rozšířená definice multipolygonu umožňuje použít libovolný počet vnějších kruhů. Jedná se tedy o skutečný multipolygon.
<relation id="1">
  <tag k="type" v="multipolygon" />
  <member type="way" id="1" role="outer" />
  <member type="way" id="2" role="outer" />
</relation>
Obrázek 4: Dva disjunktní vnější kruhy

Dva disjunktní vnější kruhy a více cest tvořících kruh

Možnost tvořit kruh z více jednotlivých cest není omezena jen na vnější kruhy, ale může být použita i na vnitřní kruhy:
<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>
Obrázek 5: Dva disjunktní vnější kruhy a více cest tvořících kruh

Složitější kombinace všech rozšířených vlastností

Tento příklad ukazuje složitější kombinace všech rozšířených vlastností: tři vnější kruhy, dva z nich mají jeden nebo více vnitřních kruhů a hodně z nich se skládá z více než z jedné cesty.
<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>
Obrázek 6: Složitější kombinace všech rozšířených vlastností

Ostrov uvnitř díry

Z možnosti mít více vnějších kruhů v jedné relaci vyplývá, že můžete snadno nakreslit "ostrovy" uvnitř děr.
<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>

Takováto konstrukce by dříve vyžadovala použití několika relací multipolygonu. Jednu s cestou 1 jako vnější a s cestou 2 jako vnitřní a druhou s cestou 2 jako vnější a cestou 3 jako vnitřní. Takovéto vnořování multipolygonů je ovšem stále potřeba použít, pokud "ostrov" je uprostřed něčeho jiného než je plocha okolo. Ale pokud je "ostrov" z toho samého, co je venku, pak můžete takto jednoduše vytvořit díru v díře.

Obrázek 7: Ostrov uvnitř díry

Dotýkající se vnitřní kruhy

Pokud už vytváříte dotýkající se kruhy libovolného druhu, pak je tvořte pouze z uzavřených cest, jinak je jejich zpracování softwarovými klienty extrémně obtížné. Tedy cesty 2 a 3 na obrázku by měly být uzavřené cesty. Pokud reprezentují stejnou věc, pak je vhodnější je spojit do jediné cesty.

Někteří uživatelé spojují v relaci "multipolygon" vnitřní kruhy:
<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>

Aplikace by se při zpracovávání rozšířených multipolygonů měla pokusit vykreslit tyto případy, jako kdyby dotýkající se vnitřní kruhy byly jen jeden kruh. Tohle je jediný případ, kde se OpenStreetMap odchyluje od standardu OGC Simple Features, ve kterém není dovoleno vytvářet dotýkající se vnitřní kruhy, protože je to zbytečné (není třeba dělat dva vnitřní kruhy, protože je lze spojit v jeden). V OpenStreetMap to ovšem smysl mít může, pokud jsou dva vnitřní kruhy individuálně označeny. Například jedná-li se o les s mýtinou, která je z poloviny tvořena rybníkem a z druhé poloviny polem. Pak budete mít v lese dvě "díry", jednu značenou jako natural=water a druhou jakolanduse=farmland. Tato možnost umožňuje uživatelům zjednodušení práce, protože jinak by museli vytvořit pouze jednu díru v lese a pak přidat dva samostatné polygony pro rybník a pole, což by bylo zbytečně moc práce navíc.

Vyhněte se ovšem vytváření polygonů, ve kterých by se vnitřní kruh dotýkal vnějšího.

Obrázek 8: Dotýkající se vnitřní kruhy

Příklady nesprávného použití

Zde jsou nějaké příklady nesprávně vytvořených multipolygonů, abyste měli představu, jak to nemáte dělat.

Neuzavřený polygon

Příklad neplatného multipolygonu jehož cesty 2 a 3 nejsou spojeny.
Obrázek 9: neplatný neuzavřený multipolygon

Překrývání, neuzavřené cesty stejné role

Příklad neplatného multipolygonu u něhož koncové uzly cest 2 a 3 jsou sdíleny více než dvěma cestami.
Obrázek 9: neplatný nejednoznačný multipolgyon

Další příklady

Poznámky k implementaci

  • Styl vykreslování se vždy bere ze značení na samotné relaci.
  • Vykreslování vnitřních ploch se dělá nezávisle na multipolygonu - vnitřní cesty mohou tvořit uzavřené kruhy se značkami ploch, nebo také mohou být vnějšími cestami multipolygonů.
  • Styly ploch obsahující vykreslovací pravidla pro své hranice mohou vést ke konfliktům - vnitřní cesta může mít styl linie (např. plot ), svůj vlastní styl plochy (např. voda) a styl plochy multipolygonu (např. les). Každý software si může definovat pořadí vykreslení podle sebe, ale obecné pravidlo může být dát liniovému stylu nejvyšší prioritu a stylu plochy multipolygonu pro vnitřní cesty prioritu nejnižší.
  • Existuje doporučený algoritmus(en) pro zpracování multipolygonů.
  • Povšimněte si, že před květnem 2017 měly některé multipolygony také značky na vnější cestě (existovala-li jen jedna taková cesta, nebo všechny cesty měly stejné značky) a zároveň byly jejich relace neoznačené. Ovšem při zpracovávání starších exportů dat z OSM budete muset tyto multipolygony starého typu zpracovávat také.
  • Implementace pro kompatibilitu - není-li relace označena, pak se použije styl vykreslování vnějších cest:
    • Existuje více než jedna cesta outer:
      Relace má značky
      Použijte značky relace. Ignorujte vše na cestách.
      Relace nemá značky, ale jedna nebo více vnějších cest má stejnou sadu značek
      Platná data, vezměte značky z označených segmentů a použijte je na kompletní vnější cestu.
      Relace nemá značky a vnější cesty jsou značeny různě
      Toto je problematická situace s nedefinovaným výsledkem.


Doporučený způsob mapování

Multipolygony dovolují zakreslit geometricky stejný objekt různými způsoby: jako cesty nebo jako multipolygony, pomocí uzavřených nebo otevřených cest a se sdílenými nebo nesdílenými cestami.

To samozřejmě vede k otázce, který způsob je vhodné použít. Některé způsoby mají své výhody a tedy je jejich použití preferováno. U ostatních je jejich použití spíše věcí vlastní volby, či toho zda je uživatel začátečník, nebo již pokročilý uživatel.

Obecně se dá říci, že když jsou velké plochy označeny stejnou značkou, pak mohou být zakresleny buď větším počtem malých multipolygonů nebo uzavřených cest, anebo menším počtem velkých multipolygonů. U samotných multipolygonů jsou pak dvě možnosti zakreslení:

Způsob A
Vnitřní i vnější kruhy jsou vytvořeny vždy, když je to možné, z uzavřených cest. S výjimkou toho, když by cesty byly příliš dlouhé (delší než asi 2000 uzlů). Cesty obvykle nejsou sdílené mezi různými multipolygony.
Způsob B
Každá hranice mezi dvěma multipolygony je vytvořena cestou, která je pak sdílena mezi sousedícími multipolygony. Důsledkem toho je, že kruhy v multipolygonech jsou pak složeny z několika otevřených cest.

Otázka nejlepšího způsobu vytváření multipolygonů byla intenzivně diskutována po několik let na diskusní stránce Talk:Relation:multipolygon(en) a v různých fórech. Zatím nebylo dosaženo žádného závěru, ale z diskuse vyplynuly následující postřehy:

  • Mapování jednoduchých uzavřených ploch jako multipolygonů namísto jako cest zvyšuje počet objektů v databázi a prodlužuje časy vykreslování mapy. Těmto zbytečných komplikacím bychom se měli vyhýbat.
  • Sdílení částí cest mezi multipolygony (způsob B) je efektivnější, protože se vyhnete redundatnímu vkládání překrývajících se cest do mapy.
  • S multipolygony, které se skládájí z neuzavřených cest (způsob B), se hůře pracuje nezkušeným uživatelům i jednoduchým editorům, jako je Potlatch 2. Pak často dochází k nechtěnému zničení takových multipolygonů nezkušenými uživateli.
  • Mnoho zkušených uživatelů říká, že používání způsobu B je nepohodlné, obzvlášť když jsou multipolygony hodně velké.
  • Obrovské multipolygony způsobují zpomalení procesu vykreslování mapy.
  • Editace složitějších tvarů v JOSM je snazší, rychlejší a odolnější ke vzniku chyb, když se použije způsob A. Důvodem je, že způsob B vyžaduje smazání, vytvoření a vložení několika částí cest do správných relací multipolygonů.

Zatím nemáme žádná oficiální omezení pro vytváření multipolygonů, pokud jsou tedy geometricky správné. Samozřejmě přijetí ohleduplného stylu zakreslování pomůže udržovat mapu v čistém stavu a bude usnadňovat mapování každému uživateli.

Příklad v Potlatch 2

Zde je nějaká travnatá plocha uprostřed lesů:

Pomocné nástroje

Viz také