where句の交差面積の割合を計算する


15

postgresにポリゴン(国勢調査ブロックグループ)のテーブルがあります。各ブロックグループに、主に存在する町(別のポリゴンテーブル)をタグ付けします。これは可能ですか?私は本質的に次のようなものを作成する必要があると考えています:

select b.*,t.name  
from blockgroups b, towns t  
where (st_area(st_intersection(b.wkb_geometry, t.wkb_geometry))/st_area(b.wkb_geometry)) > .5  

しかし、このクエリには永遠に時間がかかります(約5,000のブロックグループと375の町があります...)。このクエリが正しくない場合はまったく機能しない、または正しい場合は高速になる方法についての提案はありますか?


最大オーバーラップに基づいてブロックグループにタグを付けたいように聞こえますか?その場合は、この回答を参照してください。あなたの「町」も国勢調査地域(MCDや場所など)である場合、おそらく重複率を計算する必要はありません。
dbaston

回答:


23

あなたがそれをしている方法は機能しますが、postgisは触れていなくても、すべての「ブロックグループと町」の組み合わせの交差点のジオメトリを作成しようとしているため、時間がかかりすぎます。

WHERE句に別の条件チェックを追加して、2つのジオメトリがインターセプトするかどうかを確認し、既存のジオメトリの前に配置します。

select b.*,t.name
from blockgroups b, towns t
where st_intersects(b.wkb_geometry, t.wkb_geometry) and    
    (st_area(st_intersection(b.wkb_geometry, t.wkb_geometry))/st_area(b.wkb_geometry)) > .5

SQLでは、WHERE句に条件のリストがある場合、書き込まれた順序でテストされます。初期操作の1つでFALSEが返された場合、クエリは結果が常にFALSEになるため、他の条件チェックをスキップします。

また、blockgroups.wkb_geometryおよびtowns.wkb_geometryに空間インデックスがあることを確認してください。


1
ここに追加するのST_Intersectsが正しい方法ですが、プランナーは記述された順序で条件を実行する場合としない場合があります。詳細については、Postgresのドキュメントを参照してください。 ST_IntersectsそしてST_Intersectionそう正直に言うと、私のインストールで同じコスト(100)を持っている私は、プランナーが何をしているのかわからないんだけど、常にここに正しいことを行うようです。
dbaston

ああ...他の言語と同じように条件がチェックされると思いました。しかし、プランナーに別の選択肢を与えると思います。
アレクサンドルネトー

10

アレクサンドルの非常に有用な答えに加えて、国勢調査ユニットのいくつかがあなたの町の3つにまたがる可能性がある場合(したがって、どの町でも50%以上の落下が保証できない場合)、これを行うことができます:

select distinct on (b.id)
b.*,t.name,
(st_area(st_intersection(b.wkb_geometry, t.wkb_geometry))/st_area(b.wkb_geometry)) as proportion
from blockgroups b, towns t
where st_intersects(b.wkb_geometry, t.wkb_geometry) 
order by b.id, proportion desc;

これは、基本的に次の状況から保護します-青の領域が消えます: ここに画像の説明を入力してください


1
SOの答えに出くわした最初の問題が次の答えによって解決されるとき、私は絶対にそれを崇拝します。乾杯、@ RobinL!
-wfgeo

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