RU:Отношения:мультиполигон

From OpenStreetMap Wiki
Jump to navigation Jump to search
Public-images-osm logo.svg multipolygon
Multipolygon Illustration 6.svg
Описание
Отношение "Мультиполигон" используется для создания сложных полигонов. Изменить или перевести это описание.
Группа: Свойства
Участники
  • замкнутая линиялиния — outer
  • замкнутая линиялиния — inner
Статус: де-факто


Отношения типа мультиполигон используются для создания сложных полигонов.

Простые полигоны создаются в OSM с помощью одной замкнутой линии и обозначения каким-либо тегом, подразумевающим область, а не замкнутую линию. Например, замкнутая линия с тегом landuse=forest будет считаться полигоном, а замкнутая линия с тегом junction=roundabout не будет.

Однако, данная модель работает только с полигонами, которые состоят из одной линии и не имеют отверстий. Любая более сложная область (например, внешняя граница состоит из нескольких соединенных линий или область состоит из нескольких разобщенных частей или имеет отверстия) требует использования отношения мультиполигон.

Также рекомендуется использовать отношения типа мультиполигон (type=multipolygon) (а не type=boundary) для отношений границ в случае, если необходимо задать границы сложной формы (состоящие из нескольких линий или с анклавами и т.п.). Тип отношения в этом случае будет легко опознан по тегу boundary=*; нет необходимости использовать type=boundary.

Вкратце, отношение мультиполигон может состоять из любого количества линий в роли outer (внешние периметры) и любого количества линий в роли inner (отверстия), и они должны представлять замкнутые границы для построения формы мультиполигона.

Живой пример "здания с дыркой" смотри здесь

Теги

Ключ Значение Толкование
type multipolygon Сообщает приложению о правилах построении области на основе участников.

Участники

Линия или точка Роль Повторение Описание
замкнутая линиялиния outer одна и более Линии создающие внешние периметры мультиполигона.
замкнутая линиялиния inner ноль и более Линии создающие границы отверстий в мультиполигоне. (Пример: остров на озере)
замкнутая линиялиния none В подавляющем большинстве случаев отношение может быть правильно интерпретировано приложением без указания ролей участников. Но рекомендуется всё равно указывать роли для простоты понимания отношения другими картографами.

Использование

