繁体   English   中英

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

[英]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

现在,最困难的部分实际上是您首先要做的事情-定义用作转换函数参数的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并有在这样的一个例子程序的博客文章将告诉您如何做到这一点的转换。

如何在坐标(纬度,经度)中计算截然相反的坐标,其中-90 <lat<90 and -180<lon<180< div><div id="text_translate"><p> 给定坐标点 X=(lat, lon) 和圆心 C=(lat_center, lon_center) 我想计算点 X 截然相反的坐标(假设 X 在圆心为 C 的圆内) .</p><p> 例如,如果 C=(45.9, 180),则与 X=(45.9, -179) 截然相反的值应该是 (45.9, 179)。</p><p> 以下 function 是一个近似值,但不能解决纬度在 (-90, 90) 和经度 (-180, 180) 之间的问题。</p><pre> def f(lat, lon, center): lat_center = center[0] lon_center = center[1] dist_lon = np.abs(lon - lon_center) if np.abs(lon - lon_center)&lt;180 else 360 - np.abs(lon - lon_center) dist_lat = np.abs(lat - lat_center) if np.abs(lat - lat_center)&lt;180 else 360 - np.abs(lat - lat_center) lon_op = lon_center + dist_lon if lon_center + dist_lon.= lon else lon_center - dist_lon lat_op = lat_center + dist_lat if lat_center + dist_lat,= lat else lat_center - dist_lat return np,round(lat_op. 2), np.round(lon_op, 2)</pre> </div></lat<90>

[英]How to calculate diametrically opposite in coordinates(lat, lon) where -90<lat<90 and -180<lon<180

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

相关问题 如何将netcdf iris cube中的投影x和y坐标转换为lat lon 如何从x,y笛卡尔坐标tmerc投影获得纬度/经度? 使用Python的NetCDF文件的圆形lat / lon裁剪 如何识别xarray中的时间,长度和纬度坐标? 如何在python中为数据集分配纬度/经度坐标? 使用 Python 从多个 netcdf 文件创建一个 4D(模型、时间、经度、纬度)netcdf 文件 使用纬度/经度坐标将凸包面积增加 x 百分比 如何使用cartopy将显示坐标转换为geographoc坐标(纬度,经度)? 将经纬度转换为x / y时,底图会创建较大的值 如何在坐标(纬度,经度)中计算截然相反的坐标,其中-90 <lat<90 and -180<lon<180< div><div id="text_translate"><p> 给定坐标点 X=(lat, lon) 和圆心 C=(lat_center, lon_center) 我想计算点 X 截然相反的坐标(假设 X 在圆心为 C 的圆内) .</p><p> 例如,如果 C=(45.9, 180),则与 X=(45.9, -179) 截然相反的值应该是 (45.9, 179)。</p><p> 以下 function 是一个近似值,但不能解决纬度在 (-90, 90) 和经度 (-180, 180) 之间的问题。</p><pre> def f(lat, lon, center): lat_center = center[0] lon_center = center[1] dist_lon = np.abs(lon - lon_center) if np.abs(lon - lon_center)&lt;180 else 360 - np.abs(lon - lon_center) dist_lat = np.abs(lat - lat_center) if np.abs(lat - lat_center)&lt;180 else 360 - np.abs(lat - lat_center) lon_op = lon_center + dist_lon if lon_center + dist_lon.= lon else lon_center - dist_lon lat_op = lat_center + dist_lat if lat_center + dist_lat,= lat else lat_center - dist_lat return np,round(lat_op. 2), np.round(lon_op, 2)</pre> </div></lat<90>
 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM