C'est assez compliqué, mais pour faire court: j'ai utilisé plusieurs bibliothèques comme OSMNx pour dessiner un itinéraire entre plusieurs endroits d'une ville. Maintenant, je voudrais le convertir en un fichier shp.Shapely: tuples sans virgules avec LineString
La route est une liste complète de l'ID des nœuds. Ensuite, ces identifiants ont été utilisés pour extraire la latitude et la longitude de chaque nœud. J'ai fait tuples concaténer les coordonnées de chaque noeuds couple (un début, une arrivée) avec une boucle, comme celui-ci:
journey = []
# previous list will contain tuples with coordinates of each node
for node1, node2 in zip(route[:-1], route[1:]):
parcours.append(tuple((G.node[noeud1]['x'], G.node[noeud1]['y']))) # we create a tuple with coordinates of start's node
parcours.append(tuple((G.node[noeud2]['x'], G.node[noeud2]['y']))) # then we make the same for the arrival node
Voici le résultat de l'impression (voyage) à la fin de la boucle:
[(6.15815, 48.6996136), (6.1629696, 48.7007431), (6.1629696, 48.7007431), [...], (6.1994411, 48.6768434), (6.1994411, 48.6768434), (6.1995322, 48.6767583)]
Chaque ligne apparaît correctement. Mais quand je veux convertir dans un voyage LineString de bien fait ... Et il retourne ceci:
from shapely.geometry import LineString
final_journey = LineString(journey)
print(final_journey)
LINESTRING (6.15815 48.6996136, 6.1629696 48.7007431, 6.1629696 48.7007431, 6.1630717 48.7002871, [...], 6.1991794 48.677085, 6.1994411 48.6768434, 6.1994411 48.6768434, 6.1995322 48.6767583)
Par conséquent, je ne peux pas le convertir dans un shp en utilisant fiona:
import fiona
schema = {
'geometry': 'Polygon',
"properties": {'id': 123}
}
with fiona.open('test.shp', 'w', 'ESRI Shapefile', schema) as c:
c.write({
'geometry': mapping(trace)
})
--------------------------------------------------------------------------- TypeError Traceback (most recent call last) in() 4 } 5 ----> 6 with fiona.open('test.shp', 'w', 'ESRI Shapefile', schema) as c: 7 c.write({ 8 'geometry': mapping(trace)
/usr/local/lib/python3.5/dist-packages/fiona/init.py in open(path, mode, driver, schema, crs, encoding, layer, vfs, enabled_drivers, crs_wkt) 173 c = Collection(path, mode, crs=crs, driver=driver, schema=this_schema, 174 encoding=encoding, layer=layer, vsi=vsi, archive=archive, --> 175 enabled_drivers=enabled_drivers, crs_wkt=crs_wkt) 176 else: 177 raise ValueError(
/usr/local/lib/python3.5/dist-packages/fiona/collection.py in init(self, path, mode, driver, schema, crs, encoding, layer, vsi, archive, enabled_drivers, crs_wkt, **kwargs) 154 elif self.mode in ('a', 'w'): 155 self.session = WritingSession() --> 156 self.session.start(self, **kwargs) 157 except IOError: 158 self.session = None
fiona/ogrext.pyx in fiona.ogrext.WritingSession.start (fiona/ogrext2.c:16207)()
TypeError: argument of type 'int' is not iterable
Je ne comprends pas pourquoi les tuples sont convertis sans une virgule entre la latitude et la longitude. De plus, il y a plusieurs duplications (les deuxièmes coordonnées de la troisième ligne sont les premières coordonnées de la quatrième ligne, etc ...) et peut-être cela pourrait être une source d'erreur pour le futur shp.
Merci d'avance!
Ce que vous voyez quand vous faites 'print (final_journey)' est la représentation de [Texte bien connu] (https://en.wikipedia.org/wiki/Well-known_text) de votre ligne. Il n'y a rien de mal à cela (comme 'tuples sans virgule'), c'est juste comment bien afficher les géométries dans l'interpréteur. – mgc