2016-06-21 3 views
0

Я пытаюсь найти ближайшую линию к кучу точек (около 24 миллиардов точек, 4 миллиона строк). Точки существуют в одном GeoDataFrame, а линии существуют в другом. Я пытался следовать этому: https://github.com/geopandas/geopandas/issues/140, и сделал это:Как использовать пространственный индекс GeoPandas с линиями?

lines_sidx = lines_df['geom'].sindex 
[list(lines_sidx.intersection((points.loc[i,'geom'].y, points.loc[i,'geom'].x))) for i in range(len(points))] 

И это просто возвращает пустой список списков. Что здесь происходит?

(Обратите внимание, что я применяю это к первым 100 линиям и точкам из обоих наборов данных).

ответ

1

В вашем вопросе предваряется контекст, в котором вы пытаетесь выполнить запрос ближайшего соседа, но сам вопрос задает вопрос о том, что происходит в этом блоке кода пересечения геоданных. Я постараюсь решить ваш вопрос, а не его предисловие, поскольку они, похоже, не согласны. Похоже, ваша логика кода пересечения отключена. Суть использования rtree с пространственным пересечением заключается в том, что вы сначала найдете возможные совпадения (некоторые ложные срабатывания, но без ложных негативов) с вашим индексом, а затем вы найдете точные совпадения.

Нечто подобное, как показано в этом geopandas r-tree tutorial:

spatial_index = gdf.sindex 
possible_matches_index = list(spatial_index.intersection(polygon.bounds)) 
possible_matches = gdf.iloc[possible_matches_index] 
precise_matches = possible_matches[possible_matches.intersects(polygon)] 

Если вы пытаетесь выполнить поиск ближайшего соседа с множеством точек и множеством линий, это не возможно, ни одна из функций пересекаются, что может вернуть ваши пустые результаты набора.