Использую osmconvert для вырезания фрагментов геометрии. Иногда бывает, что в вырезаемую область попадает мультиполигон, ни одна из точек которого не находится внутри этой области.
В левом верхнем углу виден кусок водохранилища, но обе точки, линия между которыми видна, находятся за пределами области. В результате osmconvert выкидывает весь мультиполигон как якобы не попавший в вырезаемую область. То же самое случается, если вырезаемая область находится внутри большого полигона (того же водохранилища, или большого лесного массива). Да и обычная линия (дорога, река, граница boundary) точно так же может быть ошибочно удалена.
я так понял для упрощения osmconvert проверяет только вхождение точек полигона в нужную область, без проверки пересечения линий ??
мож подкорректировать область вырезания ??
–complete-ways замыкает обрезанные области, к вхождению он сколь помню не имеет отношения.
Сохранить всё отношение водохранилища (при помощи JOSM) в отдельный файл reservoir.osm.
Вторым проходом всем обрезкам приклеивать водохранилище принудительно.
osmconvert.exe test.pbf reservoir.osm -o=full_test.pbf
Но как я понимаю, что в большом лесу мы тоже леса не увидим.
Нет. Как сказал pfg21, --complete-ways только замыкает мультиполигоны за пределами области, чтобы отношения не ломались. --complex-ways не просто замыкает, а включает все точки во избежание проблем с геометрией.
Грусть и печаль. Обрезалку я и так написал, задействуя libgeos, но всю планету ей не скормишь. Сначала надо подготовить кусочки osmconvert-ом, а тут бац и такая неприятность. Придется нарезать на более крупные куски, но в крупных озерах и морях все равно будет отстой.
А есть простой способ получить “Enclosing features” для заданной точки? Как это на osm.org работает. Чтоб хотя бы узнать, в озере я или еще где-то. Без базы данных.
Я ищу решение не только для этого конкретного места. А так надо будет все водоёмы планеты (ну ладно, страны или области) сохранять. А еще леса, пустыни, и всё остальное.
вариант правильный: дописать алгоритм вхождения с учетом пересечения линий и полного охвата
вариант неправильный: добавить точек, но в случае полного охвата не спасет.
Это попытка сделать векторные тайлы. Картинка из первого поста - как раз тот самый тайл. В меньших масштабах вплоть до 11-го эффект тоже проявляется, а тайл 11-го масштаба это не такая уж и маленькая область.
Я надеялся, что до этого не дойдет, но, по всей видимости, для полного избавления от артефактов правильный вариант так и придется поступить. Но пока обойдусь другими решениями - бОльшие области, собственная нарезалка.
Медлительностью, неоптимальностью, прожорливостью ОЗУ и еще много чем. Пробовал osm2vectortiles, подгонял под себя, работать работает, но блин, всё так неповоротливо. А с osmconvert вжух - и готово. Без БД и без ничего. Ну и вот всплыла проблемка такая в качестве расплаты за простоту.
Так и сделано. Но, видимо, крупные куски недостаточно крупные. Будем делать крупнее.
Я тут еще одну офигенную вещь придумал: отрендерить мир в картинку такого размера, чтобы каждый пиксель соответствовал размеру тайла в том масштабе, в котором я работаю. И при нарезании по цвету пикселя определять воду/пустыню/чё там ещё.
тогда проще пройтись по полигонам и в отдельные таблицы для каждого z** накидать значений тегов полигонов, если ячейка-тайл полностью влезает в полигон. будет тоже самое, но без растровых преобразований туда-обратно.