OGRを使用してラインが交差するポリゴンを検​​索しますか?


8

1本の線(GPSトラック)で交差するすべてのポリゴンを見つけようとしています。私はこれを計算するために(Pythonからの)OGRライブラリーを使用していますが、現在は少し「総当たり」(そして遅い)です。私のトラックのすべてのポイントについて、すべてのポリゴンでintersectメソッドを呼び出します。明らかな最適化は、隣接するポリゴンでのみチェックすることです。しかし、これは既知の解決策(私が見つけられない...)の古典的な問題だと思います。

スタンドアロンソフトウェアを作成しようとしているので、専用データベースの使用は避けたいと思います(DBを使用する場合、spatialiteがオプションです)。

(参考までに、現在のソースコードはこちらから入手できます:https : //github.com/dkm/airspace-checker

回答:


7

Pythonソリューションについては、Shapely http://gispython.org/shapely/docs/1.2/ およびRTree http://pypi.python.org/pypi/Rtree/を参照することをお勧めします。

Rtreeは、空間インデックスの作成に役立ちます。


私はすでに見栄えはしましたが、rtreeについて知りませんでした!ありがとう!
Marc

さて、私は(ついに)rtreeをテストすることができました。テストセットを1096から19に減らすことができるため、問題なく動作します。私はシェイプを使用することを考えていますが、それが何を意味するのかを最もよく理解する必要があります(シェイプは投影を処理しないので、プロセスで何も失う必要はありません)。
Marc

5

拡大交差の代わりに、バウンディングボックスの比較に基づいてポリゴンの事前選択を実行できます。つまり、トラックのセグメントのMBRにオーバーラップ/隣接するすべてのポリゴンを見つけます。次に、ポリゴンのサブセットに対して詳細なテストを実行します。


3

境界ボックスを比較するmloskotとNicklasの提案は確かに正しいです。

シェープファイルを使用している場合は、このsagaモジュールの呼び出しを検討することもできます。http//www.saga-gis.org/saga_modules_doc/shapes_transect/index.html


BBoxesで解決策を確認すると思います。私のデータはランダムではありません。トラックはパラグライダー/ハンググライダーのフライトで、ポリゴンは空域です。bboxで簡単なフィルターを作成できるかどうかを確認します。私は直接シェープファイルを使用していませんが、OpenAIR形式(「標準」の空域記述子)をOGR(そこから直接shpにエクスポートできます)に読み込むスクリプトを作成しました
Marc

2

これを高速化するためにPostGISのようなデータベースが行うことは、最初にインデックスと境界ボックスの比較を行うことです。まず、ラインのバウンディングボックスと交差するバウンディングボックスを持つすべてのポリゴンを検​​索します。あなたの場合の問題は、ラインストリングが長く、関心のない多くのポリゴンと交差する非常に大きなバウンディングボックスを持つことです。

ラインが非常に長い場合は、おそらく、平面関数よりもはるかに複雑で遅い測地関数を使用する必要があります。

物事をスムーズに実行するのはかなり複雑かもしれません。

なぜデータベースに依存したくないのですか?これですべての問題が解決するわけではありませんが、たとえばPostGISには多くの組み込みの最適化があります。必要に応じて、交差点の測地計算もできます。

更新: 私はもう一度あなたの質問を読みましたが、tracフォームのラインストリングではなく、各頂点を使用していることに気付きました。

私はあなたが間違っ
たトラックにいると思います;)頂点ポイント間のエッジがポリゴンと交差するかどうかを確認するために欠落していることと、頂点ポイント間の反復をC実装ではなくPythonに移動しているため。次に、インデックスに問題があります。物事をより速くするためには、ある種の空間インデックスを構築して処理する必要があります。

一方、これだけの作業を独自のコードで実行している場合は、交差テストも実行してみませんか。頂点のポイントを扱っている場合、そのテストはポリゴンテストの単なるポイントです。「多角形のポイント」を表すGoogleといくつかのアルゴリズムがあります。

しかし、私はデータベース主導のアプローチを採用します。これにより、空間インデックスを使用できるようになります。

/ニクラス


ラインストリングについても同じことを考えていました。私はGISとpythonにはあまり詳しくありませんが、メモリ内に空間インデックスを構築する方法があるはずです(これを行うためのさまざまな.netオプションがあることは知っています)。これは、gis.seにとってもう1つの良い質問かもしれません。
ジェイカミンズ2010

答えてくれてありがとう。セットアップを簡単にするためにDBを使用していません。しかし、DBを回避することでコードの複雑さが増す場合は、考えを変えます:) 「空間インデックス」については、それが何であるかを正確に理解するために少しググる必要があります。
2010

「あなたの質問をもう一度読んだところ、tracフォームのラインストリングではなく、各頂点を使用していることがわかりました。」ラインストリングオブジェクトから交差をテストすることもできると思いますが、交差する部分を抽出する必要があります。しかし、それはより速いかもしれません、あなたは絶対に正しいです!
Marc

空間インデックスについては、要旨と多次元インデックスをググる必要があります。アイデアは、境界ボックスの多次元インデックスを構築することです。次に、db-evironmentでプランナは、実際の交差テストを行う前に、最初にインデックスを検索して交差する境界ボックスを見つけるのに労力が必要かどうかを判断します。
NicklasAvén、2010
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.