Трёхмерные здания в Mapnik

я имею в виду то что рендится будет только первый этаж (всего здания), а при переделке в 3d будет полноценное здание с надстройками и пристройками, и навигатору понятнее будет…
а те блоки которые будут без первого этажа получается должны плотно прилегать к основному зданию (на примере останкинской башни)

Хочу поднять один давно забытый вопрос из этой ветки.
2010-12-21 :

В итоге, ни levels=* ни building:part:levels не рендерятся. И поэтому никто их не отмечает, а вместо этого везде используется building:levels.
Это очень плохо по двум причинам.

  1. building:levels на building:part портит статистику зданий с разной этажностью. Невозможно не заглядывая в описание объектов определить, что перед нами, например, 5 десятиэтажных зданий или пять одноэтажных надстроек на девятиэтажном здании.
  2. если часть здания совпадает по контуру с самим зданием (обычно это нижняя часть), то проставление на неё building:levels для здания приводит к неправильному отображению в 3D. Если же на неё проставлять этажность только для данной части здания, то имеем фэйк - неверное значение этажности для
    здания в целом. Иногда можно избавиться от этого противоречия, “разрезая” здание на building:part только по вертикали. Но иногда это невозможно в принципе, как в случае с Останкинской телебашней.

Поэтому предлагаю разобраться с тегами высоты и этажности для building:part, а именно отделить их от тегов для building.
Вот два варианта:

  1. building:levels и building:height для building;
    building:part:levels; building:part:min_level; building:part:height; building:part:min_height для building:part
  2. building:levels и building:height для building;
    levels; min_level; height и min_height для building:part
    Второй вариант кажется более предпочтительным, т.к. во-первых короче, во-вторых height уже активно используется и рендерится.
    Остаётся только попросить авторов рендеров поддерживать теги levels и min_level. При этом если на одном контуре окажутся одновременно building:levels и levels,
    то отображаться должен второй, т.к. это более высокий уровень детализации.

Для статистики:
building:part на данный момент использован 4785 раз, в т.ч. на отношениях 501 раз, в т.ч
СПб - 2494 раза (52%); Москва - 160; Екб - 142; Киров - 130

building:min_level - 3389 раз (предлагаю полностью избавиться от этого тега и заменить на min_level. Сейчас 50% применяется совместно с тегом building=* и 50% c building:part=)
building:part:levels - 14 раз
building:part:min_level - 0 раз
levels - 13911 раз (распространён в Европе, прежде всего Германии, 96% применяется совместно с тегом building=
)
min_level - 15 раз

building:part:height - 14 раз
building:part:min_height - 0 раз
height - 676880 раз (92% применяется совместно с тегом building=, 6% - man_made=)
min_height - 1324 раз (37% применяется совместно с тегом building=* и 63% c building:part=*)

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

Komяpa, как я понимаю, это к Вам.
Вот в этом месте здания отрисованы несколько месяцев назад, но так и не отрендерились в псевдо-3d:
http://latlon.org/buildings?zoom=16&lat=60.02718&lon=30.21864&layers=BT
Можно ли что-нибудь сделать?

Ещё один вопрос. Есть идея тега, предотвращающего показ этажности у здания, на котором он стоит. Рендереры делятся на те, что поддерживают building:part, и не поддерживают. Имеем проблему: можно отмечать building:levels на основном полигоне здания, и тогда вся прорисовка building:part насмарку, либо не отмечать, и тогда в рендерах типа ситигида вообще ничего не рисуется.
Такой тег мог бы частично решить проблему.
В самОм Латлоне есть опция, рисующая здания с дефолтной высотой на полигонах residential=urban и rural.
Здесь тоже имеет смысл отключать этажность у building, имеющих building:part, иначе происходит задвоение: http://latlon.org/buildings?zoom=17&lat=60.05989&lon=30.30967&layers=BT
Насколько такой тег, будь он создан и поддерживался, усложнил бы расчёты (как я понимаю это не критично - потребовалась ещё одна проверка на каждом здании)? Как Вы вообще относитесь к такой идее? Вариант тега: complex_building=yes

Спасибо!

Лучше уж building:parts=yes ?

Возможно. Но building:part могут быть и в виде башенок, пентхаусов и прочей ерунды, не отменяющей этажность на основном здании. Так что, имхо, такой вариант может сбить кого-то с толка.
Вообще, я указал вариант почти от балды, здесь действительно стоит хорошо всё обсудить, чтобы вышло на перспективу, а не очередная временная “заглушка”.

