osmconvert - как сохранить мультиполигоны, не попавшие в область

Использую osmconvert для вырезания фрагментов геометрии. Иногда бывает, что в вырезаемую область попадает мультиполигон, ни одна из точек которого не находится внутри этой области.

Пример:

Ссылка на это место:
http://tools.geofabrik.de/calc/#type=geofabrik_standard&bbox=49.043379,53.638365,49.053321,53.644333&tab=1&grid=1&proj=EPSG:4326&places=4

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

Как с этим бороться?

osmconvert использую так:

osmconvert source.o5m -b=49.0433,53.6383,49.0534,53.6444 -o=test.pbf --complex-ways

В test.pbf есть только лес и два трека. Водохранилища нет.

А --complete-ways не помогает разве?

я так понял для упрощения osmconvert проверяет только вхождение точек полигона в нужную область, без проверки пересечения линий ??
мож подкорректировать область вырезания ??
–complete-ways замыкает обрезанные области, к вхождению он сколь помню не имеет отношения.

Эээ, судя по описанию он не должен обрезать линию по границе, а забирать её всю.

Если точки не попадают в область вырезки, делу ничем не поможешь. Разве что написать обрезалку самостоятельно.

Я вот так Россию нарезаю, сперва на федеральные округа, потом на области:


osmconvert RU.osm.pbf -B=C:\Russia\PBF_OSM\CFO.poly --emulate-osmosis --complete-ways --complex-ways --out-pbf -o=C:\Russia\PBF_OSM\CFO.pbf 2>&1
osmconvert CFO.pbf -B=C:\Russia\PBF_OSM\RU-MOW.poly --drop-author --emulate-osmosis --complete-ways --complex-ways -o=C:\Russia\Maps\osm\RU-MOW.osm 2>&1

А зачем --emulate-osmosis если вывод в pbf?

Сохранить всё отношение водохранилища (при помощи JOSM) в отдельный файл reservoir.osm.
Вторым проходом всем обрезкам приклеивать водохранилище принудительно.
osmconvert.exe test.pbf reservoir.osm -o=full_test.pbf

Но как я понимаю, что в большом лесу мы тоже леса не увидим.

Нет. Как сказал pfg21, --complete-ways только замыкает мультиполигоны за пределами области, чтобы отношения не ломались. --complex-ways не просто замыкает, а включает все точки во избежание проблем с геометрией.

Грусть и печаль. Обрезалку я и так написал, задействуя libgeos, но всю планету ей не скормишь. Сначала надо подготовить кусочки osmconvert-ом, а тут бац и такая неприятность. Придется нарезать на более крупные куски, но в крупных озерах и морях все равно будет отстой.

А есть простой способ получить “Enclosing features” для заданной точки? Как это на osm.org работает. Чтоб хотя бы узнать, в озере я или еще где-то. Без базы данных.

Я ищу решение не только для этого конкретного места. А так надо будет все водоёмы планеты (ну ладно, страны или области) сохранять. А еще леса, пустыни, и всё остальное.

Почему с такими маленькими областями работаете, что аж ни одна точка не попадает?

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

Это попытка сделать векторные тайлы. Картинка из первого поста - как раз тот самый тайл. В меньших масштабах вплоть до 11-го эффект тоже проявляется, а тайл 11-го масштаба это не такая уж и маленькая область.

Я надеялся, что до этого не дойдет, но, по всей видимости, для полного избавления от артефактов правильный вариант так и придется поступить. Но пока обойдусь другими решениями - бОльшие области, собственная нарезалка.

Если это про векторные тайлы, то чем плохи существующие решения?

Медлительностью, неоптимальностью, прожорливостью ОЗУ и еще много чем. Пробовал osm2vectortiles, подгонял под себя, работать работает, но блин, всё так неповоротливо. А с osmconvert вжух - и готово. Без БД и без ничего. Ну и вот всплыла проблемка такая в качестве расплаты за простоту.

Ну кстати я тоже пытался сделать самопальные тайлы и ничего путней чем БД->SHP->JSON->MbTiles не подошло.

Работайте каскадно - осмконвертом на крупные куски, а на мелкие уже самописно и аккуратно.

Так и сделано. Но, видимо, крупные куски недостаточно крупные. Будем делать крупнее.

Я тут еще одну офигенную вещь придумал: отрендерить мир в картинку такого размера, чтобы каждый пиксель соответствовал размеру тайла в том масштабе, в котором я работаю. И при нарезании по цвету пикселя определять воду/пустыню/чё там ещё.

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

Я крупные куски нарезаю по границам + % к ним, ключ --offset 0.1 для getbound.