複数ポリゴンを含むシェイプファイルをPostGISの単一ポリゴンにインポートすることはできますか?ポリゴンのシェイプファイルをインポートしようとするたびに、geom
列に(1つのポリゴンではなく)マルチポリゴンとして保存されます。したがって、マルチポリゴンから単一のポリゴン値として抽出することはできません。
すべての有用な提案は大歓迎
ST_GeometryN を ST_NumGeometries およびgenerate_series関数と一緒に使用して、必要なものを取得できます。
Jakubの例のテーブルがあると仮定しましょう。
CREATE TABLE multi AS(
SELECT 1 as id, 2 as test, ST_GeomFromText('MULTIPOLYGON(((0 0,4 0,4 4,0 4,0 0)),((1 1,2 1,2 2,1 2,1 1)), ((-1 -1,-1 -2,-2 -2,-2 -1,-1 -1)))') AS geom
);
これには、マルチポリゴン、ID、および別の列が含まれます。
他のすべての属性を含むテーブルから各ポリゴンを取得するには、次のようにします。
SELECT id, test, ST_GeometryN(poli, generate_series(1, ST_NumGeometries(geom))) AS geom
FROM multi
「id」と「test」は、元のテーブルの各行の値です。 generate_seriesは、1から各行のジオメトリの数までの一連の数値を作成します。
したがって、各マルチジオメトリを個別の単一ジオメトリパーツに分割し、他の列の値は同じままにします。
例の列と表をエクスポートしたシェープファイルの列に置き換えるだけで、単一のポリゴンを含む表が得られます。
これがあなたの質問に答えることを願っています。
ST_DUMP を使用して、PostgreSQLのマルチポリゴンジオメトリのテーブルを、ポリゴンジオメトリと他のデータ列を持つ新しいテーブルに変換しました。
CREATE TABLE poly AS --poly will be the new polygon table
WITH dump AS (
SELECT id, test, --columns from your multipolygon table
(ST_DUMP(geometry)).geom AS geometry
FROM multi --the name of your multipolygon table
)
SELECT id, test,
geometry::geometry(Polygon,4326) --type cast using SRID from multipolygon
FROM dump;
更新:これは、このクエリではるかに簡単に達成できると思います。
CREATE TABLE polygon_table AS
SELECT id, example_column, (ST_DUMP(geom)).geom::geometry(Polygon,4326) AS geom FROM multipolygon_table
ステージングテーブルにインポートしてから、 ST_DUMP を使用してマルチジオムを個々のピースにブレーキし、それを使用して宛先テーブルに入力します。
必要なすべてのデータをステージングテーブルにインポートし(multi
と呼びましょう)、ST_DUMP
mutligeometryを単一のジオメトリに分割するには:
WITH multi AS(
SELECT 1 as id, 2 as test, ST_GeomFromText('MULTIPOLYGON(((0 0,4 0,4 4,0 4,0 0)),((1 1,2 1,2 2,1 2,1 1)), ((-1 -1,-1 -2,-2 -2,-2 -1,-1 -1)))') as poli
)
,dump AS(
SELECT id
,test
,ST_DUMP(poli) as d
FROM multi)
SELECT id
,test
,(dump.d).path
,ST_AsTEXT((dump.d).geom)
FROM dump