PostGISを使用して、多数の小さなポリゴンを結合して大きなポリゴンを形成しますか?


47

postgisでSRID 27700を使用する次のレイヤーがあります。

ここに画像の説明を入力してください

それは英国のすべての行政区域であり、(色のグループからわかるように)それぞれには、彼らが属する郡を指定するテキストフィールドがあります。

私がやりたいのは、特定の郡の小さなポリゴンから大きな郡ポリゴンを作成することです。したがって、上の図のすべてのティールカラーポリゴンは、その中のすべてのポリゴンを含む単一の外側リングから1つの大きなポリゴンを形成します賢明なように、すべての紫、茶色、ピンク、灰色などの色はすべて1つの多角形を形成するはずです。

私はすでに次のことを試しました:

insert into parishesmerged (geometry)
select astext(multi(ST_Union(the_geom))) as the_geom from parishes
group by county_name

しかし、壊れたジオメトリが生成され続けるため、さらに処理する際に大きな問題が発生します。

主要な出力エリアを含む、より単純な郡レベルのマップを作成しようとしています。

いずれのソリューションもPostgisにある必要はありません。OS4Geoのフルスタックがインストールされており、QGisの最新バージョンと、棒を振るよりも多くのユーティリティがあります。

私が持っていないのは、ArcGisのような大きな男の子だけです(ただし、古いMapinfoがどこかにあるかもしれません)


記録のために、私が作成しようとしているデータセットは、.NETを使用してGISアプリケーションを記述したい.NETプログラマーを対象とした、執筆中のGISブックに付属しています。


以下の提案を試した後、最も効果があったのは「ポールラムジー」ソリューションでした。

これで、私の本にとっては十分に単純ですが、興味深い地理空間SQLを示すことができるほど複雑な、素敵な簡略化された郡と自治区のファイルができました。

ポールのソリューションは最終的には私にとっては有効なソリューションでしたが、ポリゴンマップの簡素化や複雑さの軽減など、他の回答も参考にしました。

しかし、これを行っている間に私が観察したことで、ST_Collectは実際にはST_Unionより高速ですが、実行のために実行することは、ジオメトリの破損の主な原因でもありました。私の推測では、コア関数の精度は低下しますが、速度の向上は得られます。


このプロセスは「溶解」として知られています。PostGISの経験はありませんが、ST_Unionコマンドを使用してディゾルブを実行できると思います。
-dmahr

こんにちはdmahr、明確化のおかげで、それが何と呼ばれているのかわかりませんでしたが、私の質問を読んでいるなら、私はすでにそれを試してみました:
shawty

おっと、申し訳ありませんが…見ませんでした。astext(multi())部品なしでselectステートメントを試しましたか?他のPostGISディゾルブの例で見たものから外れています。
dmahr

まだではありませんが、今すぐ試してみましょう。Tks。ディゾルブの例へのリンクはありますか?
ショーティー

「単一の外側リング」が必要かどうかは、エクスプレス用に編集してください。(私の答えを参照)
ピータークラウス

回答:


43

ST_Unionは機能しますが、ラインワークはほぼ確実にクリーンではありません。それで、あなたの小さなものの境界線が完全に似ているわけではありません。それらをグリッドにそっとスナップして、頂点が並ぶ確率を上げようとすることができますが、まだうまくいかないケースがいくつかあると思います。許容範囲を超えているか、頂点がペアリングされていない場所がある可能性が高いため、一方の側に線があり、もう一方の側に頂点があります。

 CREATE TABLE merged AS
 SELECT ST_Union(ST_SnapToGrid(the_geom,0.0001)) 
 FROM parishes
 GROUP BY county_name;

PostGIS 2.0を使用している場合、許容範囲のあるトポロジ構造を構築すると、運が良ければ、探している答えを得ることができます。


ジオメトリ修正の手がかりとしては良いのですが、「...すべてのポリゴンを含む単一の外側リングからの1つの大きなポリゴン...」についてですか?
ピータークラウス

