Зміна типу геометрії з точки на багатоточку в межах існуючої таблиці в PostGIS?


31

Чи існує функція PostGIS, яка може змінити тип геометрії для існуючої таблиці?

Нам потрібно перейти від POINT до MULTIPOINT.

Таблиця буде порожньою, коли ми змінимо тип геометрії, і ми не можемо просто скинути / створити таблицю.

Відповіді:


62

Для 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';

Привіт @Mike Toews (і Ulrik). Я не думаю, що ваш другий крок для PostGIS 1.x в цьому випадку необхідний, Майк. Ульрік сказав, що таблиця буде порожньою під час перетворення типів, тому не буде жодних немножинних значень, які б викликали помилку з чимось на зразок: 1) ALTER TABLE my_table DROP CONSTRAINT Execuce_geotype_the_geom; 2) ALTER TABLE my_table ADD CONSTRAINT Execuce_geotype_the_geom CHECK (geometrytype (the_geom) = 'MULTIPOINT' :: текст АБО the_geom NULL); потім 3) ОНОВЛЕННЯ геометричних стовпців SET type = 'MULTIPOINT' WHERE f_table_name = 'my_table'; (можливо, найскладніший коментар колись - мій поганий)
rec.thegeom

@ rec.thegeom правильний; з порожньою таблицею нічого не можна буде оновлювати. Дякуємо, що опублікували фактичні команди!
Майк Т

Якщо у вас є складні дані в різних формах, наприклад, GEOMETRYCOLLECTION (MULTIPOLYGON(...))ви можете змінити запит на виявлення більше однієї геометрії. З позначкою "Подобається" ST_NumGeometries(ST_CollectionHomogenize(geom)) > 1та використовуйте подібну річ для USING: ST_GeometryN(ST_Multi(ST_CollectionHomogenize (geom)), 1)або подібної.
Равбакер

4

Зміна, я не думаю. Але ви можете створити нову таблицю з однаковою структурою, за винятком стовпця 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;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.