多くのShapely LineStringと交差するShapely Polygon / MultiPolygonを決定するために使用しているコードがあります。この質問への回答を通じて、コードは次のようになっています。
import fiona
from shapely.geometry import LineString, Polygon, MultiPolygon, shape
# Open each layer
poly_layer = fiona.open('polygon_layer.shp')
line_layer = fiona.open('line_layer.shp')
# Convert to lists of shapely geometries
the_lines = [shape(line['geometry']) for line in line_layer]
the_polygons = [(poly['properties']['GEOID'], shape(poly['geometry'])) for poly in poly_layer]
# Check for Polygons/MultiPolygons that the LineString intersects with
covered_polygons = {}
for poly_id, poly in the_polygons:
for line in the_lines:
if poly.intersects(line):
covered_polygons[poly_id] = covered_polygons.get(poly_id, 0) + 1
ここで、可能なすべての交差がチェックされます:
import fiona
from shapely.geometry import LineString, Polygon, MultiPolygon, shape
import rtree
# Open each layer
poly_layer = fiona.open('polygon_layer.shp')
line_layer = fiona.open('line_layer.shp')
# Convert to lists of shapely geometries
the_lines = [shape(line['geometry']) for line in line_layer]
the_polygons = [(poly['properties']['GEOID'], shape(poly['geometry'])) for poly in poly_layer]
# Create spatial index
spatial_index = rtree.index.Index()
for idx, poly_tuple in enumerate(the_polygons):
_, poly = poly_tuple
spatial_index.insert(idx, poly.bounds)
# Check for Polygons/MultiPolygons that the LineString intersects with
covered_polygons = {}
for line in the_lines:
for idx in list(spatial_index.intersection(line.bounds)):
if the_polygons[idx][1].intersects(line):
covered_polygons[idx] = covered_polygons.get(idx, 0) + 1
空間インデックスは、交差チェックの数を減らすために使用されます。
私が持っているシェープファイル(約4000ポリゴン、4ライン)では、元のコードは12936 .intersection()
チェックを実行し、実行に約114秒かかります。空間インデックスを使用する2番目のコードは1816 .intersection()
チェックのみを実行しますが、実行に約114秒もかかります。
空間インデックスを構築するコードの実行には1〜2秒しかかからないため、2番目のコードの1816チェックは、元のコードの12936チェックとほぼ同じ時間で実行されます(シェープファイルとShapelyジオメトリへの変換は、両方のコードで同じです)。
空間インデックスによって.intersects()
チェックに時間がかかる理由はわかりません。そのため、これがなぜ起こっているのか途方に暮れています。
RTree空間インデックスを誤って使用しているとしか思えません。考え?
intersects()
方法は、空間インデックスが使用されている場合(上記の時間比較を参照)に時間がかかるため、空間インデックスを誤って使用しているかどうかがわかりません。ドキュメントとリンクされた投稿を読むことから、私はそう思いますが、私がそうでない場合は誰かが指摘できることを望んでいました。