住所ポイントの全国データセット(3700万)とタイプMultiPolygonZの洪水アウトライン(200万)のポリゴンデータセットがあります。一部のポリゴンは非常に複雑で、最大ST_NPointsは約200,000です。PostGIS(2.18)を使用してフラッドポリゴンにあるアドレスポイントを特定し、これらをアドレスIDとフラッドリスクの詳細を含む新しいテーブルに書き込もうとしています。アドレスの観点(ST_Within)から試してみましたが、洪水地域の観点(ST_Contains)から始めてこれを入れ替えました。根拠は、洪水のリスクのない大きな地域があることです。両方のデータセットが4326に再投影され、両方のテーブルに空間インデックスがあります。以下の私のクエリは3日間実行されており、すぐに終了する兆候はありません!
select a.id, f.risk_factor_1, f.risk_factor_2, f.risk_factor_3
into gb.addresses_with_flood_risk
from gb.flood_risk_areas f, gb.addresses a
where ST_Contains(f.the_geom, a.the_geom);
これを実行するより最適な方法はありますか?また、このタイプのクエリを長時間実行する場合、リソース使用率とpg_stat_activityを確認する以外に、進行状況を監視する最良の方法は何ですか?
私の元のクエリは3日間で問題なく終了し、他の作業に追われたため、ソリューションを試すために時間を費やす必要がなくなりました。しかし、私はこれを再検討し、推奨事項を検討したところ、これまでのところ良好です。私は以下を使用しました:
- ここで提案されているST_FishNetソリューションを使用して、英国上空に50 kmのグリッドを作成しました
- 生成されたグリッドのSRIDをBritish National Gridに設定し、それに空間インデックスを構築しました
- ST_IntersectionとST_Intersectsを使用してフラッドデータ(MultiPolygon)をクリップしました(ここで問題になるのは、shape2pgsqlがZインデックスを追加したときに、gemでST_Force_2Dを使用する必要があったことだけです)
- 同じグリッドを使用してポイントデータをクリップしました
- 行に作成されたインデックス、各テーブルにcolと空間インデックス
これでスクリプトを実行する準備ができました。国全体をカバーするまで、結果を新しいテーブルに移入する行と列を繰り返し処理します。しかし、洪水データを確認したところ、非常に大きなポリゴンのいくつかが翻訳中に失われたようです!これは私のクエリです:
SELECT g.row, g.col, f.gid, f.objectid, f.prob_4band, ST_Intersection(ST_Force_2D(f.geom), g.geom) AS geom
INTO rofrse.tmp_flood_risk_grid
FROM rofrse.raw_flood_risk f, rofrse.gb_grid g
WHERE (ST_Intersects(ST_Force_2D(f.geom), g.geom));
私の元のデータは次のようになります:
ただし、ポストクリッピングは次のようになります。
これは、「欠けている」ポリゴンの例です。