OpenStreetMap Forum

The Free Wiki World Map

You are not logged in.

Announcement

A fix has been applied to the login system for the forums - if you have trouble logging in please contact support@openstreetmap.org with both your forum username and your OpenStreetMap username so we can make sure your accounts are properly linked.

#1 2017-11-09 23:58:06

romanshuvalov
Member
From: Togliatti, Russia
Registered: 2015-02-26
Posts: 382
Website

Упростить shape-файл для мелких масштабов. Одно решение есть.

Добрый день.

Через osmfilter и ogr2ogr выдёргиваю нужные мне слои и сохраняю их в шейпфайлы. Нужно упростить геометрию для мелких масштабов. У ogr2ogr есть параметр -simplify, но работает он вот так:

0_94ff1_5c86391b_orig.png

Остается куча меких ненужных полигончиков. Я сделал фильтрацию по площади (переменная OGR_GEOM_AREA в sql-запросе), но мелкие внутренние inner-области полигонов остались, их видно на картинке. И из-за них упрощение не может быть выполнено, так сказать "в полной мере". На картинке гребешок сверху должен был быть срезан, но паразитные внутренние области не дали алгоритму этого сделать.

Возникла мысль применить для геометрии операцию "buffer" с положительным, а потом еще раз с отрицательным оффсетом. Буфер просто съест всю мелочь, правда, еще и склеит близлежащие линии. Но в целом результат неплохой, проверял в QGIS. Для автоматизации надо будет написать скрипт, а входные данные еще и предварительно порезать на фрагметы.

Прежде чем начать с этим всем возиться, хотел бы узнать, может, есть более простые решения? Или, может, вообще где-то лежат готовые упрощенные данные? Слепленный из coastline и упрощенный океан я взял с openstreetmapdata.com, а русла рек там никуда не годятся, все в треугольничках. Natural Earth не предлагать, для 6-го масштаба уже не годится, к тому же мне нужны еще и леса и пустыни.

Last edited by romanshuvalov (2017-11-10 03:45:30)

Offline

#2 2017-11-10 03:41:36

romanshuvalov
Member
From: Togliatti, Russia
Registered: 2015-02-26
Posts: 382
Website

Re: Упростить shape-файл для мелких масштабов. Одно решение есть.

В общем, буферизацией и решил задачу. У меня на одном из этапов используется самописная приблуда на основе libGEOS, вписал туда между строк пару вызовов GEOSBuffer() и готово:

0_94ff2_7df537c3_orig.png

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

Если кому есть что добавить, пишите, почитаем.

Last edited by romanshuvalov (2017-11-10 03:45:07)

Offline

#3 2017-11-10 06:07:34

Gotegomadi
Member
Registered: 2017-05-26
Posts: 91

Re: Упростить shape-файл для мелких масштабов. Одно решение есть.

Попробуй посчитать скелет https://en.wikipedia.org/wiki/Topological_skeleton, я даже как-то давно находил крутую либу на крестах для этого. И потом, уже имея скелет, можно достаточно сильно варьировать изменения в ту или иную сторону. Как вариант, можно попробовать растеризовать, пофильтровать кучей фильтров вроде разных матриц свертки, трассировать обратно, можно через промежуточные данные вроде скелетика, и хоть это сожрет кучу памяти/времени, качество результата должно быть на высоте, так как на каждом этапе можно контролировать промежуточные результаты.


Пишу ненужный код для несуществующих задач

Offline

#4 2017-11-10 12:11:30

Mir76
Member
From: Екатеринбург
Registered: 2009-12-18
Posts: 1,314

Re: Упростить shape-файл для мелких масштабов. Одно решение есть.

А вот это:
https://doc.cgal.org/latest/Polyline_si … lification
это не то, что вам нужно?
Или сразу вот это: https://postgis.net/docs/ST_SimplifyVW.html

Offline

#5 2017-11-10 16:07:59

romanshuvalov
Member
From: Togliatti, Russia
Registered: 2015-02-26
Posts: 382
Website

Re: Упростить shape-файл для мелких масштабов. Одно решение есть.

имея скелет, можно достаточно сильно варьировать изменения в ту или иную сторону

Скелет бесполезен, он не дает ширину. К тому же из первой картинки получится офигенно сложный скелет, содержащий всё то, от чего, наоборот, надо избавиться.

Mir76 wrote:

А вот это:
https://doc.cgal.org/latest/Polyline_si … lification
Или сразу вот это: https://postgis.net/docs/ST_SimplifyVW.html

Прогонять через PostGIS это как-то не очень рационально. А вот CGAL прикрутить, наверное, можно. Програма на Си, работаю с libGEOS (честно говоря, я думал, что GEOS и CGAL это одно и то же, одно использует другое). Основная возня будет преобразованием GEOSGeom_t в CGAL::Polygon_2 и обратно.

Offline

Board footer

Powered by FluxBB