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