2
votes

Geopandas to_file donne un fichier prj vierge

J'essaie d'utiliser GeoPandas pour un projet (à peine) plus complexe, mais pour le moment je n'arrive pas à écrire un fichier de formes simple avec un seul point de manière projetée.

Le code suivant donne un fichier de formes qui semble généralement bon - mais le .prj est vide:

import pandas as pd
from geopandas import GeoDataFrame
from shapely.geometry import Point

df=pd.read_csv("richmond.csv")
geometry = [Point(xy) for xy in zip(df.x, df.y)]
crs = {'init': 'epsg:4326'}
geo_df = GeoDataFrame(df, crs=crs, geometry=geometry)

geo_df.to_file("geopan.shp")

Le csv est à 2 lignes et 2 colonnes (ligne d'en-tête, puis lon et lat en 2ème ligne ):

 un csv vraiment basique

Est-ce que je manque quelque chose d'évident? J'ai cherché à travers stackoverflow, les documents geopandas, etc. Tout semble impliquer que to_file () devrait fonctionner correctement.

À long terme, le but est de créer quelques fonctions que mes étudiants pourront utiliser dans un laboratoire - un qui trace une ligne le long d'une lat ou de la largeur / hauteur des États-Unis, un autre qui coupe la ligne aux polygones (les états), afin que les élèves puissent déterminer l'endroit le plus large de chaque état comme un introduction à l'utilisation des données spatiales. J'essaie d'éviter arcpy car c'est Python 2, et j'ai pensé (et je pense) que je faisais la bonne chose en leur apprenant les méthodes de Python 3. J'aimerais qu'ils puissent déboguer leurs méthodologies en étant capable de ouvrez la ligne dans Arc cependant, d'où ce test.


3 commentaires

Remplacement de la ligne read_csv par df = pd.DataFrame ({'x': [-84.2947], 'y': [37.7479]}) pour la rendre reproductible, puis le code exact ci-dessus fonctionne très bien pour moi. Le fichier .prj généré a le contenu correct. Comment avez-vous installé Geopandas et ses dépendances? (fiona, gdal, proj4, ..)


Malheureusement, faire ce changement a le même résultat pour moi - un fichier de formes parfaitement heureux qui a un fichier de projection vierge. Il semble que je devrais peut-être réinstaller les géopandas au cas où quelque chose ne se passerait pas proprement.


Comme suite intéressante, tout cela se fait via les installations d'Anaconda. Sur un mac, cela fonctionne exactement comme prévu (les fichiers .prj ne sont pas vides) mais a généré un avertissement de Fiona concernant une utilisation dépréciée. Les tests sur Windows donnent des fichiers .prj vierges.


3 Réponses :


1
votes

J'utilise toujours la fonction from_epsg de la bibliothèque fiona.

>>> from fiona.crs import from_epsg
>>> from_epsg(4326)
{'init': 'epsg:4326', 'no_defs': True}

Je n'ai jamais eu de problème à l'utiliser. Gardez à l'esprit que certaines projections locales manquent, mais cela ne devrait pas poser de problème dans votre cas.


0 commentaires

2
votes

Donc, après avoir joué avec ça, j'ai déterminé que sous la version actuelle d'Anaconda, le problème venait de crs = {'init': 'epsg: 4326'} sur les machines Windows. Cela fonctionne bien sur les Mac, mais n'a fonctionné sur aucun de mes systèmes Windows ou de ceux de mes étudiants. Modification de cette ligne pour utiliser la chaîne proj4 crs = {'proj': 'latlong', 'ellps': 'WGS84', 'datum': 'WGS84', 'no_defs': True} au lieu de cela fonctionne très bien. Plus une solution de contournement qu'une solution réelle, mais cela semble fonctionner de manière cohérente.


0 commentaires

0
votes

Un autre utilisateur et moi-même avons eu un problème similaire en utilisant fiona, et le problème pour moi était la variable d'environnement GDAL_DATA n'est pas réglé correctement. Pour réitérer ma réponse ici: Pour référence, j'utilise Anaconda, l'IDE Spyder, Fiona 1.8.4 et Python 3.6.8 et GDAL 2.3.3.

Alors qu'Anaconda définit généralement la variable GDAL_DATA lors de l'entrée dans le virtuel l'environnement, l'utilisation d'un autre IDE comme Spyder ne le conservera pas, et causera donc des problèmes où fiona (et je suppose que Geopandas) ne peut pas exporter correctement le CRS.

Vous pouvez tester ce correctif en essayant d'imprimer Transformation EPSG en WKT avant et après la définition explicite de la variable GDAL_DATA.

Sans définir GDAL_DATA:

True
PROJCS["WGS 84 / NSIDC Sea Ice Polar Stereographic North",GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AUTHORITY["EPSG","4326"]],PROJECTION["Polar_Stereographic"],PARAMETER["latitude_of_origin",70],PARAMETER["central_meridian",-45],PARAMETER["scale_factor",1],PARAMETER["false_easting",0],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["X",EAST],AXIS["Y",NORTH],AUTHORITY["EPSG","3413"]]

Résultats:

import os
os.environ['GDAL_DATA'] = 'D:\\ProgramData\\Anaconda3\\envs\\cfm\\Library\\share\\gdal'
print('GDAL_DATA' in os.environ)
from osgeo import , osr
srs = osr.SpatialReference() # Declare a new SpatialReference 
srs.ImportFromEPSG(3413) # Import the EPSG code into the new object srs
print(srs.ExportToWkt()) # Print the result before transformation to ESRI WKT (prints nothing)

Avec le paramètre GDAL_DATA:

False

Résultats en:

import os
print('GDAL_DATA' in os.environ)
from osgeo import osr
srs = osr.SpatialReference() # Declare a new SpatialReference 
srs.ImportFromEPSG(3413) # Import the EPSG code into the new object srs
print(srs.ExportToWkt()) # Print the result before transformation to ESRI WKT (prints nothing)


0 commentaires