Tôi gặp khó khăn trong việc hiểu việc sử dụng các chỉ mục không gian với RTree.
Ví dụ: Tôi có 300 điểm được đệm và tôi cần biết mỗi khu vực giao nhau của bộ đệm với một hình đa giác. Shapefile đa giác có> 20.000 đa giác. Có gợi ý tôi sử dụng các chỉ số không gian để tăng tốc quá trình.
VẬY ... Nếu tôi tạo một chỉ mục không gian cho shapefile đa giác của mình, nó sẽ được "đính kèm" vào tệp theo cách nào đó, hoặc chỉ mục sẽ đứng độc lập? Đó là, sau khi tạo, tôi có thể chạy chức năng giao nhau của mình trên tệp đa giác và nhận được kết quả nhanh hơn không? Giao lộ sẽ "thấy" rằng có các chỉ số không gian và biết phải làm gì? Hoặc, tôi có cần chạy nó trên chỉ mục không, sau đó liên kết các kết quả đó lại với tệp đa giác ban đầu của tôi thông qua FID hoặc một số như vậy?
Tài liệu RTree không giúp tôi nhiều lắm (có lẽ vì tôi chỉ học lập trình). Chúng chỉ ra cách tạo một chỉ mục bằng cách đọc các điểm được tạo thủ công và sau đó truy vấn nó với các điểm được tạo thủ công khác, trả về các id được chứa trong cửa sổ. Có ý nghĩa. Nhưng, họ không giải thích làm thế nào điều đó sẽ liên quan đến một số tệp gốc mà chỉ mục sẽ đến từ đó.
Tôi nghĩ rằng nó phải đi một cái gì đó như thế này:
- Kéo các hộp cho mỗi tính năng đa giác từ shapefile đa giác của tôi và đặt chúng vào một chỉ mục không gian, cung cấp cho chúng một id giống như id của chúng trong shapefile.
- Truy vấn chỉ mục đó để có được các id giao nhau.
- Sau đó chạy lại giao lộ của tôi chỉ với các tính năng trong shapefile ban đầu của tôi đã được xác định bằng cách truy vấn chỉ mục của tôi (không chắc chắn cách tôi thực hiện phần cuối cùng này).
Tôi có ý kiến đúng không? Tôi có thiếu thứ gì không?
Ngay bây giờ tôi đang cố gắng để mã này hoạt động trên một shapefile một điểm chỉ chứa một tính năng điểm và một shapefile đa giác có chứa> 20.000 tính năng đa giác.
Tôi đang nhập các shapefile bằng Fiona, thêm chỉ số không gian bằng RTree và cố gắng thực hiện giao lộ bằng Shapely.
Mã kiểm tra của tôi trông như thế này:
#point shapefile representing location of desired focal statistic
traps = fiona.open('single_pt_speed_test.shp', 'r')
#polygon shapefile representing land cover of interest
gl = MultiPolygon([shape(pol['geometry']) for pol in fiona.open('class3_aa.shp', 'r')])
#search area
areaKM2 = 20
#create empty spatial index
idx = index.Index()
#set initial search radius for buffer
areaM2 = areaKM2 * 1000000
r = (math.sqrt(areaM2/math.pi))
#create spatial index from gl
for i, shape in enumerate(gl):
idx.insert(i, shape.bounds)
#query index for ids that intersect with buffer (will eventually have multiple points)
for point in traps:
pt_buffer = shape(point['geometry']).buffer(r)
intersect_ids = pt_buffer.intersection(idx)
Nhưng tôi tiếp tục nhận TypeError: đối tượng 'Đa giác' không thể gọi được
TypeError: 'Polygon' object is not callable
với ví dụ cập nhật của mình vì bạn đã ghi đè shape
chức năng bạn đã nhập từ hình dạng với đối tượng Đa giác bạn tạo bằng dòng này:for i, shape in enumerate(gl):