У мене виникають проблеми з розумінням використання просторових індексів за допомогою RTree.
Приклад: У мене 300 буферизованих точок, і мені потрібно знати область перетину кожного буфера з форматом багатокутника. Формафайлу багатокутника налічується> 20000 багатокутників. Було запропоновано використати просторові індекси для прискорення процесу.
Так ... Якщо я створять просторовий індекс для свого формату багатокутника, він буде якимось чином "приєднаний" до файлу, чи індекс буде окремим? Тобто, після його створення я можу просто запустити функцію перетину на полігонному файлі та отримати швидші результати? Чи перехрестя "побачить", що є просторові індекси та знає, що робити? Або мені потрібно запустити його в індексі, а потім відновити ці результати назад до мого оригінального файла багатокутника через FID або щось подібне?
Документація RTree мені не дуже допомагає (можливо, тому, що я просто вивчаю програмування). Вони показують, як створити індекс, читаючи в створених вручну точках, а потім запитують його до інших створених вручну точок, що повертає ідентифікатори, що містяться у вікні. Має сенс. Але вони не пояснюють, як це стосуватиметься якогось оригінального файлу, з якого індекс взявся б.
Я думаю, що це має мати щось подібне:
- Витягніть скриньки для кожної функції багатокутника з мого файлу форм многокутника і помістіть їх у просторовий індекс, давши їм ідентифікатор, такий самий, як ідентифікатор у файлі форм.
- Запросіть цей індекс, щоб отримати ідентифікатори, які перетинаються.
- Потім перезапустіть мій перехрест лише в тих характеристиках мого оригінального файлу форм, які були ідентифіковані шляхом запиту мого індексу (не впевнений, як би я зробив цю останню частину).
Чи маю правильну ідею? Я щось пропускаю?
Зараз я намагаюся змусити цей код працювати над одним точковим файлом форми, який містить лише одну точкову функцію, і одним файлом форми многокутника, який містить> 20000 функцій багатокутника.
Я імпортую файли форм за допомогою Fiona, додаю просторовий індекс за допомогою RTree і намагаюся зробити перехрестя за допомогою Shapely.
Мій тестовий код виглядає приблизно так:
#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)
Але я продовжую отримувати TypeError: "Полігон" об'єкт не можна викликати
.qix
є картсервер / GDAL / OGR / SpatiaLite квадрантів індекс
TypeError: 'Polygon' object is not callable
приклад оновлення, оскільки ви перезаписуєте shape
функцію, яку ви імпортували з for i, shape in enumerate(gl):