Изменение типа геометрии с точки на многоточечность в существующей таблице в 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';
Майк Т
источник
Привет, Майк Тойс (и Ульрик). Я не думаю, что ваш второй шаг для PostGIS 1.x необходим в этом случае, Майк. Ульрик сказал, что таблица будет пустой во время преобразования типов, поэтому не будет никаких немульти-значений, вызывающих ошибку с чем-то вроде: 1) ALTER TABLE my_table DROP CONSTRAINT inspece_geotype_the_geom; 2) ALTER TABLE my_table ДОБАВЬТЕ КОНСТРАИНТ forcece_geotype_the_geom CHECK (geometrytype (the_geom) = 'MULTIPOINT' :: text ИЛИ the_geom IS NULL); затем 3) ОБНОВЛЕНИЕ geometry_columns 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;
Миха
источник