Есть ли функция PostGIS, которая может изменить тип геометрии для существующей таблицы?
Нам нужно изменить с POINT на MULTIPOINT.
Таблица будет пустой, когда мы изменим тип геометрии, и мы не сможем просто удалить / создать таблицу.
Есть ли функция PostGIS, которая может изменить тип геометрии для существующей таблицы?
Нам нужно изменить с POINT на MULTIPOINT.
Таблица будет пустой, когда мы изменим тип геометрии, и мы не сможем просто удалить / создать таблицу.
Ответы:
Для PostGIS 2.x вы можете использовать ALTER TABLE DDL, используя выражение .
Чтобы преобразовать геометрию из одной части в геометрию из нескольких частей, используйте ST_Multi :
ALTER TABLE my_table
ALTER COLUMN geom TYPE geometry(MultiPoint,4326) USING ST_Multi(geom);
Чтобы преобразовать из нескольких частей в геометрию из одной части, это немного сложнее, так как вы можете использовать только одну часть и игнорировать все другие части (если они существуют). Сначала проверьте свои данные, чтобы увидеть, есть ли у вас геометрия с более чем одной деталью:
SELECT COUNT(CASE WHEN ST_NumGeometries(geom) > 1 THEN 1 END) AS multi_geom,
COUNT(geom) AS total_geom
FROM my_table;
Если вы видите multi_geom
больше 0, то вы рискуете потерять данные, и вам, вероятно, следует сохранить их как геометрию, состоящую из нескольких частей. Если вы видите 0, то можно сделать геометрию из одной части с помощью:
ALTER TABLE my_table
ALTER COLUMN geom TYPE geometry(Point,4326) USING ST_GeometryN(geom, 1);
Для PostGIS 1.x это немного более грязно, так как есть несколько шагов (спасибо @ rec.thegeom!).
Предполагая таблицу my_table
и столбец геометрии geom
, вот шаги для преобразования в несколько частей:
-- 1. Remove the geom_type constraint (if existing)
ALTER TABLE my_table DROP CONSTRAINT enforce_geotype_geom;
-- 2. Update the geometry data to multi-part -- skip if it is an empty table
UPDATE my_table SET geom = ST_Multi(geom);
-- 3. Re-add a different geometry constraint for the new type
ALTER TABLE my_table ADD CONSTRAINT enforce_geotype_geom
CHECK (geometrytype(geom) = 'MULTIPOINT'::text OR geom IS NULL);
-- 4. Update the geometry_columns metadata table
UPDATE geometry_columns SET type = 'MULTIPOINT'
WHERE f_table_schema = 'public' AND f_table_name = 'my_table' AND f_geometry_column = 'geom';
GEOMETRYCOLLECTION (MULTIPOLYGON(...))
вы можете изменить запрос для обнаружения более чем одной геометрии. С проверкой вроде ST_NumGeometries(ST_CollectionHomogenize(geom)) > 1
и используйте аналогичную вещь для USING
с: ST_GeometryN(ST_Multi(ST_CollectionHomogenize (geom)), 1)
или подобным.
Изменить, я так не думаю. Но вы можете создать новую таблицу с идентичной структурой, кроме столбца geom, а затем выполнить:
SELECT AddGeometryColumn('new-pt_table','geom',<SRID>,'MULTIPOINT',2);
INSERT INTO new_pt_table (attr1, attr2, attr3, ..., geom)
SELECT attr1, attr2, attr3, ... , ST_Multi(geom) FROM old_pt_table;