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

我们需要从POINT更改为MULTIPOINT。

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

#1 楼

对于PostGIS 2.x,可以使用带表达式的ALTER TABLE DDL。

要从单部分几何转换为多部分几何,请使用ST_Multi:

要从多零件几何转换为单零件几何,这比较棘手,因为您只能使用一个零件,而忽略所有其他零件(如果存在)。首先检查数据,看看是否有一些几何图形包含多个部分:

ALTER TABLE my_table
    ALTER COLUMN geom TYPE geometry(MultiPoint,4326) USING ST_Multi(geom);


如果看到multi_geom大于0,则可能会丢失数据,并且您可能应该将其保留为多部分几何图形。如果看到0,则可以使用以下方法将其制成单个零件的几何形状是安全的:
更加混乱,因为要执行多个步骤(感谢@ rec.thegeom!)。 br />
SELECT COUNT(CASE WHEN ST_NumGeometries(geom) > 1 THEN 1 END) AS multi_geom,
       COUNT(geom) AS total_geom
FROM my_table;


评论


嗨,@ 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.thegeom
2012年7月11日在17:56



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

– Mike T
2012年7月11日在18:47

如果您具有各种形式的复杂数据,例如GEOMETRYCOLLECTION(MULTIPOLYGON(...)),则可能需要更改查询以检测多个几何。使用类似ST_NumGeometries(ST_CollectionHomogenize(geom))> 1的检查,并将类似的东西用于以下用途:ST_GeometryN(ST_Multi(ST_CollectionHomogenize(geom)),1)或类似。

–拉夫贝克
19年5月10日在15:12

#2 楼

改变,我不这么认为。但是您可以创建一个具有相同结构(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;