[Qgis-user] Does QGIS require units "m" for the projection coordinate variables in a netCDF/CF file?

Even Rouault even.rouault at spatialys.com
Sat Sep 16 08:10:07 PDT 2023


Thomas,
>
> I am not from the GIS world and not even a QGIS user, so bear with me 
> if my answers do not use the expected vocabulary.
It takes years to get fully familar with GIS oddities, and netCDF is an 
area where even a life long of experience will not be enough to fully 
overcome the "creativity" of the netCDF community...
>
> From my point of view, my netCDF files describe their geolocation in a 
> CF-compliant manner, with a grid_mapping CRS variable, and the x and y 
> projection coordinate variables. But QGIS does not recognize the CRS, 
> seemingly because I have my x and y as km (and I do specify 
> :units="km", I am not hiding this).
>
> Since I am also a programmer, I tried to find where in the QGIS code 
> the netCDF/CF geolocation is read and decoded, to see if there was a 
> strict test on :units="m". But I failed to find this in the code.

This is actually not really done in QGIS, but in PROJ (more exactly 
QGIS's QgsProjUtils::identifyCrs() delegates to PROJ's proj_identify() 
in 
https://github.com/qgis/QGIS/blob/8723b82ec19a3bec7f39b46128c798c7a2ee4230/src/core/proj/qgsprojutils.cpp#L271 
to try to correlate the CRS definition from the netCDF file to one in 
the database).

As you likely open it as a raster (and not a mesh as Richard 
mentionned), the GDAL netCDF driver is also involved since it is it that 
reconstructs a CRS object from the attributes of the netCDF CF conventions.

 From what I can tell, both PROJ and GDAL do the job "as expected". It 
is just that the way this CRS is encoded is not going to find any match 
with a known CRS.  To get what you want, the GDAL netCDF driver should 
both modify the CRS definition to change the km unit to m, and alter the 
geotransform matrix (which gives the coordinate of the top left corner 
and pixel size) to multiply their value by 1000. This could be done, but 
should it be done...? I'm not so sure. The issue is more than the 
"philosophy" of netCDF data producers is sometimes at odds with the 
usual CRS definitions.

That said, for that very particular case, there's a proj4_string 
attribute in Lambert_Azimuthal_Equal_Area variable, with value 
"+proj=laea +lat_0=90 +lon_0=0 +x_0=0 +y_0=0 +datum=WGS84 +units=m 
+no_defs +type=crs", which indicates the intent to have a metre unit. 
There's also a global attribute geospatial_bounds_crs = "EPSG:6931" 
which further correlate this. Hence this enhancement to the GDAL netCDF 
driver to renormalize to metre: https://github.com/OSGeo/gdal/pull/8407

Even

-- 
http://www.spatialys.com
My software is free, but my time generally not.



More information about the QGIS-User mailing list