Как преобразовать полигональные данные в сегменты линий с помощью PostGIS

#sql #postgresql #gis #postgis

#sql #postgresql #гис #postgis

Вопрос:

У меня есть таблица данных полигона в PostgreSQL / PostGIS. Теперь мне нужно преобразовать эти полигональные данные в соответствующие им сегменты линий. Кто-нибудь может сказать мне, как преобразовать его с помощью запросов PostGIS.

Заранее спасибо

Ответ №1:

Как правило, преобразование полигона в линию может быть непростым, поскольку нет однозначного сопоставления, а различные элементы полигонального сопоставления соответствуют разным линиям (внешнее кольцо, внутренние кольца и т. Д.).

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

 SELECT ST_AsText( ST_MakeLine(sp,ep) )
FROM
   -- extract the endpoints for every 2-point line segment for each linestring
   (SELECT
      ST_PointN(geom, generate_series(1, ST_NPoints(geom)-1)) as sp,
      ST_PointN(geom, generate_series(2, ST_NPoints(geom)  )) as ep
    FROM
       -- extract the individual linestrings
      (SELECT (ST_Dump(ST_Boundary(geom))).geom
       FROM mypolygontable
       ) AS linestrings
    ) AS segments;
  

в зависимости от того, в каком полигоне хранятся данные mypolygontable , вы можете захотеть сбросить не только границу (как указано выше ST_Boundary ), но и другие элементы. Приведенный выше код с более подробным обзором взят из списка postgis-users: Разделите полигон на N строк

Существует также общий подход к проблеме, описанный в разделе Разбиение строки строк или полигона на отдельные векторы в PostGIS

Ответ №2:

Это первое попадание в Google при поиске этой проблемы. Я не знаю, прошло ли так много времени с тех пор, как была создана функция, но для будущих пользователей Google ST_ExteriorRings (geom) отлично сработал для меня. http://postgis.net/docs/ST_ExteriorRing.html

 SELECT ST_ExteriorRing(ST_Dump(geom)).geom)
FROM foo
  

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

1. @DonaldDuck Ответ не на 100% правильный. Имя функции ST_ExteriorRing , а не ST_ExteriorRings (обратите внимание на конец s ). Он генерирует одну строку linestring вместо нескольких сегментов линий. Кроме того, он исключает границы отверстий. Он также терпит неудачу при мультиполигонах.

2. Хотя эта ссылка может дать ответ на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы только для ссылок могут стать недействительными, если связанная страница изменится.