Фанатею от псевдо3Д. Голосую за идею уточняющего тега, что здание состоит из нескольких билдинг:партов, хоть это и костыль, может быть.

building:shape=cubes

building:part итак уже костыль можно конечно еще одним подпереть, для симметрии :slight_smile: Только потом будем обсуждать что делать с рендерами поддерживающими building:part но не поддерживающими новый тег.

А я всё жду когда этажность будет показываться горизонтальными полосками :slight_smile:

Могу сказать то, что говорил год назад (и повторил недавно ). Схема с кирпичами должна быть совместима со схемой без кирпичей.
building:levels и building:height на полигоне building=yes должны обозначать этажность всего здания.

Ну вот для обеспечения этой совместимости и обсуждается тег - уточнять форму по кусочкам или нет. Если рендер кусочки понимает, этот тег подскажет ему - является ли основной контур кусочком или нет (должен ли участвовать в отрисовке кусочками). Если рендер отрисовку кусочками не понимает - игнорит обсуждаемый тег.

Если лепить костыли - то уж до последнего :slight_smile:

В рендеринг добавлено дополнительное условие:

Если полигон building пересекается с полигоном building:part, то полигон building не экструдируется.

В таком случае можно нарисовать всё здание билдингом и проставить ему какую-zkir-захочет высоту для экструдирования в примитивных рендерерах навигаторов, а собственно более подробные объёмные призмы рисовать building:part.

А если на основной, чтоб не дублировать его, повесить помимо building=yes еще и building:part=yes заэкструдится?

Да

Тоже хорошее решение. Только теперь надо что-то делать с левитирующими кусками зданий: http://latlon.org/buildings?zoom=17&lat=60.03411&lon=30.33529&layers=B :smiley:
Вообще, там можно

  • записать building:part дополнительно к building на основную часть
  • распиливать здание только по вертикали
  • продублировать основную часть мультиполигоном с одним outer (совпадающим полигоном - ошибка) и повесить на него building:part
    Что именно выбрать - будем смотреть по ситуации.

И, кстати, не только пересекаться, но и касаться. Может быть случай, что building:part соседнего дома, стоящего встык, приведёт к тому что здание не отрендерится. Будьте бдительны !

Речь о доме 11 к1? Это похоже на какую-то проблемы отрисовки: при небольшом масштабе рисуется нормально, при крупном нижняя часть здания пропадает. Но вообще было бы проще, если бы здания старались резать по вертикали, а не по горизонтали.


Предлагается тег consists_of_parts=yes, показывающий, что здание, отмеченное тегом building=yes, состоит из кусков, отмеченных тегом building:part=yes - в этом случае рисовать по контуру building=yes не следует. Ставить тег следует на линию (или полигон), на которой стоит building=yes.

Давайте же уже придуем хоть что-то работающее (с примерами) а то список домов сложной конфигурации у меня стал что-то очень большим :slight_smile: Уж больно любят современные архитекторы что-то переменно-этажное … ну и здания на мощном стилобате (1-й этаж магазин) весьма распространены всегда были.

Тег consists_of_parts=yes как-то не звучит. Нет привязки к зданию. Уж лучше building:parts:vertical=yes
Ну и помнить что не все рендереры знают о таком теге, т.е. building=yes вешать на что-то нейтральное.

Может попробовать на примерах (картинках)? А то чего-то в споре упустим?

Я всегда делал так, чтобы building:part были внутри building. Если делать проверку на нахождение внутри, то касание ничего не сломает.

Предложение: если рядом с этим куском есть другие, расположенные сбоку - пишем building:parts:vertical=yes, если рядом с этим куском есть другие, расположенные сверху или снизу - пишем building:parts:horizontal=yes. Так или иначе даём информацию, что building состоит из building:parts. Пояснение для запоминания: building:parts:vertical - значит, здание порезано по вертикали, building:parts:horizontal - здание порезано по горизонтали. В каких-то случаях может быть нарезка и по горизонтали, и по вертикали. Тег, позволяющий отличить нарезку по вертикали от иной, даст возможность работать тем рендерерам, которые понимают вертикальную нарезку, тег, позволяющий отличить нарезку по горизонтали от иной, даст возможность работать тем рендерерам, которые понимают горизонтальную нарезку. Т. к. эти теги дополнительные, то не будут мешать (их добавление ничего не меняет для того ПО, которое не умеет с таким работать).