предполагаемое использование мультиполигонов подразумевает следующее:

  • Теги, описывающие мультиполигон (например, landuse=industrial) должны быть на отношении. Внешняя граница может быть оставлена без тегов, либо иметь свои собственные, не связанные с мультиполигоном.
  • Если у вас есть одна линия являющаяся внешней и она не описывает что-то сама по себе, вы можете поместить эти теги на ней и оставить отношение непомеченным. Если у вас более чем одна внешняя линия (см. дополнительные примеры ниже), то это не имеет смысла. Поэтому предложено (для согласования), чтобы всегда размещать теги на отношении мультиполигона.
  • Если внутренняя линия представляет собой ещё что-то (к примеру, озеро в лесу), тогда внутренняя линия может содержать необходимые теги".
  • Иначе внутренняя линия должна оставаться без тегов.
  • Направленность линий значения не имеет.
  • Порядок следования членов отношения значения не имеет (однако сортированный по ролям список может помочь людям находить ошибки).
  • В общем случае, отношение multipolygon может быть использовано для создания мультиполигонов в соответствии со стандартом OGC Simple Feature (http://www.opengeospatial.org/standards/sfs). Всё, что не является верным мультиполигоном в соответствии с этим стандартом (например, пересекающиеся внутренние линии) должно считаться некорректным отношением multipolygon, с важным исключением в виде касающихся внутренних линий (см. ниже).

Примеры

Один внешний и один внутрений контуры

Простая, широко используемая форма отношения "multipolygon" допускает строго один внешний контур и любое количество внутренних контуров. Каждый контур всегда должен состоять только из одной замкнутой линии:
<relation id="1">
  <tag k="type" v="multipolygon" />
  <member type="way" id="1" role="outer" />
  <member type="way" id="2" role="inner" />
</relation>

Применение к этой простой форме термина "мультиполигон" с точки зрения геометрии не совсем правильно. Истинный мультиполигон может состоять из ряда отдельных многоугольников (полигонов), а описываемое отношение этого не допускает.

Рис.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>
Рис.2 Один внешний и два внутренних контура

Несколько линий, образующих контур

Более развитая схема мультиполигона допускает, чтобы любой внутренний или внешний контур состоял из более чем одной линии. Это полезно для мультиполигонов, заключающих в себе очень большие области, кода невозможно или неудобно обвести всю такую область одной линией:
<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>
Рис.3 Несколько линий, составляющих один конур

Множественные (отдельные) внешние контуры

В отличие от простых мультиполигонов, более продвинутая форма допускает любое количество внешних контуров и в этом смысле является истинным мультиполигоном:
<relation id="1">
  <tag k="type" v="multipolygon" />
  <member type="way" id="1" role="outer" />
  <member type="way" id="2" role="outer" />
</relation>
Рис.4 Два отдельностоящих контура

Два внешних контура и внутренние, состоящие из линий

Возможность комбинировать контур из отдельных линий относится не только к внешним частям, внутренние контуры можно также комбинировать из отдельных линий:
<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>
Рис.5 Два внешних и комбинированные внутренние контуры

Сложное сочетание всех возможностей

Этот пример показывает сложную комбинацию всех возможностей. На рисунке три внешних кольца, два из которых, в свою очередь содержат одно и более внутренних колец, которые ещё и состоят из отдельных линий.
<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>
Рис.6 Комбинация всех вариантов

Островок в отверстии

Так как можно иметь несколько "outer" (внешних) колец в одном отношении, вы можете легко сконструировать "острова" внутри дыры, обозначив их, как "outer" (это не ошибка!!!):
<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>

Можно было бы использовать несколько иную конструкцию — с несколькими различными отношениями типа мультиполигон. То есть линия "way 1" обозначена как "outer" (внешняя линия леса) в паре с линией "way 2", обозначенной как "inner" (внутренняя линия линия леса, граница поляны) для одного мультиполигона. И одновременно во втором мультиполигоне, линия "way 2" обозначена как "outer" (внешняя граница поляны и окружающего его леса) с линией "way 3", обозначенной как "inner" (внутренняя граница поляны и озера посреди этой поляны). Такое каскадирование рекомендуется, например когда "озеро" находится в середине поляны, а поляна в середине леса. Однако, когда конструируем воду вокруг острова и одновременно воду внутри острова, то есть одна и та же структура (вода) находится и внутри острова (лужа) и вокруг острова (озеро), то лучше делать лужу внутри острова, который посреди озера, как "outer". (Прим. переводчика: Он оглянулся посмотреть, не оглянулась ли она, чтоб посмотреть, не оглянулся ли я.)

Рис.7 Островок в отверстии

Соприкасающиеся внутренние контуры

Некоторые картографы используют текущее отношение "мультиполигон" для изображения соприкасающихся внутренних или внешних контуров:
<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. В них соприкосновение внутренних колец не поддерживаются, поскольку они не нужны. В OpenStreetMap, они иногда имеют смысл, если необходимо отметить индивидуально, например, лес с поляной, половину которой занимает озеро, а другая половина сельхозугодия - вы увидите две "дырки" в лесу, одна из которых отмечена natural=water, а другая - landuse=farm. Это иногда нужно для того, чтобы создать только одно отверстие в лесу, а затем создать отдельные полигоны для озера и поля. Иначе создали бы слишком много работы для них.

Figure 8: Touching inner rings

Единственное ограничение в том, что мультиполигоны не поддерживают перекрывающихся или пересекающихся внутренних или внешних контуров. Все контуры должны быть полностью отделены друг от друга.

Дополнительные примеры

Их можно посмотреть тут

Применение тегов

  • Предлагается применять все описывающие область теги к отношению, а не к линиям. Во многих случаях это приведет к появлению линий без тегов.
  • Реализация с учетом совместимости:
  • Стиль отрисовки выбиратся на основании тэгов самого отношения.
  • Если отношение не имеет тегов, используется стиль отрисовки внешних линий.
  • Если внешние стили противоречат друг другу или отсутствуют, это расценивается как ошибка.
  • Рисование внутренних линий определяется их тэгами. Если стиль внутренних тегов совпадает с внешним, он должен обрабатваться, как пустой (прежний метод)

Тонкости применения тегов

К таким отношениям-мультиполигонам можно применять теги всего несколькими способами. Вот перечень вариантов, затруднений и предлагаемых решений:

  • Есть более чем одна внешняя ("outer") линия:
Отношение имеет теги
Используются теги отношения. Игнорируются все теги на линии.
Отношение не имеет тегов, но одна или несколько составляющих внешний контур линий идентичный набор тегов
Достоверные данные, применяемые ко всему контуру.
Отношение не имеет тегов, и внешние линии, составляющие контур, отмечены по-разному
Это проблемная ситуация с неопределенным результатам.

Конечно, наилучший способ тегировать внешние линии состоит в том, чтобы присваивать теги отношению, а не линиям. Но это потребует множества изменений в существующем ПО, так что присвоение тегов непосредственно линиям будет использоваться еще какое-то время.

  • Существует более чем одна внутренняя ("inner") линия:
Одна замкнутая линия (состоящая из одного или нескольких сегментов) не имеет метки, а другая имеет метки.
Линия без тегов отображается как дыра, линия с тегами в соответствии с её метками.
Различные замкнутые линии с различными тегами.
Каждая дыра отображается в соответствии со своими тегами.
Одна замкнутая линия (состоящие из двух или более сегментов), где сегменты имеют различные метки.
Если некоторые сегменты не имеют метки, то просто использовать теги из других сегментов. Если сегменты имеют различные метки, то это проблемная ситуация с неопределенным результатам (как и для "outer").

Как избежать ошибок топологии

Примеры верного и неверного изображения ситуации, в которой многие склонны к повторному использованию полилиний линейных объектов для построения мультиполигона границы площадного объекта.

Используя линии для создания мультиполигонов, необходимо обращать внимание на топологический смысл создаваемых объектов и возможные проблемы, которые с этим связаны.

Так, при использовании линии, обозначающей линейный объект с ненулевой шириной (дорогу, реку), для формирования мультиполигона площадного объекта (леса, например), возникает топологическое противоречие. Контур площадного объекта, фактически, перекрывает половину ширины линейного объекта, поскольку линия, обозначающая его ось, проводится по центру. Не следует понимать эту ситуацию так, что раз у линейного объекта предполагается ненулевая или указана в явном виде ширина, значит контур площадного объекта в такой ситуации автоматически отодвигается от оси. Теоретически, действительно, такой случай возможно учесть при обработке данных, но в существующей практике такой случай не учитывается. То, что при рендеринге карты дороги и реки всегда рисуются некой толщины и перекрывают полигоны землепользования, является просто эффектом рендеринга, но не означает, что во всех остальных задачах (например - при подсчете площадей разных типов землепользования) эта топологическая ошибка не имеет значения, либо как-то корректно обрабатывается.

Вывод: не используйте линии, которыми обозначены линейные объекты ненулевой ширины в составе мультиполигонов площадных объектов.

Рендеринг

  • JOSM может обрабатывать такие улучшенные мультиполигоны, начиная с версии 1203
  • Стиль Standard обеспечивает рендеринг на www.openstreetmap.org и не в полной мере поддерживает "улучшенные мультиполигоны" (но на пути к этому)
  • mkgmap полностью поддерживает, начиная с версии 1497
  • GpsMid по крайней мере поддерживает большинство современных функций мультиполигона
  • Предложен алгоритм обработки мультиполигонов.

Дополнительные инструменты

  • Relation Check
  • OSM Inspector имеет поддержку проверки мультиполигонов.
  • RelToolBox - плагин для JOSM, упрощающий работу с мультиполигонами.

Обучающие материалы

См. ещё

Смотрите The Future of Areas для изучения обсуждений о том, как улучшить обработку области в OSM.

RU:Appllied Multipolygons - Статья про создание и применение мультиполигонов.