如何将x,y坐标投影到netcdf文件中的纬度/经度

时间:2019-07-02 11:58:37

标签: python projection netcdf coordinate-transformation nco

我已经从CCI网站下载了格陵兰冰盖的速度场作为NetCDF文件。但是,投影的给定方式为(请参见下文,其中x的范围在[-639750,855750]和y [-655750,-3355750]之间)

如何将这些数据投影到NetCDF文件中的实际纬度/经度坐标?已经谢谢你了!对于感兴趣的人:可以在这里下载文件:http://products.esa-icesheets-cci.org/products/downloadlist/IV/

+-----------+
|values     |
+-----------+
|apple      |
+-----------+
|banana     |
+-----------+
|frank      |
+-----------+
|fruit      |
+-----------+
|green      |
+-----------+
|james      |
+-----------+
|orange     |
+-----------+
|sarah-jane |
+-----------+
|yellow     |
+-----------+

1 个答案:

答案 0 :(得分:2)

如果要将整个网格从其原始的“极地立体”坐标转换为地理(经度和纬度)网格,则可能需要使用gdalwarp之类的工具。不过,我认为这不是您要问的问题。

如果我正确地阅读了您的问题,则希望从文件中挑选点并将其定位为lon / lat坐标对。我假设您知道如何从netCDF文件中获取一个XY对位置,以及该位置的速度值。我还假设您正在Python中执行此操作,因为您已将标签放在该问题上。

一旦有了XY对,您只需要一个函数(带有一堆参数)即可将其转换为lon / lat。您可以在pyproj模块中找到该功能。

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

现在最困难的部分,实际上是您首先要做的事情-定义用作转换函数参数的projInprojOut。这些在变换的输入和输出坐标系中。这些是Proj对象,它们包含用于坐标系转换方程的一堆参数。 proj4开发人员将它们全部封装在一组整齐的函数中,而pyproj开发人员在它们周围放置了一个不错的python包装器,因此您和我不必跟踪所有细节。我将感激他们一生中所有的日子。

输出坐标系很简单

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

pyproj库可以从EPSG代码构建Proj对象。 4326是WGS 84 lon / lat的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文件复制):

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"]]'

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