Suite

Comment réussir le bouclage « imbriqué » sur une collection Fiona

Comment réussir le bouclage « imbriqué » sur une collection Fiona


J'ai écrit du code qui parcourt essentiellement toutes les fonctionnalités d'un fichier de formes avec Fiona en Python, faisant certaines choses, calculant certaines choses, etc.

J'ai découvert qu'il quitterait la boucle for prématurément, en fonction de l'ensemble de données que je lui ai alimenté. J'ai trouvé que cela fonctionnerait bien si je supprimais du code qui (pour moi) n'a rien à voir avec la boucle dans laquelle nous nous trouvons. C'est ma première tentative de SIG avec Python, donc je pourrais faire quelques erreurs de débutant avec les structures de données que je devine?

Vous trouverez ci-dessous un exemple minimal utilisant les données de Natural Earth que vous pouvez récupérer sur http://www.naturalearthdata.com/http//www.naturalearthdata.com/download/110m/cultural/ne_110m_admin_0_countries.zip

import fiona from shapely.geometry import shape, Point def find_cipient_area(point, collection): pour l'enregistrement dans la collection: geometry = shape(record['geometry']) if point.within(geometry): return record return Aucun avec fiona.open ('/tmp/ne_110m_admin_0_countries.shp', 'r') comme source : pour admin_record dans la source : properties = admin_record['properties'] print(properties['name']) # dans mon code d'origine, j'ai créé un point lié to the admin_record point = Point(0,0) # si la ligne suivante existe, la boucle s'arrêtera après le premier # admin_record dans cet exemple. Dans mon code d'origine, il s'est arrêté # après seulement quelques enregistrements, pas le premier cependant. zone_contenante = zone_contenante_trouver(point, source)

Si je l'exécute, il affiche "Afghanistan" au lieu de la liste complète de ~ 177 noms. Si je commente la dernière ligne, il les imprime tous comme prévu.

Ma seule supposition est que quelqu'un un itérateur est transmis avec la collection? Le seul indice dans la documentation que j'ai trouvé est "La collection de Fiona est comme un fichier Python, mais est itérable pour les enregistrements plutôt que pour les lignes". ce qui ne m'aide pas beaucoup. http://toblerity.org/fiona/manual.html#data-model

edit : j'ai essayé de copier la collection et de transmettre la copie à la fonction à la place, j'ai obtenu le même comportement :

nouvellesource = source[:] zone_contenante = zone_contenant_trouver(point, nouvelle source)

D'après la documentation :

La recherche du début du fichier n'est pas prise en charge. Vous devez rouvrir la collection pour revenir au début.

Ouvrez à nouveau le fichier pour la deuxième boucle. J'ai changé votre dernière ligne pour la suivante et j'ai fait en sorte que la boucle se déroule tout au long.

avec fiona.open('ne_110m_admin_0_countries.shp', 'r') comme source2 : contains_area = find_cipient_area(point, source2)

Republier le commentaire de Kersten comme réponse afin que je puisse l'accepter comme solution :

fiona.open renvoie un itérateur afin qu'il ne renvoie qu'un élément à la fois en mémoire. La documentation contient quelques exemples sur le stockage des résultats de l'itérateur en mémoire, par ex. listes

Ma solution était de créer une liste à partir de la source :

nouvellesource = liste(source)

Voir la vidéo: TalentHub ep09 - Mis on kaugtöö ja kuidas seda edukalt teha? - Evelin Andrespok