Tengo algo de código que estoy utilizando para determinar que bien formada Polígono/Multipolígonos se cruzan con un número de frijoles LineStrings. A través de las respuestas a esta pregunta el código ha pasado de esto:
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
donde cada intersección se comprueba, a esta:
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
donde el índice espacial se utiliza para reducir el número de intersección de cheques.
Con los shapefiles que tengo (aproximadamente 4000 polígonos, y 4 líneas), el código original se realiza 12936 .intersection()
cheques y toma alrededor de 114 segundos. El segundo trozo de código que utiliza el índice espacial realiza sólo 1816 .intersection()
los controles, pero también toma aproximadamente 114 segundos.
El código para generar el índice espacial sólo se tarda de 1-2 segundos para correr, por lo que el 1816 comprueba en la segunda pieza de código están teniendo casi la misma cantidad de tiempo para llevar a cabo como la 12936 cheques en el código original (ya que la carga de archivos y convertir a bien formada geometrías es el mismo en ambas piezas de código).
No puedo ver ninguna razón por la que el índice espacial haría el .intersects()
de verificación tomar más tiempo, así que estoy en una pérdida de por qué está sucediendo esto.
Solo puedo pensar que estoy utilizando el RTree índice espacial incorrectamente. Los pensamientos?