Мне не удалось найти «имя» алгоритма, который позволял бы преобразовывать линии в полигоны. Поскольку эта проблема пересекает ГИС и области вычислительной геометрии и информатики. Я не уверен, что еще добавить в смесь. Я не хочу приводить список того, что я искал, так как я также хотел бы знать, что другие люди считают своим первым критерием поиска.
Сценарий ... У меня есть линии (две точки, необходимые для построения линии) ... каждая линия связана по крайней мере с одной другой линией. Промежуточное пространство между соединенными линиями сформировало бы многоугольник. Простейшим сценарием был бы треугольник ... прямоугольник ... и можно было бы перейти к многосегментным элементам.
Извините за любые расплывчатые описания, но, как я уже сказал, я не хочу направлять возможные решения по пути, который я уже посетил, поскольку меня интересует «первая мысль» так же, как и окончательное решение.
источник
Ответы:
Возможно, "заполнить область"? Смотрите здесь и здесь .
редактировать
Другая возможность - ограниченная триангуляция . (Ссылка на апплет Java, который позволяет рисовать график с помощью мыши, а затем иллюстрирует алгоритм развертки плоскости для его триангуляции.) Результат любой такой триангуляции, независимо от того, как она выполняется, может быть легко обработан для создайте нужные полигоны: просто объедините все соседние треугольники, которые имеют только что созданное ребро.
пример
Исходный график:
Триангулированный график:
источник
В теории графов эта операция называется вычислением граней . Это связано с вычислением двойственного заданного графа.
Например, в Java-библиотеке GeOxygène у графа (называемого CarteTopo ) есть метод getFaces для извлечения его лица .
Это называется полигонизация в JTS
источник
Хост-программа RepRap преобразует список отрезков (в некотором неизвестном случайном порядке) в список многоугольников, который звучит похоже на то, что вы пытаетесь сделать.
В частности, алгоритм «сопоставления концов» RepRap обрабатывает множество патологических случаев.
Увы, программное обеспечение RepRap предполагает, что каждый угол имеет четное число ребер, идущих к нему - 2 линии, идущие к углу на нормальном объекте; 4 линии, идущие вместе, когда угол одного объекта касается угла другого объекта и т. Д. Я не знаю, насколько сложно было бы адаптировать этот алгоритм для обработки диаграмм вороной, которые обычно имеют 3 ребра, идущие к каждому углу.
источник
Вы изучили кодовую базу GRASS для решения вашей проблемы? -> http://old.nabble.com/Polyline-to-Polygon-operation-td20257839.html
источник
main.c
поv.type
источнику, все, что происходит, - это то, что функции помечаются как границы: никакой фактической обработки не происходит. В ретроспективе это не слишком удивительно: если (я не знаю точно) объекты поддерживаются полной 2D-топологической информацией, то все вычисления для определения полигональных областей автоматически выполняются при создании или импорте объектов и сохраняются на протяжении всего процесса. все операции геообработки.алло
Я не думаю, что вы ищете конкретный алгоритм. Задача может быть довольно сложной или очень простой в зависимости от вашего набора данных.
Вы должны разделить проблему как минимум на 2 части. 1) это скорее сетевая проблема, как найти замкнутые кольца линейных линий. 2) выразить замкнутую линейную линию как многоугольник
Вторая часть, которая заключается в «преобразовании линий в многоугольники», в большей степени зависит от формата, чем представление полигонов / линий. Я имею в виду переход от:
LINESTRING (1 1, 2 2)
LINESTRING (2 2, 2 1)
LINESTRING (2 1, 1 1)
чтобы:
POLYGON ((1 1,2 2,2 1,1 1))
конвертирует линию в многоугольник, но я думаю, это не то, о чем вы говорите. Более сложная часть - первая. Если у вас есть спагетти из линий, как заказать их в виде закрытых линий.
Я думаю, что ответ на этот вопрос во многом зависит от набора данных. Как Кирк спрашивает, могут ли линии пересечь проблему намного больше. Если вы знаете, что все «линейные коллекции» являются частью закрытой линейной строки, это становится проще. Затем вы можете взять любую линию и пройти по пути, пока не вернетесь снова, а затем перейти ко второму шагу выше.
Я хочу сказать, что условие набора данных устанавливает все правила, как это сделать. Если вы хотите найти все возможные многоугольники в спагетти линейных линий, я предполагаю, что потребуется множество различных алгоритмов для размещения точек вершин во всех пересечениях, поиска всех возможных путей и так далее.
В PostGIS функция называется ST_Polygonize. Эта функция создает все возможные многоугольники из заданных вами линий линий.
Это выполняется GEOS, поэтому вы можете найти алгоритмы в коде GEOS и JTS.
Просто некоторые мысли
/ Никлас
источник
Вы можете попробовать поискать алгоритм «Вперед». Мне сказали, что это общий характер, но единственные обсуждения, которые я когда-либо читал, всегда были связаны с arcgis. Может быть, посмотрите на ссылки, приведенные в этих примечаниях к лекции для впереди звезды.
источник