「SnapTo」については知りませんでしたが、試してみます:-) Tks。残念ながら、まだPG 2を使用していないので、アップグレードはパイプラインにあります。
shawtyの

構文が正しいかどうかわからない。postgis.net/docs/ST_Union.htmlごとに、2番目のパラメーターで数値を受け入れる署名はありません。
アレンキャンブル

あなたは正しい、カッコは間違った場所にあった。編集済み。
ポールラムジー

これに相当するmysqlはありますか?私は取得Incorrect parameter count in the call to native function 'ST_Union'し続け、それがmysqlの制限かどうかわかりません。
ジェイエン

7

あなたは「...すべてのポリゴンを含む単一の外側リングから1つの大きなポリゴンを形成する...」必要があると言います。ST_ExteriorRingはこれを行い、

SELECT ST_MakePolygon(ST_ExteriorRing(ST_Union(GEOM)))
FROM GEOMTABLE GROUP BY ATTRCOLUMN

提案どおりにST_Union()を使用するか、ST_Collection()でテストできます。


注:少し垂れたり、「壊れたジオメトリ」を避けるために、各geomに対してst_convexhullおよび/またはST_Simplifyを使用できます。

SELECT ST_MakePolygon(ST_ExteriorRing(ST_union(ST_Simplify(GEOM,0.5))))
FROM GEOMTABLE GROUP BY ATTRCOLUMN

ジオメトリを確認します

SELECT * FROM (
   SELECT gid, ST_IsValid(geom) as valid, ST_IsSimple(geom) as simple 
   FROM GEOMTABLE) AS t  
WHERE NOT(valid AND simple); 

混乱して申し訳ありません:説明で私が意味したのは、小さなポリゴンから作成された大きなポリゴンでした各ポリゴングループの周囲に存在する境界。
shawtyの

7

ST_Collect関数は、PostgreSQLの用語での「集約」関数です

SELECT ST_Collect(GEOM) FROM GEOMTABLE GROUP BY ATTRCOLUMN」は、ATTRCOLUMの個別の値ごとに個別のGEOMETRYCOLLECTIONを返します

http://postgis.net/docs/ST_Collect.html

注: ST_CollectはST_Unionよりもはるかに高速です


3
私はそれを試して、わずかに異なる結果を得ましたが、ジオメトリコレクションが必要なのでしょうか?私は基本的に具体的にダービー&ノッティンガムの両方が右中央に別々の地区を形成ダービーシャー&ノッティンガムシャー(必要に応じて、それの穴と、一つの大きなポリゴンを作成しようとしている私はthatsの素晴らしい!ので、にもかかわらず速度差を観察しなかった。。
shawtyの

2

あなたの質問から、Ordnance SurveyのBoundary-Line製品を使用していると思います。その場合は、郡レベルのデータセットがすでに含まれているため、下位レベルの教区から自分で生成する必要はありません。

Boundary-Lineを使用していない場合は、OS OpenDataライセンスの下で無料であり、PostGISに直接ロードできるシェイプファイルとして郡レベルがあるため、使用することをお勧めします。


2
知らない人にリンクを提供してみてはどうですか?ありがとう。
jonatr

1
こんにちはCHEndersonあなたは実際に正しいです、はい私はOS Opendataから境界層データセットを使用しています、残念ながら郡の境界は完全ではありません、実際の郡の形状ファイルには郡として指定されたもののみが含まれ、ロンドン特別区には周辺の領域が含まれますロンドンやその他のファイルはすべて、いくつかの部分があり、他のファイルよりも低いレベルと小さいレベルがあります。英国の全体の輪郭があり、その後1つのレイヤーですべての上位レベルの郡と市の境界を抽出する可能性がある唯一のファイルは、教区レイヤーであるため、私はそうしようとしています。
ショーティー

:あなたは右ここで、郡の境界をダウンロードして、より多くのことができます興味を持っているものについてはordnancesurvey.co.uk/oswebsite/products/os-opendata.html
shawtyの
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.