2013-02-04 13 views
24

多角形(〜100000)があり、通常の格子セルとの交差領域を計算するスマートな方法を見つけようとします。多角形とぴったりのやり方

現在、ポリゴンとグリッドセルを(コーナー座標に基づいて)滑らかに作成しています。次に、単純なfor-loopを使って、各ポリゴンを通り、近くのグリッドセルと比較します。

ポリゴン/グリッドセルを示す小さな例です。

from shapely.geometry import box, Polygon 
# Example polygon 
xy = [[130.21001, 27.200001], [129.52, 27.34], [129.45, 27.1], [130.13, 26.950001]] 
polygon_shape = Polygon(xy) 
# Example grid cell 
gridcell_shape = box(129.5, -27.0, 129.75, 27.25) 
# The intersection 
polygon_shape.intersection(gridcell_shape).area 

(BTW:グリッドセルは、寸法0.25x0.25とmaxのポリゴンの1x1のを持っている)

実はこれは周り0.003秒で、個々のポリゴン/グリッドセルのコンボのために非常に高速です。しかし、このコードを膨大な量のポリゴン(各グリッドセルに交差する可能性があります)で実行すると、マシン上で約15 +分(交差グリッドセルの数に応じて最大30+分)がかかります。残念ながら、ポリゴンの交差のコードを記述してオーバーラップ領域を取得することは、どのように可能であるかわかりません。何かヒントはありますか?洗練されたものに代わるものはありますか?

+1

どのようにポリゴンをループして交差させるのか不思議です。あなたはそのプロセスでより多くのコードを表示できますか?これがどのようにして最適化されるかを理解する方が簡単です。 – tdedecko

+0

私は基本的にlat/lonコーナー値の配列をとり、forループでそれらをポリゴンに変換します。次に、各ポリゴンを特定のグリッドセルと比較します。これはforループで再度実行されます。これを参照してください:http://stackoverflow.com/a/13956110/1740928 – HyperCube

答えて

34

Rtreeを使用して、ポリゴンが交差する可能性のあるグリッドセルを特定することを検討してください。こうすることで、おそらく遅い部分であるlat/lonsの配列で使用されるforループを削除できます。このような

構造あなたのコードの何かが:

from shapely.ops import cascaded_union 
from rtree import index 
idx = index.Index() 

# Populate R-tree index with bounds of grid cells 
for pos, cell in enumerate(grid_cells): 
    # assuming cell is a shapely object 
    idx.insert(pos, cell.bounds) 

# Loop through each Shapely polygon 
for poly in polygons: 
    # Merge cells that have overlapping bounding boxes 
    merged_cells = cascaded_union([grid_cells[pos] for pos in idx.intersection(poly.bounds)]) 
    # Now do actual intersection 
    print poly.intersection(merged_cells).area 
+2

これは信じられないほど役に立つ答えです - それは受け入れられているはずです。私は同様の問題を抱えており、「Rtree」はアルゴリズムの実行速度を約5000倍速くしました。 – Gabriel

+2

'Rtree'は複雑なポリゴンではなくボックス(4点)にしか使用できないことに注意してください。 –

4

むしろ、期限が切れている利用可能 The Shapely User Manual ように見えるが、2014分の2013以来、格好の良いクラスSTRtreeと strtree.py がありました。私はそれを使いました、そして、それはうまくいくようです。ここ

は、ドキュメント文字列からの抜粋である:

STRtreeソートタイル再帰 アルゴリズムを使用して作成されたR-木です。 STRtreeは、初期化として パラメータとして一連のジオメトリオブジェクトを受け取ります。初期化の後、クエリメソッドを使用して、これらのオブジェクトに対する空間クエリを にすることができます。

>>> from shapely.geometry import Polygon 
>>> polys = [ Polygon(((0, 0), (1, 0), (1, 1))), Polygon(((0, 1), (0, 0), (1, 0))), Polygon(((100, 100), (101, 100), (101, 101))) ] 
>>> s = STRtree(polys) 
>>> query_geom = Polygon(((-1, -1), (2, 0), (2, 2), (-1, 2))) 
>>> result = s.query(query_geom) 
>>> polys[0] in result 
True 
+0

これはとても役に立ちます。 STRtreeを後で使用するために保存するためにpickleまたはmarshallライブラリとシリアル化できるかどうか知っていますか? – eguaio

+1

いいえ、私はSTRtreeのシリアライズ機能に精通していません。私はそれが '' shapely.geos.GEOSSTRtree_create(max(2、len(geoms))) ''によって返された_tree_handleのシリアル化に完全に依存していると信じています。 – Phil

+0

もっと最新のShapelyマニュアルがここにあります:http: //shapely.readthedocs.io/en/stable/ –

関連する問題