PostGISの既存のテーブル内でジオメトリタイプをポイントからマルチポイントに変更しますか?


31

既存のテーブルのジオメトリタイプを変更できるPostGIS関数はありますか?

ポイントからマルチポイントに変更する必要があります。

ジオメトリタイプを変更するとテーブルは空になり、テーブルを単にドロップ/作成することはできません。

回答:


62

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_geom0よりも大きい場合は、データを失うリスクがあり、おそらくマルチパートジオメトリとして保持する必要があります。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の2番目のステップは必要ないと思います、Mike。Ulrikは、型変換の時点でテーブルが空になるため、次のようなエラーを引き起こすマルチ以外の値は存在しないと述べました。1)ALTER TABLE my_table DROP CONSTRAINT 2)ALTER TABLE my_table ADD CONSTRAINT forced_geotype_the_geom CHECK(geometrytype(the_geom)= 'MULTIPOINT' :: text OR the_geom IS NULL); その後、3)UPDATE geometry_columns SET type = 'MULTIPOINT' WHERE f_table_name = 'my_table'; (おそらくこれまでで最もゆるいコメント-私の悪い)
-rec.thegeom

@ rec.thegeom正しい; 空のテーブルでは、更新するものは何もありません。実際のコマンドを投稿していただきありがとうございます!
マイクT

そのようなさまざまな形式の複雑なデータがある場合GEOMETRYCOLLECTION (MULTIPOLYGON(...))、複数のジオメトリを検出するためにクエリを変更することができます。以下のようにチェックしてST_NumGeometries(ST_CollectionHomogenize(geom)) > 1、同様のためのものを使用USINGして:ST_GeometryN(ST_Multi(ST_CollectionHomogenize (geom)), 1)または類似の。
Ravbaker

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;
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.