いくつかのポリゴンを含むPostGISテーブルがあります(geographyデータタイプを使用して保存されています)。それらは球形の地球上の領域を表しています。
すべてのポリゴンの中から選択した頂点のペアごとに、これらの2つの頂点が互いに「見える」かどうかを計算します。(n *(n -1)/ 2のペアがあります。ここで、nはテーブル内のすべてのポリゴンにわたる一意の頂点の総数です。 "お互いに見える"とは、 2つの頂点がテーブル内のどのポリゴンとも交差していません。
その計算を実行する最も速い方法は何ですか(できればPostgreSQL / PostGISで)。
うまくいくものを持っていますが、遅いです。私は単純にすべてのペアを反復処理し、それらの間のLineStringがポリゴンと交差するかどうかを確認します。(PostGISのgeographyデータ型は、球体に関するすべての難しい計算を処理します。)それで、速度を上げるかもしれない巧妙なデータ構造またはアルゴリズムがあるかどうか疑問に思います。
6
関連する概念:可視性グラフ。これを3Dではなく2Dで実行したい場合は、Gnomonic投影。
—
whuber
「すべてのペアを反復する」とは、1つのラインがすべてのポリゴンと交差するかどうかをテストするFORループの手順があるということですか?その場合は(おそらく)より高速で、考えられるすべての組み合わせでラインストリングテーブルを作成し、ラインがポリゴンテーブルと交差するかどうかをテストする1つのクエリを実行します
—
シンプレックス10
問題のイラストを教えてください。
—
addcolor
球形の水平線を超えてすべてを除外できます(エッジ近くの高いオブジェクトのビットもプラス)。これは、近似座標境界ボックスですばやく実行できます。それ以外の場合は、基本的にNPは難しいと思います。
—
AnserGIS