Есть ли способ заставить упрощение полилиний CGAL работать для внутренних/общих границ?

Я пытался выполнить упрощение линий на полигонах, принадлежащих картам, с помощью этого руководство CGAL, например. Южная Корея.

Это скриншот Южной Кореи после упрощения строк с помощью CGAL.

Я выполнил упрощение линий, добавив каждый полигон в CGAL::Constrained_triangulation_plus_2<CDT> ct, а затем запустив CGAL::Polyline_simplification_2::simplify(ct, Cost(), Stop(0.5));.

Внешние границы будут упрощены, а внутренние/общие границы (между провинциями) — нет. Есть ли способ упростить внутренние/общие границы?

Я также попытался создать simplify каждый полигон по отдельности, а затем объединить их вместе, чтобы сформировать всю страну. Проблема, однако, в том, что каждый полигон упростится сам по себе, и поэтому, если Polygon1 упростится, нет никакой гарантии, что общие вершины соседнего Polygon2 переместятся в те же координаты, что и вершины Polygon1, поэтому пересечения происходят, когда вы соедините их вместе, как это произойдет с этой картой Южной Кореи.

Спасибо.


person fillmoon    schedule 11.11.2020    source источник
comment
Я думаю, у вас возникают сложности, потому что вы выбрали неправильный набор инструментов для представления географической информации. Вы смотрели GGAL 2D Arrangements? Вы могли бы использовать их более естественно для представления плоского графика с изогнутыми краями... Руководство находится здесь: doc.cgal.org/latest/Arrangement_on_surface_2/index.html   -  person HEKTO    schedule 04.12.2020
comment
Привет ХЕКТО. Спасибо за ваш ответ/предложение и приносим извинения за поздний ответ. Принимая во внимание 2D-аранжировки, есть ли способ преобразовать объекты Polygon_2 в объекты 2D-аранжировки и наоборот? Кроме того, есть ли способ упростить 2D-аранжировки в целом, поскольку, похоже, не существует функции simplify() для 2D-аранжировок? Еще раз спасибо за вашу помощь.   -  person fillmoon    schedule 18.12.2020
comment
Карта, с которой вы работаете, состоит из ряда полилиний, соединенных конечными точками — все это вы можете сохранить как компоновку. Полилинии можно упростить сами по себе, а не как части полигонов. Полилинии и многоугольники могут быть извлечены из расположения с помощью различных итераторов.   -  person HEKTO    schedule 19.12.2020


Ответы (1)


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

person Andreas Fabri    schedule 12.11.2020
comment
Привет @Andreas, спасибо за ваш ответ. Я полагаю, что понимаю ваше предложение и был бы готов сделать это таким образом. Однако, надеюсь, я смогу прояснить, означает ли это, что CGAL не предлагает какого-либо родного способа более удобного упрощения линий для общих границ? Если нет, знаете ли вы о каких-либо пакетах C++, которые позволили бы это удобное упрощение общих границ? Поскольку я анализирую поля GeoJSON, я также думал о преобразовании этих GeoJSON в TopoJSON, поскольку я считаю, что TopoJSON был создан для преобразования с сохранением топологии. - person fillmoon; 13.11.2020
comment
Обратите внимание, что вы можете добиться того, что рекомендует Андреас, используя функцию split_graph_into_polylines() на бусте adjacency_list, изначально заполненном все входные сегменты. - person sloriot; 18.11.2020
comment
Извините за задержку, но я еще не получил уведомление. Я добавил небольшой пример на gist.github.com. Он не совсем отполирован и должен быть внутри упрощения полилинии, но, возможно, он полезен непосредственно. - person Andreas Fabri; 18.11.2020
comment
И я добавил запрос функции - person Andreas Fabri; 18.11.2020
comment
Привет sloriot и Андреас, большое спасибо за помощь. Приношу извинения за задержку, мне тоже не пришло уведомление. Я попробую это, спасибо! - person fillmoon; 24.11.2020
comment
Привет, sloriot и Андреас, у меня есть связанный с этим вопрос. Я понимаю, что буду упрощать полилинии, создавая объект CT, затем сохраняя в нем полилинии, а затем запуская CGAL::simplify(). Однако после упрощения как мне получить их в форме многоугольника? Следовательно, в конечном итоге я хотел бы преобразовать эти упрощенные полилинии в многоугольники, чтобы я мог экспортировать их в файлы GeoJSON. Благодарю вас! - person fillmoon; 27.11.2020
comment
Здравствуйте Филмон. Теперь у нас также есть запрос на вытягивание, который может упростить ломаные линии, имеющие общие подпоследовательности. - person Andreas Fabri; 01.02.2021
comment
Привет Андреас, спасибо за обновление! - person fillmoon; 08.06.2021