es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  , ,

Answer

  1. Avatar for 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:

    import geopandas as gpd
    import xarray as xr
    import json
    
    # Leer GeoDataFrame del conjunto de datos de naturalearth_lowres
    world = gpd.read_file(gpd.datasets.get_path('naturalearth_lowres'))
    
    # Convertir la columna 'geometry' al formato GeoJSON
    world['geometry'] = world['geometry'].apply(lambda x: json.loads(x.to_json()))
    
    # Convertir el GeoDataFrame a xarray.Dataset
    ds = world.to_xarray()
    
    # Guardar en un archivo NetCDF
    ds.to_netcdf('test.nc')
    

    Este código usa el módulo json para convertir la columna geometry 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 objeto xarray.Dataset.

Comments are closed.