5

私の質問はこれにほぼ似ています。しかし、私の場合、ポリゴンは必ずしも互いに接触/重複しているわけではありません。それらは空間全体に存在します。

私はそのようなポリゴンの大きなセットを持っています。同様に、私は膨大な数のポイントを持っています。私は現在、一度に 1 つのポイントを取得し、一度に 1 つのポリゴンに関して交点をチェックする RoR モジュールを実行しています。データベースは PostGIS です。パフォーマンスはかなり遅いです。

これを行うためのより高速または最適な方法はありますか?

4

1 に答える 1

1

1つのselectステートメントとして実行できますが、パフォーマンスのために....ポリゴンの要点インデックスを調べてください。簡単にするために、ポリゴンフィールド(geomデータ型)とポイントフィールド(geomデータ型)を持つテーブルがあるとします。ポリゴンのリストでポイントのリストを作成している場合は、クロスジョインを実行して、各ポリゴンと各ポイントが比較されるようにします。

select *
from t1 inner join t2 on 1=1
where st_contains(t1.poly,t2.point) = 't'

(テーブル結合の例を含めるように変更されました。クロス結合を使用しています。つまり、すべてのポリゴンがすべてのポイントに結合されて比較されます。大規模なレコードセットについて話している場合は、それらのGISツリーインデックスを使用してください)

私は現在、数百のポリゴン内の数百万のポイントを見つけるためにこれを行っています。ポリゴンが重なっている場合、2つ以上のポリゴンにあるすべてのポイントに対して複数の行が返されます。

ポイントが保存されているデータタイプで保留に失敗する可能性があります。それらがgeomフィールドにある場合、それはうまく流れます。テキスト値を使用している場合は、st.geomfromtextステートメントを使用して文字をポイントに変換する必要があります。これは次のようになります。

st_contains(poly, st_geomfromtext('POINT('||lon||' ' ||lat ||')')) = 't'

lat / lonの例を使用しました...ここで注意するのは、geomfromtextで||を使用してポイントを作成する必要があることだけです。フィールドから文字列を作成します。st_geomfromtextの概念についてサポートが必要な場合はお知らせください。

于 2011-12-08T20:37:45.733 に答える