1

给定一个具有纬度/经度坐标的立方体

surface altitude [m] / (m)          (latitude: 21600; longitude: 43200)
     Dimension coordinates:
          latitude                           x                 -
          longitude                          -                 x
     Attributes:
          Conventions: CF-1.4
          description: GTOPO30 surface elevation dataset
          history: Mon Aug 19 14:04:58 2013: ncrename -v surface altitude,surface_altitude...
          institution: Institute of Environmental Physics, University of Bremen,     Germany.
          label: surface altitude [m]
          least_significant_digit: 4
          source: http://eros.usgs.gov/#/Find_Data/Products_and_Data_Available/gtopo30_i...
          title: Global surface elevation from the GTOPO30

并给出一个纬度/经度坐标列表,如何将立方体的数据插入给定点?(目前,最近邻会很好,但对于较粗的立方体,样条线会很好)

PS:对于最近邻,这种插值不应该依赖于将整个立方体加载到内存中。

4

1 回答 1

2

遗憾的是,Iris 中的最近邻代码目前加载数据以识别所需的索引。我已经提交了一个简单的拉取请求(通过测试变得复杂)来解决这个问题(https://github.com/SciTools/iris/pull/707),您可以尝试使用它来处理这个大小的数据集。

我将使用示例数据中的多维数据集:

import iris
cube = iris.load_cube(iris.sample_data_path('air_temp.pp'))

我可以检查是否有数据加载了以下功能:

def cube_data_is_loaded(cube):
    # A None data manger means the data is loaded...
    return cube._data_manager is None

所以:

>>> print cube_data_is_loaded(cube)
False

基本上,最近邻的界面(http://scitools.org.uk/iris/docs/latest/iris/iris/analysis/interpolate.html#iris.analysis.interpolate.extract_nearest_neighbour)允许您进行点提取:

from iris.analysis.interpolate import extract_nearest_neighbour
smaller_cube = extract_nearest_neighbour(cube,
                        (('longitude', -180), ('latitude', 1.5)))

>>> print smaller_cube
air_temperature / (K)               (scalar cube)
     Scalar coordinates:
          forecast_period: 6477 hours
          forecast_reference_time: 1998-03-01 03:00:00
          latitude: 2.50002 degrees
          longitude: 180.0 degrees
          pressure: 1000.0 hPa
          time: 1996-12-01 00:00:00
     Attributes:
          STASH: m01s16i203
          source: Data from Met Office Unified Model
     Cell methods:
          mean: time

请注意提取实际上是如何选择最接近我请求点的纬度值。真正重要的一件事是要注意,如果您的经度坐标不是圆形的,则此函数实际上不处理环绕:

cube.coord('longitude').circular = False
smaller_cube = extract_nearest_neighbour(cube,
                   (('longitude', -180), ('latitude', 1.5)))
cube.coord('longitude').circular = True
>>> print smaller_cube
air_temperature / (K)               (scalar cube)
     Scalar coordinates:
          forecast_period: 6477 hours
          forecast_reference_time: 1998-03-01 03:00:00
          latitude: 2.50002 degrees
          longitude: 0.0 degrees
          pressure: 1000.0 hPa
          time: 1996-12-01 00:00:00, bound=(1994-12-01 00:00:00, 1998-12-01 00:00:00)
     Attributes:
          STASH: m01s16i203
          source: Data from Met Office Unified Model
     Cell methods:
          mean: time

请注意原始立方体 (0-360) 中的经度范围现在如何意味着最接近 -180 的值实际上是 0。

还有一个函数可以进行轨迹提取(http://scitools.org.uk/iris/docs/latest/iris/iris/analysis/trajectory.html?highlight=trajectory#iris.analysis.trajectory.interpolate):

smaller_traj = interpolate(cube,
                  (('longitude', [-180, -180]), ('latitude', [1.5, 3.5])),
                  'nearest')
>>> print smaller_traj
air_temperature / (K)               (*ANONYMOUS*: 2)
     Auxiliary coordinates:
          latitude                              x
          longitude                             x
     Scalar coordinates:
          forecast_period: 6477 hours
          forecast_reference_time: 1998-03-01 03:00:00
          pressure: 1000.0 hPa
          time: 1996-12-01 00:00:00, bound=(1994-12-01 00:00:00, 1998-12-01 00:00:00)
     Attributes:
          STASH: m01s16i203
          source: Data from Met Office Unified Model
     Cell methods:
          mean: time

最后,注意原始多维数据集的数据是如何没有被加载的(使用我的分支),实际上,来自 small_cube 的数据也被延迟了:

>>> print cube_data_is_loaded(cube)
False
>>> print cube_data_is_loaded(smaller_cube)
False

对于轨迹,一般来说,延迟加载是不可能的,但值得注意的是,在使用 NetCDF 时,索引会直接传递到底层 NetCDF 库,因此整个数组都不会在内存中。

PS我还不知道任何与Iris一起使用的样条插值算法,尽管有一个类似的接口可以进行线性插值,如果感兴趣的话。

于 2013-08-19T15:35:16.893 回答