地理データを扱うシステムを開発する際に、 PostGIS のマルチポリゴンのデータをシングルポリゴン(単一ポリゴン)に変更する機会があったので、その方法を記しておきます。
シングルポリゴンとマルチポリゴンのテーブル
以下のようなシングルポリゴンのテーブルがあるとします。
CREATE TABLE areas (
area_id integer NOT NULL,
wkb_geometry public.geometry(Polygon,4326)
);
上記のテーブルに、以下のマルチポリゴンのテーブルのデータをシングルポリゴンに変換して入れようと思います。
CREATE TABLE areas_multi (
area_id integer NOT NULL,
wkb_geometry public.geometry(MultiPolygon,6668)
);
変換 SQL
前提として area_id は 2つのテーブル間で重ならないとします。
以下の SQL で areas_multi.wkb_geometry のマルチポリゴンをシングルポリゴンに変換して、 areas.wkb_geometry に挿入します。
BEGIN;
INSERT INTO areas (area_id, wkb_geometry)
SELECT area_id, (ST_Dump(ST_Transform(wkb_geometry, 4326))).geom FROM areas_multi;
COMMIT;
まず、空間参照系が異なりますので、 SRID:6668 の参照系から SRID:4326 の参照系へ ST_Transform を用いて変換します。
次に ST_Dump でマルチポリゴンをシングルポリゴンに変換しています。
ST_Dump はマルチポリゴンを変換した場合、 geometry_dump(geom, path) の形式の複数のレコードに変換されます。
今回は geom だけを挿入しましたが、各ポリゴンをユニークに扱いたい場合は、 path を含めた複合キーを作るなど、工夫が必要です。
参考