Создать полигон из линий в PostGIS

13

Я пытаюсь разделить многоугольник на более мелкие многоугольники из линии, но я думаю, что не могу использовать функцию st_split. Что мне нужно, так это создать маленькие полигоны внутри большого, используя сетку линий.

Я пробовал несколько способов, но я не могу получить результат. Что я пробовал:

Разделите один многоугольник от LineString, используя st_split ()

С пограничного многоугольника.

введите описание изображения здесь

И Линестринг стол:

введите описание изображения здесь

Мне понадобятся следующие полигоны:

введите описание изображения здесь

Проблема : я не могу разделить многоугольник по нескольким линиям, ни многоугольник из многоканальной строки.

Другой метод, который я пытаюсь создать, состоит в создании полигонов из линий с помощью st_polygonize (). SQL-код, который я пробовал:

SELECT 
   g.path[1] as gid, 
   g.geom::geometry(polygon, 22033) as geom 
FROM
   (SELECT 
     (ST_Dump(ST_Polygonize(geom))).* 
   FROM linestable
) as g;

Извлечено из создания полигонов из линейных сегментов с использованием PostgreSQL и PostGIS

Проблема : я могу получить только один многоугольник (границу).

Может кто-нибудь сказать мне, что было бы лучшим способом получить полигоны из строки, или я что-то упустил?

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

По требованию Джона, вот таблица линий. https://drive.google.com/file/d/0B603y_m735jfS014S0EyVnpMUEU/view?usp=sharing

Пабло Пардо
источник
1
Можете ли вы опубликовать геометрию линии где-нибудь? ST_Polygonize вместе с ST_Dump должен работать.
Джон Пауэлл
Конечно. Я отредактировал пост со ссылкой на таблицу.
Пабло Пардо
@ JohnPowellakaBarça вы можете посмотреть на это. Этот вопрос великолепен. ST_Polygonize для его набора образцов возвращает один полигон. Нам по сути нужно разложить его беспорядок на открытые ЛИНСТРИНГИ и найти все из них, которые могут составлять прямоугольники?
Эван Кэрролл
1
@EvanCarroll. Конечно. Я безумно занят, поэтому, вероятно, не на несколько дней.
Джон Пауэлл
1
@ppardoz. Espero que esto te ayude. Я заметил, что все ваши таблицы были на испанском :-)
Джон Пауэлл

Ответы:

4

Я получил эту работу, используя сначала ST_Node , в сочетании с ST_Collect , чтобы преобразовать строки в набор узловых строк в пределах MultiLinestring .

Как сказано в документации для ST_Node :

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

Это означает, что все линейные линии объединены во всех возможных комбинациях, чтобы составить эквивалент внешнего кольца многоугольника. Принимая во внимание, что если вы пытаетесь ST_Polygonize набор LineStrings, ни один из которых сам по себе не описывает многоугольник, вы просто возвращаете LineStrings. Итак, это работает:

WITH multi(geom) AS (
  SELECT ST_Node(ST_Collect(geom))
  FROM leyenda_digitalizar00
)
SELECT ST_AsText( (ST_Dump(ST_Polygonize(geom))).geom )
FROM multi;

Если вы просто запустите первую часть этого, то есть CTE multi, результат будет выглядеть так:

MULTILINESTRING ((204,5 69,9000000000004,204,5 69,9000000000004), (204,5 68,9 205,4 68,9), (204,5 68,9 204,5 69 204,5 69,1 204,5 69,2 204,5 69,3 204,5 69,4 204,5 69,5 204,5 69,604,5 69,5 20 69,204,5 69,8 204,5 69,9000000000004), (209,5 68,9 209,5 68,8 209,5 68,7 209,5 68,6 209,5 68,5 209,5 68,4 209,5 68,3 209,5 68,2 209,5 68,1 209,5 68 209,5 67,9 209,5 67,8 209,5 67,7 209,5 67,6 209,5 67,4 , 209,5 .......

Теперь, когда вы теперь передаете эту MultiLinestring в ST_Polygonize, она работает как положено, например,

ПОЛИГОН ((205,4 68,9 204,5 68,9 204,5 69 204,5 69,1 204,5 69,2 204,5 69,3 204,5 69,4 204,5 69,5 204,5 69,6 204,5 69,7 204,5 69,8 204,5 69,9 204,5 69,9000000000004 205,4 69,9 205,4 68,9) 20,9 205,4 68,9))

POLYGON ((204,5 69,9000000000004 204,5 70 204,5 70,1 204,5 70,2 204,5 70,3 204,5 70,4 206,8 70,4 209,5 70,4 209,5 70,3 209,5 70,2 209,5 70,1 209,5 70 209,5 69,9 205,4 69,9 204,5 69,9000000000004))

ПОЛИГОН ((206,8 70,4 204,5 70,4 204,5 70,5 204,5 70,6 204,5 70,7 204,5 70,8 204,5 70,9 204,5 71 204,5 71,1 204,5 71,2 204,5 71,3 204,5 71,4 206,8 71,4 206,8 70,4))

Очевидно, что ST_AsText только для иллюстрации, и вам придется настроить, если вы тоже хотите идентификатор пути.

Ключевым выводом является то, что ST_Polygonize ожидает строки строк, которые уже описывают контур многоугольника , что и делает ST_Node (ST_Collect (.... в приведенном выше).

Джон Пауэлл
источник
Это действительно круто, я могу подтвердить, что это решение работает! С другой стороны, интересно , почему ST_Polygonize()говорит , что это берет строку строки, или то , что случай использования для этого без вызова ST_Node()первого
Evan Carroll
1
@EvanCarroll. Я думаю, что ответ заключается в том, что ST_Polygonize принимает строки строк, которые уже находятся в наборе, представляющем многоугольник, тогда как строки строк в этом вопросе составляют несколько возможных многоугольников. Насколько я понимаю, это то, что делает ST_Node. Я попытаюсь исследовать дальше и обновить ответ.
Джон Пауэлл