Convertir un fichier de formes à partir de coordonnées projetées à l'aide de Python

10

Débutant aux prises avec le SIG. J'essaie de cartographier les quartiers de la ville de Milwuakee en utilisant des fichiers de formes trouvés sur le site Web du comté . Je suis le fil ici avec un certain succès. Mon code est donne:

from pyproj import Proj, transform
# wisconsing EPSG:32054
# epsg:4326 is for the entire world, wgs 84...not obvious
inProj = Proj(init='epsg:32054')
outProj = Proj(init='epsg:4326')
x1,y1 = 2560131.496875003, 406816.434375003
x2,y2 = transform(inProj,outProj,x1,y1)
print(x2,y2)

avec sortie,

-65.70220967836329 43.08590211722421

Le problème est que c'est faux. Le lon / lat pour Milwaukee est de -87.863984 et 42.920816.

Deuxièmement, comment puis-je le faire par programme pour l'ensemble du fichier de formes. Je voudrais tracer ceci dans le fond de carte. Lorsque j'essaie de suivre ce fil, j'obtiens un code d'erreur:

with fiona.open("ward2012/ward.shp") as shp:
    ori = Proj(init='epsg:32054' ),
    dest= Proj(init='EPSG:4326',preserve_units=True)
    with fiona.open('ward2012/MKE_wards_lat_lon.shp', 'w', 'ESRI Shapefile', shp.schema.copy(), crs=from_epsg(4326))as output:
        for point in shp:
            x,y =  point['geometry']['coordinates']
            point['geometry']['coordinates'] = transform(ori, dest,x,y)
            output.write(point)

Erreur:

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-139-a5079ab39f99> in <module>()
      4     with fiona.open('ward2012/MKE_wards_lat_lon.shp', 'w', 'ESRI Shapefile', shp.schema.copy(), crs=from_epsg(4326))as output:
      5         for point in shp:
----> 6             x,y =  point['geometry']['coordinates']
      7             point['geometry']['coordinates'] = transform(ori, dest,x,y)
      8             output.write(point)

ValueError: not enough values to unpack (expected 2, got 1)
super-héros
la source

Réponses:

10

À la première question, le code «epsg: 32054» a des unités de pieds. Pour cette raison, il est nécessaire d'utiliser 'preserve_units = True' comme paramètre en inProj = Proj(init='epsg:32054')ligne. Maintenant, le code suivant fonctionne bien:

from pyproj import Proj, transform
# wisconsing EPSG:32054
# epsg:4326 is for the entire world, wgs 84...not obvious
inProj = Proj(init='epsg:32054', preserve_units=True)
outProj = Proj(init='epsg:4326')
x1,y1 = 2560131.496875003, 406816.434375003
x2,y2 = transform(inProj,outProj,x1,y1)
print (x2,y2)
(-87.9028568836077, 43.09691266312185)

À la deuxième question, ward.shp est un fichier de formes polygonal; pas un fichier de formes ponctuel. Dans ce cas, vous pouvez utiliser le module géopandas pour la reprojection. Mon code proposé est (avec mon chemin particulier):

import geopandas as gpd

tmp = gpd.GeoDataFrame.from_file('/home/zeito/pyqgis_data/ward2012/ward.shp')

tmpWGS84 = tmp.to_crs({'proj':'longlat', 'ellps':'WGS84', 'datum':'WGS84'})

tmpWGS84.to_file('/home/zeito/pyqgis_data/ward2012/wardWGS84.shp')

Dans l'image suivante, vous pouvez voir le fichier de formes reprojeté (wardWGS84.shp) et le point (-87.9028568836077, 43.09691266312185) avant d'être pris en compte dans Map Canvas de QGIS:

entrez la description de l'image ici

xunilk
la source