2016-06-21 1 views
0

J'essaie de trouver la ligne la plus proche d'un tas de points (environ 24 milliards de points, 4 millions de lignes). Les points existent dans un GeoDataFrame, alors que les lignes existent dans un autre. J'ai essayé de suivre ceci: https://github.com/geopandas/geopandas/issues/140, et ai fait:Comment utiliser GeoPandas Spatial Index avec des lignes?

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))] 

Et ce juste retourne une liste vide des listes. Qu'est-ce qui se passe ici?

(Notez que j'applique ceci aux 100 premières lignes et points des deux ensembles de données).

Répondre

1

Votre question est précédée du contexte dans lequel vous essayez d'effectuer une requête de voisin le plus proche, mais votre question elle-même vous demande ce qui se passe dans ce bloc de code d'intersection geopandas. Je vais essayer d'aborder votre question plutôt que sa préface, car elles semblent être en désaccord. Il semble que la logique de votre code d'intersection soit désactivée. L'essentiel de l'utilisation de rtree avec une intersection spatiale est que vous trouvez d'abord les correspondances possibles (certains faux positifs, mais pas de faux négatifs) avec votre index, et ensuite vous trouvez les correspondances précises.

Quelque chose comme ça, comme l'a démontré dans ce 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)] 

Si vous essayez de faire une recherche plus proche voisin avec un ensemble de points et un ensemble de lignes, il est possible aucune des caractéristiques intersection, ce qui pourrait renvoyer vos résultats de jeu vides.