Uk:Relation:multipolygon
multipolygon |
Опис |
---|
Зв’язок мультиполігон використовується для створення комплексних полігонів. |
Група: Властивості |
Учасники |
|
Статус: де-факто |
Інструменти |
|
Звʼязок типу мультиполігон використовується для створення комплексних полігонів, як правило таких, що містять отвори, або таких які складаються з кількох частин, що не перетинають одна одну. Вони також можуть бути корисними, коли потрібно розрізняти лінійні та полігональні обʼєкти без потреби у створені додаткових геометрій, так, наприклад, паркан (відповідний теґ додається до лінії) може бути межею території маєтку (контур полігону є членом звʼязку мультиполігону позначеного відповідними теґами, що описують властивості володіння).
Прості полігони створюються в OSM за допомогою однієї замкненої лінії та позначення будь-яким теґом, що має на увазі полігон, а не замкнену лінію. Наприклад, замкнена лінія, позначена теґом landuse=forest, буде тлумачитись, як полігон, в той час, як лінія з теґом highway=trunk — ні. Однак, дана модель працює тільки з полігонами, які складаються з однієї лінії та не мають отворів. Будь-який інший полігон, що є складнішим за цей (наприклад: берегова лінія, що складається з послідовно зʼєднаних ліній, або полігон, що складається з кількох незʼєднаних частин, або такий, що має отвори) потребує використання звʼязку мультиполігон.
Якщо коротко, звʼязок мультиполігон може складатись з кількох ліній, що мають роль outer (зовнішній периметр) та кількох ліній з роллю inner (отвори), і вони повинні утворювати вірні замкнені межі для утворення форми мультиполігону.
Як мапити
iD
В редакторі iD ви можете виділити полігон та вкладений (внутрішній) полігон та скористатись командою «Обʼєднати» C для створення мульти полігону.
Додавання будівлі з внутрішнім двором:
Накресліть Лінію(ї) по зовнішньому контуру обʼєкта.
Накресліть лінію(ї) чи полігон(и) внутрішніх елеменетів.
Виділіть зовнішній та внутрішній контури скориставшись ⇧ Shift+click.
Після виділення елементів внизу панелі ліворуч натисніть кнопку + «Додати у звʼязок».
В полі «Обрати батьківський звʼязок» оберіть пункт «Новий звʼязок…».
Клацніть на «Мультиполігон».
Та оберіть Полігон.
В розділі Вади, розвʼяжіть всі проблеми, додавши ролі inner внутрішнім та outer зовнішнім елементам звʼязку.
Наведіть курсор на ваду в переліку, щоб побачити якого елементу на мапі вона стосується (елемент буде підсвічено синім), тож ви будете знати чи є елемент внутрішнім, чи зовнішнім контуром мультиполігону.
Тут, вказівник знаходиться над першою вадою і ми бачимо підсвітку у зовнішнього контуру, оберіть «Позначити як outer».
Виділений обʼєкт тепер складає звʼязок мультиполігону. Це видно за наявності теґу type=multipolygon, та наявність принаймні одного члену з роллю "outer" та одним членом "inner" та відсутністю вад.
Якщо один з внутрішніх елементів, чи то лінія, чи то полігон, представляють інший обʼєкт він може бути позначений власним відповідним теґом; виділіть потрібний внутрішній елемент та змініть елемента який він представляє. Зовнішній контур має завжди лишатись без теґів.
Наприклад, внутрішній елемент представляє внутрішній двір будівлі.
Ви можете подивитись приклад в OSM.
JOSM
Використовуйте Меню/Інструменти/Створити мультиполігон або Ctrl+B
Мапінг водно-болотної місцевості зі ставком усередині:
Примітка: якщо деякі лінії вже є, після згортання зовнішніх і внутрішніх контурів у мультиполігон, теґи зовнішніх ліній залишаться на місці та повинні бути видалені з їх властивостей. Редактор попередить про це перед завантаженням. Останні випуски редактора JOSM виконають цей крок автоматично.
Мапіг дерев, дотичних до заболоченої місцевості:
Примітка. Мультиполігон, створений таким чином, не відповідає специфікації OGC. Пояснення див. нижче.
Специфікація OGC не дозволяє наявності межі, що ділить внуршні області, бути частиною мультиполігона. Натомість нам потрібно обʼєднати два елементи заболочених земель, для цього створимо додаткову лінію:
Примітка. Іншим методом створення мультиполігону, сумісного з OGC, було б розділити контури внутрішніх елементів таким чином, щоб можна було обʼєднати лише ті частини, що утворюють контур без урахування межі, яка їх розділяє.
Vespucci
Теґи
Ключ | Значення | Пояснення |
---|---|---|
type | multipolygon | Говорить застосункам, що потрібно використовувати правила побудови полігону на основі його членів. |
Не використовується (застаріло). Натомість використовуйте type=boundary (Це подібний звʼязок, але з іншими додатковими членами з відповідними ролями.) | ||
natural | * | Принаймні один теґ, що описує вид обʼєкта (наприклад natural, landuse, building, man made, amenities, leisures, …) що охоплює територію.
Більшість цих теґів є взаємовиключними (використовуйте окремі мультиполігони, якщо треба, використовуйте правило Один обʼєкт — один елемент в OSM), оскільки їх додаткові теґи можуть мати суперечливу інтерпретацію. |
landuse | * | |
building | * | |
man_made | * | |
amenity | * | |
leisure | * | |
highway | pedestrian | |
waterway | * | |
… | … | |
layer | * | Будь-які теґи, що описують мультиполігон (такі як підтип обʼєкта, шар, назва, референт, примітки , …).
Ці теґи використовуються так само, як і для звичайних полігонів. |
name | * | |
note | * | |
... | ... |
Члени
Лінія або Точка | Роль | Повторюваність? | Пояснення |
---|---|---|---|
чи | outer | один чи більше | Лінії, що утворюють зовнішній замкнений периметр полігону. |
чи | inner | нуль чи більше | Лінії, що утворюють замкнені межі отворів в середині полігону. |
чи | none | нуль | Не використовувати, застаріле. Інструменти повинні опрацьовувати такі члени, як outer або намагатись визначити їх роль базуючись на геометрії. |
будь-яка | нуль | Не використовувати. | |
будь-яка | нуль | Не використовувати. |
Використання
Використання мультиполігонів передбачає наступне:
- Теґи, що описують мультиполігон (напр.
landuse=forest
) повинні призначатись звʼязку. Лінії, що утворюють зовнішній периметр, повинні лишатись без теґів[1], за винятком випадків, коли вони позначають самостійні речі. Наприклад, ліс може бути окреслений чотирма парканами, в цьому випадку кожна лінія буде позначена теґом паркануbarrier=*
, але вони все ще можуть бути використані як члени звʼязку з роллю "outer", що утворюють зовнішній периметр лісу. - Якщо внутрішня лінія представляє щось сама по собі (напр. ліс з отвором, де отвір є озером), внутрішня лінія може бути позначена відповідним чином.
- В іншому випадку внутрішні лінії повинні лишатись без теґів.
- Спрямованість ліній значення не має.
- Послідовність членів звʼязку також не має значення (але правильно відсортовані списки членів можуть допомогти редакторам в перевірці повноти інформації).
Історично, особливо в Німеччині, type=multipolygon використовувався замісць звʼязку для позначення кордонів type=boundary. Цей метод не був широко прийнятий і має вважатись застарілим.
Вагомі умови для мультиполігонів
Загалом, звʼязки мультиполігони можуть використовуватись для створення мультиполігонів відповідно до стандарту OGC Simple Feature (Графічні приклади дійсності OGC). Будь-що, що не відповідає стандарту (напр. мультиполігони із самоперетином) повинне вважатись недійсними звʼязками мультиполігонами, із важливим виключеннями, щодо внутрішніх отворів, що доторкаються між собою (див. нижче).
Ми визначаємо дійсним (замкненим) полігоном зʼєднання підмножини ліній (членів), які утворюють замкнений полігон, коли їх кінці зʼєднані між собою.
Ми визначаємо незамкнену лінію, як комбінацію точок, в якій координати першої точки відрізняються від останньої.
Дійсним звʼязком мультиполігоном, є звʼязок, що відповідає наступним вимогам:
- Лінії члени мультиполігону ПОВИННІ утворювати один чи більше замкнений полігон, коли лінії, що належать звʼязку, зʼєднанні таким чином, що вони утворюють один чи більше замкнений ланцюг. [2]
- Рівно дві незамкнені лінії, і не більше, повинні мати спільну кінцеву точку (напр. крайні точки ліній показані чорними крапками на малюнках).
- Якщо кінцева точка належить менше ніж двом лініям, полігон не може вважатись замкненим і є погано сформованим. поганий приклад 1
- Якщо кінцева точка належить більше ніж двом лініям, замкнений полігон не може бути реконструйований однозначно. поганий приклад 2 (Виключення – точки, що належать парному числу незамкнених ліній повинні бути частиною внутрішніх отворів, що дотикаються друг друга.)
- Внутрішні полігони не повинні перекривати зовнішні полігони чи дотикатись них. Перекриття можливо усунути повною переробкою мультиполігону.
Приклади XML
Одна зовнішня і одна внутрішня лінії
Самий простий та найчастіше використовуваний випадок з однією зовнішньою та однією (чи більше) внутрішньою лініями, що утворюють окремі замкнені лінії.
<relation id="1">
<tag k="type" v="multipolygon" />
<member type="way" id="1" role="outer" />
<member type="way" id="2" role="inner" />
</relation>
|
- Приклад теґування обʼєктів
Припустимо, що попередня геометрія представляє ставок у лісі. Ось два конкуруючих способи позначення цих елементів:
<relation id="1">
<tag k="type" v="multipolygon"/>
<member type="way" id="1" role="outer"/>
<member type="way" id="2" role="inner"/>
</relation>
<way id="1">
<tag k="natural" v="forest"/>
<tag k="name" v="Grey Wood"/>
<nd ref="101"/><nd ref="102"/><nd ref="103"/>
<nd ref="104"/><nd ref="105"/><nd ref="101"/>
</way>
<way id="2">
<tag k="natural" v="water"/>
<tag k="water" v="pond"/>
<tag k="name" v="Whitewater"/>
<nd ref="201"/><nd ref="202"/><nd ref="203"/>
<nd ref="204"/><nd ref="201"/>
</way>
Це неправильно: мультиполігон лісу все ще представляє геометричну площину, але не обʼєкт, полігон (лінія #1) повністю перекриває ставок (лінія #2). Рендери чи застосунки не будуть опрацьовувати такий випадок належним чином, і ставок буде перекритий лісом і його не буде видно, навіть якщо він позначений правильно. |
<relation id="1">
<tag k="type" v="multipolygon"/>
<tag k="natural" v="forest"/>
<tag k="name" v="Grey Wood"/>
<member type="way" id="1" role="outer"/>
<member type="way" id="2" role="inner"/>
</relation>
<way id="1">
<nd ref="101"/><nd ref="102"/><nd ref="103"/>
<nd ref="104"/><nd ref="105"/><nd ref="101"/>
</way>
<way id="2">
<tag k="natural" v="water"/>
<tag k="water" v="pond"/>
<tag k="name" v="Whitewater"/>
<nd ref="201"/><nd ref="202"/><nd ref="203"/>
<nd ref="204"/><nd ref="201"/>
</way>
Це правильний (набагато кращій) випадок: теґи лісу перенесені з лінії зовнішнього контуру на мультиполігон, ліс, який має власні теґи, більше не перетинається з внутрішнім обʼєктом – ставком (лінія #2), що також має власні теґи; лінія #1 не має теґів (вона не представляє а ні ліс, а ні будь-який обʼєкт, вона лише визначає тільки геометрію мультиполігону). Лінії без теґів є дійсними, якщо вони є членами звʼязків. |
Одна зовнішня лінія і два отвори
<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>
|
Кілька ліній утворюють замкнене коло
Розширена схема побудови мультиполігонів дозволяє будь яким внутрішнім отворам та периметру мультиполігона складатись з більше ніж однієї лінії. Це дуже зручно для полігонів, що покривають великі ділянки, там де непрактично мати одну велику лінію, що оточує весь полігон:
<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>
|
Два незʼєднаних зовнішніх периметри
На відміну від простих мультиполігонів, вдосконалені мультиполігони дозволяють мати будь-яку кількість зовнішніх периметрів і бути в той самий час вірними мультиполгонами:
<relation id="1">
<tag k="type" v="multipolygon" />
<member type="way" id="1" role="outer" />
<member type="way" id="2" role="outer" />
</relation>
|
Два незʼєднаним зовнішніх периметри і дві лінії, що утворюють отвір
Можливість створювати замкнені периметри із окремих ліній не обмежуються лише зовнішніми периметрами, отвори також можуть утворюватись у такий спосіб:
<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>
|
Комплексна комбінація всіх розширених можливостей
Цей приклад показує застосування всіх розширений можливостей: три зовнішній периметри, два з яких мають один чи більше отворів, де більшість з них складається з кількох ліній.
<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>
|
Острови з отворами
Виходячи з можливості мати кілька зовнішніх периметрів в одному звʼязку, виходить, що можливо легко створити модель острівця з отвором:
<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>
Щоб зробити подібне раніше, потребувалось створити кілька окремих мультиполігонів, один — з лінією 1 в ролі outer, лінією 2 inner; інший — з лінією 2 в ролі outer, лінією 3 inner. Подібні каскади все ще потрібні й зараз, коли острівець в середині має інші властивості, ніж полігон ззовні, але якщо острівець і полігон ззовні мають однакові властивості, все це можна утворити як отвір в отворі. |
Дотичні внутрішні отвори
Дехто з маперів використовує "мультиполігони" для поєднання дотичних внутрішніх отворів:
<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>
В реалізації рендерінгу розширених мультиполігонів, рендер намагатиметься показати дотичні отвори як один. Це такий випадок, коли використання в OpenStreetMap відхиляється від стандартів OGC Simple Features. В них дотичність кілець не підтримуються, оскільки вони не потрібні (навіщо створювати два отвори, коли можна замість цього створити один). В OpenStreetMap, вони іноді мають сенс, коли їх потрібно позначити окремо, наприклад ліс з галявиною, частину якої займає озеро, а іншу поле – вам потрібно утворити два «отвори» в лісі, один з яких позначити Уникайте також створення мультиполігонів, де внутрішні отвори дотикаються до зовнішнього периметру. |
Погані приклади
Тут містяться приклади помилкових мультиполігонів, щоб показати як НЕ треба робити
Незамкнений полігон
Цей приклад показує помилковий мультиполігон, так як лінії way #2 та way #3 не зʼєднані. |
Перекриття, незамкнені лінії, що належать до тієї ж ролі
Цей приклад показує помилковий мультиполігон, у якого кінцеві точки лінії way #2 та лінії way #3 належать більше ніж двом лініям. |
Імітація мультиполігону
Цей приклад демострує невалідний мультполігон, бо точки 4 та 5 дублюються як точки 9 та 10, відповідно. Згідно з Правилами Open Geospatial Consortiumʼs (OGC) OpenGIS, такий елемент не є дійсним полігоном. Osmose сповіщає про такі помилки. |
Додаткові приклади
- Додаткові приклади мультиполігонів знаходяться на сторінці Multipolygon_Examples.
- Proposition for examples of valid and invalid unusual configuration
Імплементація
- Стиль рендерингу обʼєктів, які представлені полігонами, залежить від теґів самого мультиполігону.
- Показ елементів отворів відбувається незалежно від мультиполігонів – лінія, що представляє внутрішній контур може утворювати замкнене коло та також бути зовнішнім контуром іншого мультиполігону.
- Правилі рендерингу, що містять настанови щодо рендерингу меж мультиполігонів можуть викликати конфлікти. Лінії внутрішніх контурів можуть мати стиль (наприклад, огорожа) в той час, як внутрішній обʼєкт – свій (наприклад, ставок), а сам полігон – інший (ліс). Кожне програмне забезпечення має встановлювати власний порядок рендерингу елементів, однак загальним може бути те що, стиль показу ліній має вищий пріоритет за стиль показу заповнення.
- Ось запропонований алгоритм обробки мультиполігонів.
- Зауважте, що до травня 2017 року деякі мультиполігони також мали свої теґи на зовнішньому контурі (якщо він складався з однієї лінії або всі лінії мали однакові теґи), у той час, як відповідний звʼязок мультиполігону залишався без теґів. Отже, при використанні старих фрагментів даних OSM також необхідно обробляти мультиполігони старого стилю.
Стиль мапінгу, кращі приклади
Мультиполігони відкривають можливість створення геометрично ідентичних обʼєктів використовуючи різні стилі: у вигляді ліній чи мультиполігонів, використовуючи замкнені та не замкнені, або спільні чи окремі лінії. Постає питання: який стиль мапінгу використовувати. Деякі стилі мають переваги над іншими, і повинні розглядатись як добра практика. Для інших, вибір більше залежить від уподобань, або ж від досвідченості мапера.
В узагальненому вигляді, для великих територій, що позначаються одним і тим же теґом, може використовуватись велика кількість невеликих мультиполігонів чи замкнених ліній, чи менша кількість більших мультиполігонів. Для мультиполігонів можливі два стилі мапінгу:
- Метод A
- Внутрішній і зовнішній контури утворюються замкненими лініями, якщо можливо, за винятком, коли ці лінії є достатньо великими (більше ніж 2000 точок). Лінії, як правило належать одному мультиполігону
- Метод Б
- Кожна межа між двома мультиполігонами представляється окремою лінією, яка потім входить до складу відповідних дотичних мультиполігонів. Отже, периметр мультиполігону складається з кількох ліній.
Питання, який стиль мапінгу мультиполігонів використовувати, інтенсивно обговорюються впродовж останніх років, дивіться Talk:Relation:multipolygon, а також на форумах. Досі ще не досягнуто остаточного консенсусу, але використовуються наступні правила:
- Додавання простих замкнених ліній у вигляді мультиполігонів збільшує кількість обʼєктів бази даних та час їх рендерингу. Таке додаткове підвищення складності треба уникати.
- Використання спільних ліній мультиполігонами (метод Б) дозволяє підвищити ефективність подання даних, уникаючи застосування ліній, що накладаються одна на одну.
- Мультиполігони, що складаються з незамкнених ліній (метод Б), важче обробляти недосвідченим маперам і в простих редакторах, таких як Potlatch 2, що часто призводить до випадкового спотворення таких мультиполігонів користувачами, які нічого не підозрюють.
- Багато досвідчених учасників висловлюються, щодо дискомфорту метода Б, особливо для дуже великих мультиполігонів.
- Величезні мультиполігони призводять до уповільнення процесу візуалізації.
- Редагування складної геометрії в JOSM легше, швидше і не призводить до помилок з методом А. Це через те, що метод Б потребує вилучення, створення та вставки різних ліній до коректних звʼязків мультиполігонів.
Поки що не існує офіційних застережень, як правильно використовувати мультиполігони, до тих пір доки вони є геометрично вірними. Однак вважається, що вибір відповідного стилю мапінгу дозволить зберегти базу даних незасміченою та простою для внесення змін кожним з учасників.
Допоміжні інструменти
- Relation Check
- OSM Inspector має підтримку перевірки мультиполігонів
Можливі помилки
Атрибут type=multipolygon не повинен застосовуватися до точок або ліній (елементів & & ). |
Дивіться також
- Relation:multipolygon/validity
- Дивіться The Future of Areas, де міститься обговорення, як покращити обробку полігонів в OSM.
- Relation:multilinestring