GeoPandas to_file () zapisuje GeoDataFrame bez układu współrzędnych

13

mam

  • GeoPanda 0.2.1 py27_0
  • fiona 1.7.0 np110py27_1
  • Python 2.7.10

zainstalowany w środowisku Anaconda 2-4.1.1-Windows-x86. Potrafię budować GeoDataFrame, odczytując wejściowe zestawy danych i operując danymi, ale zapisanie wyjściowego zestawu danych nie zachowuje układu współrzędnych.

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')

world_out.shpMa zawierać funkcje i schemat z shapefile źródłowego, ale układ współrzędnych jest niezdefiniowane ( <Unknown>). world_out.prjPlik jest 0 KB i nie zawiera niczego.

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

Testowałem, aby wykonać tę operację przy użyciu czystej Fiony i działa dobrze, zachowując crsinformacje:

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)

CitiesFiona.prjPlik nie zawiera informacji na temat układu współrzędnych.

Wygląda na to, że GeoPandas nie jest w stanie odczytać / zapisać crsramki danych w wyjściowym zbiorze danych podczas wywoływania to_file()metody. Próbowałem powołanie to_file()na GeoDataFrameszbudowane z różnych źródeł i zbiorów danych oraz informacji koordynować system nigdy nie był obecny w zbiorze wyjściowym.

Czy ktoś wcześniej napotkał ten problem? Czy ktoś może to przetestować?

Alex Tereshenkov
źródło

Odpowiedzi:

11

Spotkałem już takie zachowanie.

Musisz jawnie przekazać dobrze znany ciąg tekstowy (crs_wkt) do to_file()metody. Ciąg zostanie następnie przekazany do fiona.open(), który zapisuje plik .prj.

Korzystając z przykładowego kodu, wykonaj coś takiego:

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)

powinien produkować: wprowadź opis zdjęcia tutaj

Funkcje read_file()i to_file()służą po prostu jako funkcje otoki. Dzwonią fiona.open(), których podpis pokazano poniżej:

wprowadź opis zdjęcia tutaj

Musisz jawnie przekazać wartość crs_wkt podczas odczytu / zapisu plików z geopandami.

Nxaunxau
źródło
1
Dzięki za opublikowanie tego. O dziwo, nie mogę już odtworzyć problemu. Podczas uruchamiania kodu, który opublikowałem powyżej, otrzymuję .prjplik z informacjami o crs. Może tak być, ponieważ zaktualizowałem fionado fiona 1.7.0 np110py27_2.
Alex Tereshenkov
Niestety w nowszych wersjach nadal występuje problem. Mam geopandę 0.4.1 i fiona 1.8.4.
Vaiaro,