2 votos

Máscara de malla girada/curvilínea (NetCDF) con malla rectilínea (geotiff)

Tengo dos conjuntos de datos:

El clima:

  • temperatura media de un mes
  • Archivo NetCDF (Convención CF 1.6)
  • grid_mapping_name: rotated_latitude_longitude (con las coordenadas rlat y rlong que definen la cuadrícula)
  • rejilla curvilínea

Fracción de área de cosecha:

  • Trigo
  • Archivo Geotiff
  • EPSG: 4326 (coordenadas lon y lat que definen la cuadrícula)
  • rejilla rectilínea

He conseguido trazar ambos conjuntos de datos (véase la imagen siguiente).

Quiero extraer los valores de los datos climáticos donde crece el trigo. Sin embargo, los dos conjuntos de datos tienen sistemas de coordenadas diferentes (cuadrícula lon/lat girada frente a cuadrícula lon/lat normal), por lo que no se alinean.

¿Sugerencias?

enter image description here

EDITAR : Si llamo a climatedata.rio.crs Obtengo la siguiente salida:

GEOGCRS["undefined",BASEGEOGCRS["undefined",DATUM["World Geodetic System 1984",ELLIPSOID["WGS 84",6378137,298.257223563,LENGTHUNIT["metre",1]],ID["EPSG",6326]],PRIMEM["Greenwich",0,ANGLEUNIT["degree",0.0174532925199433],ID["EPSG",8901]]],DERIVINGCONVERSION["Pole rotation (netCDF CF convention)",METHOD["Pole rotation (netCDF CF convention)"],PARAMETER["Grid north pole latitude (netCDF CF convention)",39.25,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]],PARAMETER["Grid north pole longitude (netCDF CF convention)",198,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]],PARAMETER["North pole grid longitude (netCDF CF convention)",0,ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]]],CS[ellipsoidal,2],AXIS["longitude",east,ORDER[1],ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]],AXIS["latitude",north,ORDER[2],ANGLEUNIT["degree",0.0174532925199433,ID["EPSG",9122]]]]

EDITAR :

Paso 1: Transformar los datos climáticos en una cuadrícula lon-lat de espacio regular.

climatedata =  xa.open_dataset(r'filepath.nc', decode_cf = True, decode_coords = "all")
df = climatedata.squeeze().to_dataframe().reset_index()
geometry = gpd.points_from_xy(df.lon, df.lat)
gdf = gpd.GeoDataFrame(df, crs=climatedata.rio.crs, geometry=geometry)
geo_grid = make_geocube(vector_data=gdf, resolution=(-0.1, 0.1), rasterize_function=rasterize_points_griddata,)
geo_grid = geo_grid.tas_moy[:,:]

enter image description here

geo_grid.rio.crs es la misma que la mencionada anteriormente. harvestdata.rio.crs es la siguiente:

GEOGCS["unknown",DATUM["unknown",SPHEROID["WGS 84",6378137,298.257223563]],PRIMEM["unknown",0],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST]]

Paso 2: Reproyectar los datos climáticos a los datos de la cosecha:

harvestdata = xa.open_dataset(r'filepath.tif')
climatedata_matched = geo_grid.rio.reproject_match(harvestdata)

Problema: climatedata_matched es un array sólo con valores NaN. enter image description here

2voto

DEW Puntos 44

Paso 1: Determinar el SIR y las coordenadas de cada uno

Para la red climática con coordenadas 2D, esto puede ser una referencia útil: https://github.com/corteva/rioxarray/issues/209

Paso 2: Volver a proyectar en la misma cuadrícula

https://corteva.github.io/rioxarray/stable/examples/reproject_match.html

Recomiendo volver a proyectar la red climática a la red de cosecha.

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X