既存のテーブルのジオメトリタイプを変更できるPostGIS関数はありますか?
ポイントからマルチポイントに変更する必要があります。
ジオメトリタイプを変更するとテーブルは空になり、テーブルを単にドロップ/作成することはできません。
既存のテーブルのジオメトリタイプを変更できるPostGIS関数はありますか?
ポイントからマルチポイントに変更する必要があります。
ジオメトリタイプを変更するとテーブルは空になり、テーブルを単にドロップ/作成することはできません。
回答:
PostGIS 2.xでは、式を使用してALTER TABLE DDLを使用できます。
シングルパートジオメトリからマルチパートジオメトリに変換するには、ST_Multiを使用します。
ALTER TABLE my_table
ALTER COLUMN geom TYPE geometry(MultiPoint,4326) USING ST_Multi(geom);
マルチパートジオメトリからシングルパートジオメトリに変換するには、1つのパートしか使用できず、他のすべてのパート(存在する場合)を無視できるため、少し注意が必要です。最初にデータをチェックして、複数のパーツを持つジオメトリがあるかどうかを確認します。
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)
または類似の。