PostGIS - преобразование мультиполигона в одиночный полигон

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

Все полезные предложения, которые были высоко оценены

Ответ 1

Вы можете использовать ST_GeometryN вместе с ST_NumGeometries и функцию generate_series, чтобы получить то, что вам нужно.

Предположим, что у вас есть таблица из примера Jakub:

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 до количества геометрий в каждой строке.

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

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

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

Ответ 2

Я использовал ST_DUMP, чтобы преобразовать таблицу геометрий многополигона в 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

Ответ 3

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

UPDATE

Вы импортируете все необходимые данные в промежуточную таблицу (позвоните на нее 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