RU:Simple3DBuildingsV1
Область
На этой странице описывается модель данных в OpenStreetMap для включения простых 3D-зданий. Поскольку фактическое моделирование в трехмерном пространстве невозможно напрямую в OpenStreetMap, этот подход основан на методах реконструкции на основе правил. 3D-здания создаются из 2D-контуров и дополнительных тегов, описывающих вертикальные свойства, формы крыш, трассы, материалы и другие свойства, которые полезны для процесса 3D-реконструкции. Эта трехмерная реконструкция реализуется средствами визуализации и серверными компонентами, которые позволяют использовать трехмерные представления в OSM. Схема S3DB состоит из простейших элементов из нескольких предложений, которые можно легко реализовать. Существуют более продвинутые предложения, в которых основное внимание уделяется подробным описаниям параметризованных форм или явному моделированию крыши. Схема S3DB ограничивает количество описываемых тегов и значений, чтобы добиться соответствия большему количеству инструментов. Инструменты, совместимые с этой схемой, должны, по крайней мере, реализовывать приведенный здесь набор правил и методов трехмерной реконструкции. Можно включать элементы для моделирования частей зданий и архитектурно важных конструкций, таких как столбы, башни, шпили и конструкции крыши. Эти элементы будут видны только в 3D-визуализации. Они не отображаются на стандартных 2D-картах. Схема Simple3DBuildings нацелена на 3D-модели городов со средней точностью, то есть геометрическое отклонение от реконструированной геометрии к реальности должно быть менее одного метра.
По сути, поддерживаются два разных уровня детализации (Levels of Detail, LOD). Очень простую версию можно создать путём "выдавливания" контура здания, который можно использовать для визуализации небольшого размера. Более сложная версия включает в себя все части здания и формы крыши. Определение этих LOD сопоставимо с внешними спецификациями, используемыми геодезическими конторы и кадастровыми системами (требуется ссылка).
Уровень детализации 1 — Призматические здания
Простые трёхмерные фигуры могут быть созданы из линий или мультиполигонов, помеченных как building=*, с помощью призматического "выдавливания". В LOD 1 крыши всегда отображаются как плоские. Если доступны дополнительные атрибуты формы крыши, они игнорируются. Пути должны быть закрыты и соответствовать рекомендациям по созданию полигональных объектов (смотрите Valid Multipolygon conditions). Эта трехмерная форма описывает объем, который включает в себя наиболее важные архитектурные детали здания. building=* — это площадь или периметр, покрывающий любую часть здания. У одного здания должно быть только один контур с building=*. Очертания соседних построек не должны перекрываться. Теги, которые относятся ко всему зданию (например, адрес, назначение, часы работы), также должны быть помечены на этом контуре. Высота задаётся с помощью тега height=* или building:height=*. Эта высота измеряется от земли до крыши в метрах или этажности. Не архитектурные элементы, такие как антенны, не должны быть включены.
Теги для уровня детализации LOD 1
Высота зданий может быть описана либо как точное метрическое значение, либо приблизительно по количеству уровней. Следующие теги можно использовать для контуров здания и для частей здания, которые описаны ниже.
Ключ | Описание | Картинка | TagInfo |
---|---|---|---|
height=* | Расстояние по вертикали между опорной точкой на земле и в верхней части крыши, за исключение антенн, шпилей и другое оборудования, установленных на крыше. Контрольной точкой обычно является самая низкая точка, в которой здание касается земли. По умолчанию, если нет строки единиц измерения, значения высоты выражаются в метрах. | ||
building:height=* | также, как height=* | ||
min_height=* | Примерная высота ниже конструкции здания (от земли до нижней точки). min_height можно использовать для моделирования нависающих конструкций, например здания на наклонной поверхности с одной стороной, поддерживаемой столбами. min_height может применяться к частям здания, которые не связаны с землей, например мосты, соединяющие здания. При моделировании зданий путём вертикальной укладки частей здания следует использовать min_height, чтобы избежать пересечения границ.
Обратите внимание, что при использовании min_height высота по-прежнему определяется как расстояние от земли до вершины конструкции. Например, мост 10 метров над землей и высотой 3 метра должен быть помечен как min_height=10, height=13. |
||
building:min_height=* | также, как min_height=* | ||
building:levels=* | Количество этажей над землей до выступа или видимого края (без этажей на крыше). Значение высоты в метрах может быть получено из уровней путём умножения на среднее значение высоты для каждого уровня. По умолчанию это 3,0 метра, но его можно изменить в зависимости от типа здания или других свойств (возраст, страна, использование и так далее). | ||
levels=* | также, как building:levels=* | ||
building:min_level=* | Нижние уровни пропускаются в здании или его части, аналогично min_height. min_height можно вычислить, умножив на среднюю высоту этажа (по умолчанию: 3,0 метра). | ||
min_level=* | также, как building:min_level=* | ||
colour=* | Цвет, используемый для отрисовки всех элементов здания. Значения цвета могут быть представлены в виде стандартных строк или в шестнадцатеричной системе счисления, например #ffffff для белого. Набор поддерживаемых значений цвета указан на этой странице. | ||
building:material=* | Информация о материале, который виден на большинстве частей здания. Рендереры могут использовать эту информацию для улучшения визуального качества, применяя общие текстуры, определенные шейдеры или типичные цвета. Поддерживаются следующие значения:
brick, concrete, eternit, glass, metal, mirror, plaster, sandstone, slate, stone, timber_framing, wood |
building:material=slate | |
roof:colour=* | Цвет, используемый для визуализации части крыши. Значения цвета могут быть представлены в виде общеизвестных строк или в шестнадцатеричной системе счисления, например #ffffff для белого. Набор поддерживаемых значений цвета указан на этой странице. roof:colour имеет бо́льший приоритет по сравнению с colour. | ||
building:roof:colour=* | также, как roof:colour=* | ||
roof:material=* | Информация о материале кровельных конструкций. Рендереры могут использовать эту информацию для улучшения визуального качества, применяя общие текстуры, определенные шейдеры или типичные цвета. Поддерживаются следующие значения: roof_tiles, copper, concrete, glass, slate, stone, tar_paper, grass, gravel, wood, metal, eternit, thatch, plants. Подробное описание на странице roof:material=*. | roof:material=wood | |
building:colour=* | Цвет, используемый для визуализации элементов фасада. Значения цвета могут быть представлены в виде стандартных строк или в шестнадцатеричной системе счисления, например #ffffff для белого. Набор значений цвета, который должен поддерживаться, указан на этой странице. building:colour имеет бо́льший приоритет по сравнению с colour. | ||
building:facade:colour=* | Цвет, используемый для визуализации элементов фасада. Значения цвета могут быть представлены в виде стандартных строк или в шестнадцатеричной системе счисления, например #ffffff для белого. Набор значений цвета, который должен поддерживаться, указан на этой странице. building:facade:colour имеет бо́льший приоритет по сравнению с building:colour и colour, но не интерпретируется некоторыми модулями рендеринга. | ||
building:facade:material=* | Информация о материале, который виден на фасадах. Рендереры могут использовать эту информацию для улучшения визуального качества, применяя общие текстуры, определенные шейдеры или типичные цвета. Поддерживаются следующие значения:
brick, concrete, eternit, glass, metal, mirror, plaster, sandstone, slate, stone, timber_framing, wood |
sandstone |
Уровень детализации 2 — Детальные представления зданий
Более подробные представления могут быть реализованы путём добавления форм крыши и описания зданий с использованием нескольких частей. Тег building:part=* используется для обозначения более мелких элементов с определенными формами крыши или материалами. Размер частей здания должен быть достаточно большим, чтобы отображать важные архитектурные особенности. Это могут быть секции зданий, башни, крылья, более крупные конструкции крыш, шпили, колонны, столбы, ступени, балюстрады в целом и подъезды. Части здания не должны использоваться для моделирования деталей фасада, таких как окна, выступы, небольшие перголы, капители колонн, небольшие балконы, лоджии, флаги, декоративные элементы и так далее. Рендереры могут пропускать элементы, если модель состоит из слишком большого количества элементов. Для более крупных структур, таких как стадионы или терминалы аэропортов, может потребоваться больше узлов для адекватного моделирования. В этом случае тег landmark=* может использоваться для добавления б́ольшего количества элементов.
Части здания
В LOD 2 можно заменить контур здания несколькими частями зданий, которые помечены как building:part=yes или building:part=тип_здания:part. building:part можно описать с помощью тех же тегов, что и для зданий. Если здания описываются несколькими частями, то контур здания, помеченный как building=*, больше не рассматривается для трёхмерного рендеринга. Поэтому, пожалуйста, заполните всю площадь здания элементами building:part=yes (или другое значение), если возможно, используя одни и те же точки для соседних частей.
В общем, building:part допускается использование с перекрывающимися областями и пересекающимися трехмерными объемами, что является удобным способом моделирования опорных конструкций, таких как столбы и так далее. Однако следует помнить о следующих случаях:
- Если здание разделено на горизонтальные части (этажи с разными планами наложены друг на друга), добавьте min_height=* или building:min_level=*, чтобы избежать больших вертикальных пересечений, которые могут замедлить 3D-рендеринг.
- Пожалуйста, избегайте частей здания, разделяющих фасад или крышу, но из другого цвета или материала. Общие грани являются результатом повторного использования сегментов пути и пересечения вертикальных границ. В этом случае 3D-рендереры будут создавать визуальные артефакты (так называемая «z-борьба»).
Строим отношения
Чтобы узнать, какие части здания принадлежат друг другу и составляют единое здание, а также для определения способов building=*, которые следует игнорировать при 3D-рендеринге, необходимо использовать Отношения:здание.
Следующие основные элементы построения отношений должны поддерживаться:
Ключ | Значение | Описание |
---|---|---|
type | building | Отношение, объединяющее все точки, линии и другие отношения, принадлежащие одному зданию. |
Участники
Элемент | Роль | Повторение? | Описание |
---|---|---|---|
outline | 0 или больше | Конструкция здания, используемая для 2D-визуализации. Если части здания присутствуют, элемент контура не должен использоваться для построения 3D-модели. | |
part | 1 или больше | Части здания. Эти части отличаются друг от друга по высоте, форме крыши, цвету, материалу и так далее. Члены части могут быть замкнутыми, помеченными как building:part=yes или мультиполигон. Обратите внимание: если элемент детали не помечен как building:part=yes, он будет проигнорирован при 3D-рендеринге. Это резерв на случай, если часть структуры отсутствует. |
Теги для уровня детализации LOD 2
В дополнение к атрибутам высоты, цвета и материала, описанным выше, следующие атрибуты могут использоваться в LOD 2. Эти атрибуты могут использоваться в элементах building=* и building:part=yes.
Ключ | Описание | Картинка | TagInfo |
---|---|---|---|
roof:shape=* | Определение формы кровли с помощью каталога известных типов кровли. | ||
building:roof:shape=* | также, как roof:shape | ||
roof:orientation=along/across | Для крыш с коньком конёк обычно считается параллельным самой длинной стороне здания (roof:orientation=along). Но его можно явно пометить этим тегом. Допустимые значения: along или across. | ||
roof:height=* | Высота крыши в метрах. Расстояние по вертикали от кулисы (нижней точки крыши) до верха крыши. roof:height не применяется для плоских крыш. | ||
roof:angle=* | В качестве альтернативы параметру roof:height=*, высоту можно неявно указать через этот тег, задав наклон сторон (в градусах). | ||
roof:levels=* | Количество этажей в крыше, которые еще не учтены в building:levels=*. roof:levels не применимы для плоских крыш. | ||
roof:direction=* | Направление от задней стороны крыши к передней, то есть направление, в которое смотрит основная поверхность крыши. В основном используется в сочетании со skillion и другими асимметричными крышами. Значения направлений указываются в виде N, E, S, W, NE, SE, SW, NW или числа в градусах (по часовой стрелке). |
Формы крыши
Спецификация поддерживает следующие формы крыш. Дополнительные типы крыш и геометрические параметры для большего контроля над процессом 3D-реконструкции поддерживаются только определенными модулями визуализации. Каждый тип крыши определяется набором правил, которые должны реализовывать 3D-рендеры. Базовая высота крыши обычно определяется как height=* минус roof:height=*. Если эти теги недоступны, то для вычисления базовой высоты необходимо использовать building:levels=*, roof:levels=* или roof:angle=*. Если ни одна из меток недоступна, то должна использоваться высота крыши по умолчанию 3,0 метра. Многие типы крыш предполагают, что площадь, используемая в качестве основания для конструкции крыши, имеет прямоугольную форму. Этот прямоугольник обычно имеет две короткие стороны и две длинные стороны, которые используются для определения положения фронтонов и выравнивания (вдоль/поперек). Часто здание не совсем прямоугольное или иной формы. В этом случае ориентированная ограничивающая рамка (OBBox) должна быть сначала рассчитана на основе плана здания.
Тип | Правила 3D реконструкции | Схема | Картинка | TagInfo |
---|---|---|---|---|
flat | Крыша представляет собой плоский многоугольник на уровне, заданном height=* или building:levels=*. | |||
skillion | Крыша с односкатным скатом. Крыша построена в виде многоугольника, как у плоской крыши, но задействованные вершины имеют разную высоту. | |||
gabled | Двускатная крыша с одним или несколькими фронтонами. | |||
half-hipped | Двухскатная крыша с частичным подрезанием одного или нескольких фронтонов наверху. | |||
hipped | Крыша, где все стороны спускаются к стенам | |||
pyramidal | Крыша с гранями, сходящимися в одной вершине, и прямыми краями. Основание крыши совпадает с краями верхней стены, образуя замкнутый объем. Поверхность пирамидальной крыши не обязательно имеет квадратную форму. | |||
gambrel | Двусторонняя крыша с двумя скатами с противоположных сторон, причем нижний скат круче верхнего. | |||
mansard | Крыша имеет два ската с каждой стороны, причем нижний скат круче верхнего. | |||
dome | Крыша, грани которой сходятся в одной точке, образуют своего рода полусферу, возможно, искаженную. Основание крыши совпадает с верхними краями стен, образуя замкнутый объем. Поверхность крыши у основания почти вертикальная, вершина почти горизонтальная. | |||
onion | Купол, по форме напоминающий луковицу | |||
round | Крыша, изогнутая как половина бочки. |
Ориентированная ограничивающая рамка (Oriented Bounding Box, OBBox)
Остроконечные, полускатные, шатровые, двускатные, мансардные и круглые типы крыш предполагают, что основание имеет прямоугольную форму. Если площадь здания или части здания не является прямоугольной, то OBBox должен быть вычислен и использован для конструкции крыши. В случае мультиполигональных отношений учитывается только внешняя граница. Применяются следующие правила:
- Если область имеет только 4 угловых точки, то форму изменять нельзя. Более длинные и более короткие стороны обнаруживаются и используются для конструкции крыши, даже если противоположные стороны не совсем параллельны.
- Если область имеет только 4 угла, но более 4 точек, причем некоторые из них коллинеарны, то для конструкции крыши используется прямоугольник, образованный 4 угловыми точками. Максимальное допустимое расстояние для обнаружения коллинеарных точек составляет 0,10 м.
- Если область имеет более 4 точек (выпуклых или вогнутых), например, образуя L-образный полигон, затем вычисляется OBBox и используется для конструкции крыши. В этом случае крыша не будет точно ложиться на стены, а некоторые детали будут "нависать". Можно убрать нависающие части, вытянув стены вверх до поверхности крыши. Однако это необязательная операция.
Картинка | ||||
---|---|---|---|---|
Вид | Полигон с 4 угловыми точками | Полигон с коллинеарны точками | Неправильный многоугольник | Убираем часть крыши |
Инструменты
Следующие 3D-инструменты поддерживают эту спецификацию
- OSM2World (частичная поддержка, в настоящее время реализуются оставшиеся функции для версии 0.2.0) — смотри карту
- Kendzi3d (поддерживается)
- OSM-3D (частичная поддержка, смотри Здания)
- Nutiteq Android 3D mapping SDK (поддерживается большинство форм крыши)
- WikiMiniAtlas (частичная поддержка, только пирамидальные крыши)
- OSMBuildings (частичная поддержка)
- F4 Map — смотри [1]
- OpenScienceMap — [2] На стороне клиента интерпретирует только теги height и min_height. Уровень S3DB использует сетки vtm, созданные на сервере (с использованием plpgsql с PostGIS и SFCGAL).
- OSG-Maps (частичная поддержка)