Cómo almacenar un GeoDataFrame en un archivo NetCDF
Quiero guardar GeoDataFrame como un archivo NetCDF. Después, podré combinarlo con otro archivo NetCDF más tarde.
Sin embargo, hay un error al guardar el conjunto de datos convertido desde GeoDataFrame. Aquí hay un código simple y la información del error:
import geopandas
world = geopandas.read_file(geopandas.datasets.get_path('naturalearth_lowres'))
ds = world.to_xarray()
ds.to_netcdf('test.nc')
Error:
ds.to_netcdf('test.nc')
File "/public/home/zhangxin/new/miniconda3/envs/knmi_arctic_new/lib/python3.8/site-packages/xarray/core/dataset.py", line 1902, in to_netcdf
return to_netcdf(
File "/public/home/zhangxin/new/miniconda3/envs/knmi_arctic_new/lib/python3.8/site-packages/xarray/backends/api.py", line 1072, in to_netcdf
dump_to_store(
File "/public/home/zhangxin/new/miniconda3/envs/knmi_arctic_new/lib/python3.8/site-packages/xarray/backends/api.py", line 1119, in dump_to_store
store.store(variables, attrs, check_encoding, writer, unlimited_dims=unlimited_dims)
File "/public/home/zhangxin/new/miniconda3/envs/knmi_arctic_new/lib/python3.8/site-packages/xarray/backends/common.py", line 261, in store
variables, attributes = self.encode(variables, attributes)
File "/public/home/zhangxin/new/miniconda3/envs/knmi_arctic_new/lib/python3.8/site-packages/xarray/backends/common.py", line 350, in encode
variables, attributes = cf_encoder(variables, attributes)
File "/public/home/zhangxin/new/miniconda3/envs/knmi_arctic_new/lib/python3.8/site-packages/xarray/conventions.py", line 855, in cf_encoder
new_vars = {k: encode_cf_variable(v, name=k) for k, v in variables.items()}
File "/public/home/zhangxin/new/miniconda3/envs/knmi_arctic_new/lib/python3.8/site-packages/xarray/conventions.py", line 855, in <dictcomp>
new_vars = {k: encode_cf_variable(v, name=k) for k, v in variables.items()}
File "/public/home/zhangxin/new/miniconda3/envs/knmi_arctic_new/lib/python3.8/site-packages/xarray/conventions.py", line 275, in encode_cf_variable
var = ensure_dtype_not_object(var, name=name)
File "/public/home/zhangxin/new/miniconda3/envs/knmi_arctic_new/lib/python3.8/site-packages/xarray/conventions.py", line 233, in ensure_dtype_not_object
data = _copy_with_dtype(data, dtype=_infer_dtype(data, name))
File "/public/home/zhangxin/new/miniconda3/envs/knmi_arctic_new/lib/python3.8/site-packages/xarray/conventions.py", line 167, in _infer_dtype
raise ValueError(
ValueError: unable to infer dtype on variable 'geometry'; xarray cannot serialize arbitrary Python objects
¿Es imposible guardar MULTIPOLYGON o POLYGON en un archivo NC? Si tiene algún consejo, agradecería mucho.
davy.ai
Parece que el error es causado por la columna
geometry
del GeoDataFrame, que contiene polígonos y no es seriabilizable directamente al formato NetCDF.Una solución posible es convertir la columna
geometry
a un formato que sí se pueda serializar, como WKT o GeoJSON. Aquí hay un ejemplo de código que convierte el GeoDataFrame a GeoJSON y lo guarda en un archivo NetCDF:Este código usa el módulo
json
para convertir la columnageometry
al formato GeoJSON, que se puede serializar al formato NetCDF.Una vez que el GeoDataFrame se convierte a un formato serializable, se puede guardar en un archivo NetCDF usando el método
to_netcdf()
del objetoxarray.Dataset
.