Python 如何在netcdf文件中将x、y坐标投影到lat/lon

Python 如何在netcdf文件中将x、y坐标投影到lat/lon,python,projection,netcdf,coordinate-transformation,nco,Python,Projection,Netcdf,Coordinate Transformation,Nco,我已经从CCI网站下载了格陵兰冰盖的速度场,作为NetCDF文件。但是,投影如下所示(见下文,其中x的范围介于[-639750855750]和y[-655750,-3355750]之间) 如何将这些数据投影到NetCDF文件中的实际lat/lon坐标?已经谢谢你了!对于感兴趣的人:可在此处下载该文件: 如果要将整个栅格从其原始极赤平极坐标转换为地理(经度乘以纬度)栅格,可能需要使用类似的工具。不过,我不认为这是你要问的问题 如果我正确阅读了您的问题,您需要从文件中拾取点,并将其定位为lon/la

我已经从CCI网站下载了格陵兰冰盖的速度场,作为NetCDF文件。但是,投影如下所示(见下文,其中x的范围介于[-639750855750]和y[-655750,-3355750]之间)

如何将这些数据投影到NetCDF文件中的实际lat/lon坐标?已经谢谢你了!对于感兴趣的人:可在此处下载该文件:


如果要将整个栅格从其原始极赤平极坐标转换为地理(经度乘以纬度)栅格,可能需要使用类似的工具。不过,我不认为这是你要问的问题

如果我正确阅读了您的问题,您需要从文件中拾取点,并将其定位为lon/lat坐标对。我假设您知道如何从netCDF文件中获取XY对位置,以及该位置的速度值。我还假设您是在Python中这样做的,因为您在这个问题上添加了标签

一旦你有了一个XY对,你只需要一个函数(带有一组参数)来将它转换成lon/lat。你可以在模块中找到这个函数

Pyproj包装了proj4 C库,该库广泛用于坐标系转换。如果在投影坐标中有XY对,并且知道投影坐标系的定义,则可以使用pyproj的变换函数,如下所示:

import pyproj

# Output coordinates are in WGS 84 longitude and latitude
projOut = pyproj.Proj(init='epsg:4326')

# Input coordinates are in meters on the Polar Stereographic 
# projection given in the netCDF file
projIn = pyproj.Proj('+proj=stere +lat_0=90 +lat_ts=70 +lon_0=-45 
    +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs ',
    preserve_units=True)

# here is a coordinate pair near the middle of your data set
x, y = 0.0, -2000000

# transform x,y to lon/lat
lon, lat = pyproj.transform(projIn, projOut, x, y)

# answer: lon = -45.0; lat = 71.6886
。。。就这样。请注意,输出经度为-45.0,这会给您一种温暖的感觉,因为输入X坐标为0,-45.0是数据集投影的中心子午线。如果希望答案以弧度而不是度表示,请将变换函数中的
radians
kwarg设置为
True

现在来看最难的部分,这实际上是您首先要做的事情——定义用作变换函数参数的
projIn
projOut
。它们位于转换的输入和输出坐标系中。这些是Proj对象,它们包含坐标系变换方程的大量参数。proj4开发人员将它们封装在一组整洁的函数中,pyproj开发人员在它们周围放置了一个漂亮的python包装器,因此您和我不必跟踪所有细节。我将感谢他们为我留下的所有日子

输出坐标系很简单

projOut=pyproj.Proj(init='epsg:4326')

pyproj库可以从EPSG代码构建Proj对象。4326是WGS 84 lon/lat.Done的EPSG代码

设置
projIn
更难,因为您的netCDF文件使用WKT字符串定义其坐标系,proj4或pyproj无法直接读取该字符串(我很确定)。但是,pyproj.Proj()将使用proj4参数字符串作为参数。我已经给了你这个手术所需要的,所以你可以接受我的建议

+proj=stere +lat_0=90 +lat_ts=70 +lon_0=-45 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs
与此等效(直接从netCDF文件复制):


如果希望能够更一般地执行此操作,则需要另一个模块将WKT坐标系定义转换为proj4参数字符串。其中一个模块是osgeo.osr,这里有一个示例程序向您展示了如何进行转换。

Python与此有什么关系?嗨,汤姆!谢谢,这真的帮了大忙!因此,对于将来的情况,如果我需要进行整个投影,这个命令是否可以处理gdalwarp?gdalwarp-overwrite-s_srs“+proj=stere+lat_0=90+lat_ts=70+lon_0=-45+k=1+x_0=0+y_0=0+datum=WGS84+units=m+no_defs”-t_srs EPSG:4326格陵兰岛极地公园格陵兰岛公园。不过,我已经有一段时间没有使用gdalwarp来记住它的许多选项了。我建议使用较小的文件来了解选项的作用。例如,您可能不需要-s_srs选项,因为gdalwarp可以从netCDF文件读取输入CRS。重要!=>使用-tr选项指定输出分辨率,使用-r选项指定重采样方法。如果不进行重采样,就无法更改栅格的CRS,这意味着要在原始数据值之间进行插值。有目的地选择插值分辨率和方法。
+proj=stere +lat_0=90 +lat_ts=70 +lon_0=-45 +k=1 +x_0=0 +y_0=0 +datum=WGS84 +units=m +no_defs
PROJCS["WGS 84 / NSIDC Sea Ice Polar Stereographic North",
  GEOGCS["WGS 84",
    DATUM["WGS_1984",
      SPHEROID["WGS 84",6378137,298.257223563,
        AUTHORITY["EPSG","7030"]],
      AUTHORITY["EPSG","6326"]],
    PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],
    UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],
    AUTHORITY["EPSG","4326"]],
  PROJECTION["Polar_Stereographic"],
  PARAMETER["latitude_of_origin",70],
  PARAMETER["central_meridian",-45],
  PARAMETER["scale_factor",1],
  PARAMETER["false_easting",0],
  PARAMETER["false_northing",0],
  UNIT["metre",1,AUTHORITY["EPSG","9001"]],
AXIS["X",EAST],
AXIS["Y",NORTH],
AUTHORITY["EPSG","3413"]]'