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

抽出によって、要求したポイントに最も近い緯度値が実際にどのように選択されたかに注目してください。本当に重要なことの 1 つは、経度座標が円形でない場合、この関数は実際にはラッピングを処理しないことに注意することです。

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

最後に、元のキューブのデータが (私のブランチを使用して) 全体にロードされていないことに注意してください。実際、smaller_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 に答える