Как стать автором
Обновить

Дмитрий Лебедев: «Несколько лет назад я явно понимал, что еще чуть-чуть и OpenStreetMap пойдет ко дну»

Время на прочтение 8 мин
Количество просмотров 7.6K
Всего голосов 28: ↑28 и ↓0 +28
Комментарии 6

Комментарии 6

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


Как мне замкнуть эту линию, чтобы получить область воды в пределах моей области в виде простого полигона?


Нельзя просто соединить начало и конец линии, замкнув полигон. Это будет работать для выпуклых водоемов, но не сработает со всякими островами. На картинке под катом изобразил примеры.
Не выйдет добавить в полигон границы участка — так как просто непонятно, с какой стороны от линии берега собственно вода находится.


Варианты экспорта берегов

image


Может кто-то что-то подсказать?

Если замыкать по границе внешнего прямоугольника — по ее точкам пересечения с линиями полигонов? Тип заливки несет в себе сама граница, от нее и распространять заливку в полигоне?

Так непонятно, в какую сторону. Вправо или влево? Линия границы не несет никакой информации о том, по какую сторону от нее находится внешняя и внутренняя части полигона. И нет общепринятого порядка задания вершин в полигонах, могут быть как по, так и против часовой и вообще как угодно.

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

В случае coastline всё просто — «land is on the left side and water on the right side of the way (when viewing in the direction of the way arrows)»
В случе просто водяных объектов (озёр/рек) сложнее — нужно при обрезке оставлять граничные объекты целиком (параметр completeWays/completeRelations у osmosis) и затем при конвертации делать геометрическую обрезку (intersection) объекта полигона с прямоугольником обрезки.

О, спасибо, про тему с coastline как-то не знал.

Зарегистрируйтесь на Хабре , чтобы оставить комментарий

Публикации