在PostGIS现有表格中将几何类型从点更改为多点?


31

是否有PostGIS函数可以更改现有表的几何类型?

我们需要从POINT更改为MULTIPOINT。

当我们更改几何类型时,该表将为空,我们不能仅删除/创建该表。

Answers:


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的第二步。Ulrik说,在类型转换时,该表将为空,因此不会有任何非多值引起如下错误:1)ALTER TABLE my_table DROP CONSTRAINTforce_geotype_the_geom; 2)ALTER TABLE my_table添加约束FORCE_GEOTYPE_THE_GEOM CHECK(geometrytype(the_geom)='MULTIPOINT':: text或the_geom为NULL); 然后3)UPDATE geometry_columns SET type ='MULTIPOINT'WHERE f_table_name ='my_table'; (也许是最草率的评论-我的错)
rec.theom

@ rec.thegeom正确;如果表为空,则没有任何更新。感谢您发布实际命令!
Mike T

如果您具有各种形式的复杂数据,GEOMETRYCOLLECTION (MULTIPOLYGON(...))则可能需要更改查询以检测多个几何。用check like ST_NumGeometries(ST_CollectionHomogenize(geom)) > 1USINGwith 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;
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.