GeoPandas to_file () speichert GeoDataFrame ohne Koordinatensystem

13

ich habe

  • GeoPandas 0.2.1 py27_0
  • fiona 1.7.0 np110py27_1
  • Python 2.7.10

in der Anaconda 2-4.1.1-Windows-x86-Umgebung installiert. Ich kann GeoDataFramedurch Lesen von Eingabedatensätzen konstruieren und die Daten bedienen, aber das Speichern eines Ausgabedatensatzes bewahrt das Koordinatensystem nicht.

import geopandas as gpd
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
world.to_file(driver='ESRI Shapefile',filename=r'C:\GIS\Temp\world_out.shp')

Das world_out.shpenthält zwar die Features und das Schema des Quell-Shapefiles, das Koordinatensystem ist jedoch undefiniert ( <Unknown>). Die world_out.prjDatei ist 0 KB groß und enthält nichts.

out = gpd.read_file(r'C:\GIS\Temp\world_out.shp')
print out.crs
>>> {}

Ich habe getestet, um diesen Vorgang mit reinem Fiona durchzuführen, und er funktioniert einwandfrei, wobei die folgenden crsInformationen erhalten bleiben:

import fiona

datasrc_path = r'C:\Program Files (x86)\ArcGIS\Desktop10.4\TemplateData\TemplateData.gdb'

with fiona.drivers():
    with fiona.open(datasrc_path,layer='cities') as source:
        meta = source.meta
        meta['driver'] = 'ESRI Shapefile'
        meta['layer'] = source.name

        with fiona.open(r'C:\GIS\CitiesFiona.shp', 'w', **meta) as sink:
            for f in source:
                sink.write(f)

Die CitiesFiona.prjDatei enthält Informationen zum Koordinatensystem.

Es scheint also, dass GeoPandas crsbeim Aufrufen der to_file()Methode nicht in der Lage ist, den Datenrahmen in das Ausgabedatensatz zu lesen / schreiben . Ich habe Berufung versucht , to_file()auf GeoDataFramesaus verschiedenen Quellen konstruiert und Datensätze und die Koordinatensysteminformationen waren in der Ausgabe - Dataset nie vorhanden.

Hat jemand dieses Problem schon einmal erlebt? Kann das jemand testen?

Alex Tereshenkov
quelle

Antworten:

11

Ich bin schon einmal auf dieses Verhalten gestoßen.

Sie müssen die bekannte Textzeichenfolge (crs_wkt) explizit an die to_file()Methode übergeben. Die Zeichenfolge wird dann an übergeben fiona.open(), wodurch die PRJ-Datei geschrieben wird.

Gehen Sie mit Ihrem Beispielcode folgendermaßen vor:

ws = r"D:\temp_se"
prj_file = gpd.datasets.get_path('naturalearth_lowres').replace(".shp",".prj")
prj = [l.strip() for l in open(prj_file,'r')][0]
world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
temp_shp = os.path.join(ws,"world_out.shp")
world.to_file(filename=temp_shp,driver='ESRI Shapefile',crs_wkt=prj)

sollte produzieren: Geben Sie hier die Bildbeschreibung ein

Die read_file()und to_file()-Funktionen dienen einfach als Wrapper-Funktionen. Sie rufen an fiona.open(), deren Unterschrift unten gezeigt wird:

Geben Sie hier die Bildbeschreibung ein

Sie müssen beim Lesen / Schreiben von Dateien mit Geopandas explizit einen crs_wkt-Wert übergeben.

Nxaunxau
quelle
1
Vielen Dank für die Veröffentlichung. Überraschenderweise kann ich das Problem nicht mehr reproduzieren. Wenn ich den oben veröffentlichten Code ausführe, erhalte ich die .prjDatei mit den Informationen zu crs. Es könnte sein, dass ich auf aktualisiert fionahabe fiona 1.7.0 np110py27_2.
Alex Tereshenkov
Leider gibt es immer noch das Problem in neueren Versionen. Ich habe Geopandas 0.4.1 und Fiona 1.8.4.
Vaiaro