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