OpenStreetMap

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

точка зрения (на всякий случай, на рисунке одна из точек зрения, но не истина в последней инстанции)

Еще бы обсудить, можно ли рисовать дорогу через лес простым способом, как например тут: https://www.openstreetmap.org/way/31324547#map=15/56.2482/38.1412

дорога через лес

Линия дороги просто пересекает большой полигон леса, и всё. Когда-то леса рисовали крупными кусками :)

При буквальной интрепретации может получиться глупость, что деревья растут поверх асфальта. Для 2D рендеров это никогда не было проблемой, потому что линии рисуются поверх полигонов.

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

F4Map кажется справляется, лес расступился, и деревья на асфальте не торчат: Дорога через лес F4

https://demo.f4map.com/#lat=56.2475075&lon=38.1295582&zoom=17&camera.theta=59.66&camera.phi=-67.036

Но не все рендеры такие умные, это стоит иметь ввиду.

Вот например, тоже место, X-plane/X-Europe: X-Europe

Деревья таки растут на дороге.

Comment from Dzertanoj on 10 June 2020 at 20:35

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

Контр-аргумент про “мы же не рисуем под рендер” будет логически ошибочен, потому что в случае X-plane рендер вскрывает несовершенство топологии (которое оказывается естественным образом скрыто в двумерном рендере), отображая то, что есть в базе. А другой рендер пытается, путем внедрения костыля, это компенсировать.

Comment from Zkir on 10 June 2020 at 21:44

@Dzertanoj,

Вот не согласен. Не может быть корректной топологии из объектов разных порядков – полигональных линейных. Просто не может быть. Оба варианта “топологически некорректные”. Отсюда и холивар.

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

По поводу целей. Целей у всех всегда две:

  1. Простой и быстрый маппинг. Люди действительно ленивы, а кроме того срок жизни ограничен. Время, которое человек может потратить тоже ограниченно, и с этим приходится считаться. Лучше отрисовать больше за меньшее время.

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

Схемы маппинга – это обычно компромисс между первой и второй целью. “Корректная топология” целью вовсе не является, а является средством облегчить достижение цели №2. “Корректной” топология является не сама по себе, а в зависимости от состояния алгоритмов рендеринга (т.е. интерпретации)

Возвращаясь к сравнению левой и правой картинки.

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

Что если ширина дороги, вычисленная эвристически(!) при рендеринге, окажется больше отступа? Либо опять деревья на дороге, либо придется алгоритмически подгонять полигоны друг к другу.

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

Если аналога Post-GIS нет, то эта проблема вовсе не разрешимая.

Судя потому, что F4Map, которая обрабатывает осм-данные on-the-fly прямо джаваскриптом в браузере, технология уже созрела.

Comment from Dzertanoj on 12 June 2020 at 17:33

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

Comment from Zkir on 12 June 2020 at 19:04

@Dzertanoj, Я извиняюсь, я что-то потерял мысль. Какое отношение это всё имеет к теме дискуссии?

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

Если что, вот дорога, а вот лес.

И что делать, если лес отмечен тегом landuse=forest? По определению, landuse=* это территория, занятая * преимущественно. Никто никогда не требовал вырезать дороги из лендюзов.

Comment from Zverik on 14 June 2020 at 08:47

Кажется, здесь нет противоречий, есть только уровни детальности. Дорога через полигон леса — это нормальное приближение, когда делаешь базовое покрытие. Дорога, вокруг которой лес расступается в отдельные полигоны — это картирование уже средней детальности. Наконец, после этого уже можно по-микромапить: нарисовать ручьи в трубах под дорогой, знаки, обозначить ширину и покрытие. У OSM нет единого эталонного уровня детализации, поэтому все три способа равнозначно правильны.

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

Comment from Zkir on 14 June 2020 at 12:32

Я не вижу здесь уровней детализации, а вижу именно логическое противоречие. Лес – это такое место, где растут деревья. В тоже время дорога – это такое место, где деревья не растут.

Если допускается, что в базе [при каком-то уровне детализации] леса и дороги могут перекрываться, то при рендеренге так или иначе придется отнять одно от другого.

Если же такого не допускается, то пересекающая полигон леса дорога – это не уровень детализации, а именно ошибка топологии.

Если я таки научился отнимать полигоны друг от друга, то для меня и примыкание леса к дороге по стороне полигона (якобы ошибка топологии) уже не проблема.

Проблемой для меня может быть другое – неопределенная ширина линейной дороги. Я рискую либо получить нахлест (опять), либо зазор (белую дырку).

F4 как раз сделало правильно: отрисовало землю, поверх земли дорогу, но на дорогу втыкать деревья не стало.

Если я пойду и перересую это место более детально, я получу новый ворох проблем. См. абзацем выше.


Login to leave a comment