![](/img/trans.png)
[英]how to convert projection x and y coordinate in netcdf iris cube to lat lon
[英]How to project x,y coordinates to lat/lon in netcdf file
我已经从CCI网站下载了格陵兰冰盖的速度场作为NetCDF文件。 但是,投影的给定方式为(请参见下文,其中x介于[-639750,855750]和y [-655750,-3355750]之间)
如何将这些数据投影到NetCDF文件中的实际纬度/经度坐标? 已经谢谢你了! 对于感兴趣的人:可在此处下载文件: http : //products.esa-icesheets-cci.org/products/downloadlist/IV/
Variables:
crs
Size: 1x1
Dimensions:
Datatype: int32
Attributes:
grid_mapping_name = 'polar_stereographic'
standard_parallel = 70
straight_vertical_longitude_from_pole = -45
false_easting = 0
false_northing = 0
unit = 'meter'
latitude_of_projection_origin = 90
spatial_ref = '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"]]'
y
Size: 5401x1
Dimensions: y
Datatype: double
Attributes:
units = 'm'
axis = 'Y'
long_name = 'y coordinate of projection'
standard_name = 'projection_y_coordinate'
x
Size: 2992x1
Dimensions: x
Datatype: double
Attributes:
units = 'm'
axis = 'X'
long_name = 'x coordinate of projection'
standard_name = 'projection_x_coordinate'
如果要将整个网格从其原始的Polar Stereographic坐标转换为地理(经度和纬度)网格,则可能需要使用gdalwarp之类的工具。 不过,我认为这不是您要问的问题。
如果我正确地阅读了您的问题,则希望从文件中挑选点并将其定位为lon / lat坐标对。 我假设您知道如何从netCDF文件中获取一个XY对位置,以及该位置的速度值。 我还假设您正在Python中执行此操作,因为您已将标记放在此问题上。
一旦有了XY对,您只需要一个函数(带有一堆参数)即可将其转换为lon / lat。 您可以在pyproj模块中找到该函数。
Pyproj包装了proj4 C库,该库非常广泛地用于坐标系转换。 如果投影坐标中有XY对,并且知道投影坐标系的定义,则可以使用pyproj的transform函数,如下所示:
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的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并有在这样的一个例子程序的博客文章将告诉您如何做到这一点的转换。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.