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

#c #line #polygon #cgal #simplification

#c #строка #полигон #cgal #упрощение

Вопрос:

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

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

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

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

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

Спасибо.

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

1. Я думаю, у вас возникают сложности, потому что вы выбрали неправильный набор инструментов для представления географической информации. Вы смотрели на GGAL 2D Arrangements ? Вы могли бы использовать их более естественно для представления плоского графика с изогнутыми краями… Руководство здесь: doc.cgal.org/latest/Arrangement_on_surface_2/index.html

2. Привет, ГЕКТО. Спасибо за ваш ответ / предложение и извинения за поздний ответ. Принимая во внимание 2D-компоновки, есть ли способ преобразовать объекты Polygon_2 в объекты 2D-компоновки и наоборот? Кроме того, есть ли способ упростить 2D-компоновки в целом, поскольку, похоже, не существует simplify() функции для 2D-компоновок? Еще раз спасибо за вашу помощь.

3. Карта, с которой вы работаете, состоит из нескольких полилиний, соединенных конечными точками — вы можете сохранить все это как компоновку. Полилинии могут быть упрощены сами по себе, а не как части полигонов. Полилинии и полигоны могут быть извлечены из компоновки с использованием различных итераторов

Ответ №1:

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

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

1. Привет @Andreas, спасибо за ваш ответ. Я полагаю, что понимаю ваше предложение и был бы готов сделать это таким образом. Однако, надеюсь, я смогу уточнить, означает ли это, что CGAL не предлагает какой-либо «собственный» способ более удобного упрощения линий для общих границ? Если это не так, знаете ли вы какие-либо пакеты C , которые позволили бы это удобное упрощение общих границ? Поскольку я анализирую поля GeoJSON, я также думал о преобразовании этих GeoJSON в TopoJSON, поскольку я считаю, что TopoJSON был создан для преобразования с сохранением топологии.

2. Обратите внимание, что вы можете достичь того, что рекомендует Андреас, используя функцию split_graph_into_polylines() на boost adjacency_list , изначально заполненном всеми входными сегментами.

3. Извините за задержку, но я еще не получил уведомление. Я добавил небольшой пример на gist.github.com . На самом деле оно не отшлифовано и должно быть внутри упрощения полилинии, но, возможно, оно полезно напрямую.

4. Привет, слориот и Андреас, большое вам спасибо за помощь. Также прошу прощения за задержку, я тоже не получил уведомление. Я попробую это, спасибо!

5. Привет, филлммон. Теперь у нас также есть запрос на извлечение, который может упростить полилинии, которые имеют общие подпоследовательности.