PostGIS-преобразование multipolygon в один многоугольник

можно ли импортировать файл формы, содержащий мультиполигоны, в один полигон в PostGIS? Всякий раз, когда я пытаюсь импортировать файл формы многоугольника, он хранится как multipolygon (в отличие от одного многоугольника) в . Таким образом, я не могу извлечь его как одно полигональное значение из мультиполигона.

все полезные предложения очень ценятся

3 ответов


можно использовать ST_GeometryN вместе с ST_NumGeometries и функция generate_series для получения того, что вам нужно.

предположим у вас есть таблица из примера Якуб:

CREATE TABLE multi AS(
SELECT 1 as id, 2 as test, ST_GeomFromText('MULTIPOLYGON(((0 0,4 0,4 4,0 4,0 0)),((1 1,2 1,2 2,1 2,1 1)), ((-1 -1,-1 -2,-2 -2,-2 -1,-1 -1)))') AS geom
);

этот содержит мультиполигон, идентификатор и другой столбец.

чтобы получить каждый полигон из таблицы, включая все остальные атрибуты, попробуйте что-то вроде:

SELECT id, test, ST_GeometryN(poli, generate_series(1, ST_NumGeometries(geom))) AS geom 
FROM multi

" id " и "test" - это значения для каждой строки в исходная таблица. generate_series создает ряд чисел от 1 до числа геометрий в каждой строке.

вы разделили каждую несколькими геометрии в ее отдельные части геометрии и значения в других колонках остались прежними.

просто замените столбцы и таблицу в Примере столбцами из экспортированного шейп-файла, и вы получите таблицу с одиночными полигонами.

надеюсь, это ответит на ваш вопрос.


Я ST_DUMP чтобы преобразовать таблицу multipolygon geometries в PostgreSQL в новую таблицу с полигональной геометрией и другими столбцами данных.

CREATE TABLE poly AS                       --poly will be the new polygon table
WITH dump AS (
    SELECT id, test,                       --columns from your multipolygon table 
      (ST_DUMP(geometry)).geom AS geometry 
    FROM multi                             --the name of your multipolygon table
) 
SELECT id, test, 
  geometry::geometry(Polygon,4326)         --type cast using SRID from multipolygon
FROM dump;

обновление: Я думаю, что это может быть достигнуто намного проще с этим запросом.

CREATE TABLE polygon_table AS 
    SELECT id, example_column, (ST_DUMP(geom)).geom::geometry(Polygon,4326) AS geom FROM multipolygon_table

импорт в промежуточную таблицу, а затем использовать ST_DUMP тормозить multigeom в индивидуальные части и использовать это для того чтобы заполнить таблицу назначения.

обновление

импортировать все необходимые данные в промежуточную таблицу (назовем его multi), а затем использовать ST_DUMP сломать mutligeometry в одном геометрий:

WITH multi AS(
SELECT 1 as id, 2 as test, ST_GeomFromText('MULTIPOLYGON(((0 0,4 0,4 4,0 4,0 0)),((1 1,2 1,2 2,1 2,1 1)), ((-1 -1,-1 -2,-2 -2,-2 -1,-1 -1)))') as poli
)
,dump AS(
SELECT  id
    ,test
    ,ST_DUMP(poli) as d
FROM    multi)
SELECT  id
    ,test
    ,(dump.d).path
    ,ST_AsTEXT((dump.d).geom)
FROM dump