Tôi có một số mã mà tôi đang sử dụng để xác định Shapely Polygon / MultiPolygons giao nhau với một số Shapely LineStrings. Thông qua các câu trả lời cho câu hỏi này , mã đã đi từ đây:
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
nơi mọi ngã tư có thể được kiểm tra, tới đây:
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
trong đó chỉ số không gian được sử dụng để giảm số lần kiểm tra giao lộ.
Với các shapefile tôi có (khoảng 4000 đa giác và 4 dòng), mã ban đầu thực hiện 12936 .intersection()
kiểm tra và mất khoảng 114 giây để chạy. Đoạn mã thứ hai sử dụng chỉ số không gian chỉ thực hiện 1816 .intersection()
kiểm tra nhưng cũng mất khoảng 114 giây để chạy.
Mã để xây dựng chỉ mục không gian chỉ mất 1-2 giây để chạy, do đó, 1816 kiểm tra trong đoạn mã thứ hai chỉ mất khoảng thời gian tương tự để thực hiện như kiểm tra 12936 trong mã gốc (kể từ khi tải shapefiles và chuyển đổi thành hình học Shapely giống nhau trong cả hai đoạn mã).
Tôi không thể thấy bất kỳ lý do nào mà chỉ số không gian sẽ khiến việc .intersects()
kiểm tra mất nhiều thời gian hơn, vì vậy tôi không biết tại sao điều này lại xảy ra.
Tôi chỉ có thể nghĩ rằng tôi đang sử dụng chỉ số không gian RTree không chính xác. Suy nghĩ?
intersects()
phương pháp mất nhiều thời gian khi chỉ số không gian đang được sử dụng (xem sự so sánh thời gian trên), đó là lý do tôi không chắc chắn nếu tôi đang sử dụng các chỉ số không gian không chính xác. Từ việc đọc tài liệu và các bài đăng được liên kết, tôi nghĩ là tôi, nhưng tôi đã hy vọng ai đó có thể chỉ ra nếu tôi không làm vậy.