3

NCML を使用して CF-1.4 ファイルを CF-1.6 に「変換」しようとしています。特に興味深いのは、1) 次元を削除してから 2) 変数の次元を変更する方法です。たとえば、以下は 2 つのファイルの上部 ( ncdump)です。netCDF1 つ目は CF-1.4 で、寸法timeは 、zlatおよびlonです。このファイルでは、変数 (temp など) は次の 4 つの関数ですtemp(time,z,lat,lon)。2 番目のファイルに示すように、NCML を使用してこれを CF-1.6 ファイルに変換したいと思います。ここで、z/ lat/lonは次元ではなく、変数は時間のみの関数です。ありがとう、

ファイル 1:

netcdf wqb_1.4 {
dimensions:
        time = UNLIMITED ; // (109008 currently)
        z = 1 ;
        lat = 1 ;
        lon = 1 ;
variables:
        float time(time) ;
                time:long_name = "Time" ;
                time:standard_name = "time" ;
                time:short_name = "time" ;
                time:axis = "T" ;
                time:units = "minutes since 2008-01-01 00:00:00 -10:00" ;
        float z(z) ;
                z:long_name = "depth below mean sea level" ;
                z:standard_name = "depth" ;
                z:short_name = "depth" ;
                z:axis = "z" ;
                z:units = "meters" ;
        float lat(lat) ;
                lat:long_name = "Latitude" ;
                lat:standard_name = "latitude" ;
                lat:short_name = "lat" ;
                lat:axis = "Y" ;
                lat:units = "degrees_north" ;
        float lon(lon) ;
                lon:long_name = "Longitude" ;
                lon:standard_name = "longitude" ;
                lon:short_name = "lon" ;
                lon:axis = "X" ;
                lon:units = "degrees_east" ;
        float temp(time, z, lat, lon) ;
                temp:long_name = "Temperature" ;
                temp:standard_name = "sea_water_temperature" ;
                temp:short_name = "temp" ;
                temp:units = "Celsius" ;
                temp:coordinates = "time lat lon alt" ;
                temp:valid_range = 10., 35. ;
                temp:_FillValue = -999.f ;
                temp:observation_type = "measured" ;

ファイル 2:

netcdf wqb_1.6 {
dimensions:
        time = UNLIMITED ; // (109008 currently)
        name_strlen = 5 ;
variables:
        char station_name(name_strlen) ;
                station_name:long_name = "wqbaw" ;
                station_name:cf_role = "timeseries_id" ;
        float time(time) ;
                time:long_name = "Time" ;
                time:standard_name = "time" ;
                time:short_name = "time" ;
                time:axis = "T" ;
                time:units = "minutes since 2008-01-01 00:00:00 -10:00" ;
        float z ;
                z:long_name = "depth below mean sea level" ;
                z:standard_name = "depth" ;
                z:short_name = "depth" ;
                z:axis = "z" ;
                z:units = "meters" ;
        float lat ;
                lat:long_name = "Latitude" ;
                lat:standard_name = "latitude" ;
                lat:short_name = "lat" ;
                lat:axis = "Y" ;
                lat:units = "degrees_north" ;
        float lon ;
                lon:long_name = "Longitude" ;
                lon:standard_name = "longitude" ;
                lon:short_name = "lon" ;
                lon:axis = "X" ;
                lon:units = "degrees_east" ;
        float temp(time) ;
                temp:long_name = "Temperature" ;
                temp:standard_name = "sea_water_temperature" ;
                temp:short_name = "temp" ;
                temp:units = "Celsius" ;
                temp:coordinates = "time lat lon alt" ;
                temp:valid_range = 10., 35. ;
                temp:_FillValue = -999.f ;
                temp:observation_type = "measured" ;
4

5 に答える 5

3

更新: 以下の解決策は機能しているように見えますが、そうではありません: John M. が発見したように、そこからデータを抽出すると失敗します(他の回答を参照)。1 つの次元を維持することが解決策であると判断したと思っていましたが、4 次元から 1 次元に移行すると、最終的にエラーが発生します。Sean A. が指摘したように、NcML を使用して変数の形状を変更することはできません。

元の「解決策」(実際には機能しません):

データを CF-1.6 に準拠させることが目標である場合、そのディメンションstationの値を 1 にすることができます。だからあなたはこれを行うことができます:

<?xml version="1.0" encoding="UTF-8"?>
<netcdf xmlns="http://www.unidata.ucar.edu/namespaces/netcdf/ncml-2.2" location="/usgs/data/file1.nc">
  <remove type="dimension" name="lon"/>
  <remove type="dimension" name="lat"/>
  <remove type="dimension" name="z"/>
  <dimension name="station" length="1"/>
  <dimension name="name_strlen" length="20" />
  <variable name="lat" shape="station"/>
  <variable name="lon" shape="station"/>
  <variable name="z" shape="station"/>
  <variable name="temp" shape="time station"/>
  <variable name="site" shape="station name_strlen" type="char">
    <attribute name="standard_name" value="station_id" />
    <attribute name="cf_role" value="timeseries_id" />
    <values> my_station_001 </values>
  </variable>
  <attribute name="Conventions" value="CF-1.6" />
  <attribute name="featureType" value="timeSeries" />
</netcdf>
于 2013-09-17T19:15:25.533 に答える
3

リッチの解決策は、この非常に特殊なケースでは機能しますが、その理由は間違っています。NcML では、ディメンション オブジェクトを削除できますが、データ変数の形状を変更することはできません。シングルトン ディメンション (サイズ 1) を削除しようとしているこの特定のケースでは、データがディスク上に配置される方法が実際には変わらないため、うまくいくように見えます。たとえば、Unidata の toolsUI を使用して、リッチの回答で NcML を使用して一時変数の ncdump を実行すると、シングルトン ディメンションがまだ存在し、実際には削除されていないことがわかります。これがファイルの読み取りにどのように影響するかはわかりません-クライアントに依存すると思います。ただし、非シングルトン次元を削除しようとすると、これは劇的に失敗します。

本当にデータを正しく再形成したい場合は、netCDF ファイルを書き直す必要があります。残念ながら、私が知っている「近道」はありません。たとえば、Unidata の toolsUI で Rich の NcML を使用し、それに基づいて新しいファイルを書き出そうとすると、「エラー: セクション (1) 内の範囲の数は変数に対して = 0 でなければなりません」などのエラーが発生します。 z.」これは、netCDF ファイルにシングルトン次元がまだ存在するためですが、NcML ファイルは範囲を強制的に 0 にしようとします。ただし、Python を知っている場合は、netCDF ファイルを書き換えるスクリプトを作成するのは非常に簡単です。

NcML を使用して変数を再形成する機能は、定期的に耳にする機能要求であることに注意してください。機能要求を support-netcdf-java@unidata.ucar.edu に送信しても問題はありません。また、Unidata はコミュニティ主導の組織であり、Rich は来月開催されるユーザー委員会に参加しています。会議で機能要求についても言及することをお勧めします。

乾杯!

ショーン

于 2013-09-18T16:27:18.050 に答える
2

Rich の言う通りです。これを行う目的は、データを CF-1.6 にまで引き上げることであり、それを行う目的は、SOS 経由でデータを提供できるようにすることでした。より具体的には、ncSOS (TDS 上に構築) を使用したかったのですが、この特定の種類の SOS には CF-1.6 が必要です。この点で、NCML による変更は機能しているようです (さらに、いくつかの追加のもの。以下を参照してください)。

データセットを変更する必要がないようにしたいと思います。データセットの一部は数年前までさかのぼります。クライアント ツールに関する Sean の指摘は、私たちのユース ケースの多くに、変数に緯度/経度の次元が必要なツールが含まれているという点でも適切です。したがって、私たちのソリューションは、1 つのデータ セットを 2 つの NCML 'ラッパー' を介して TDS 経由で提供することです。

上記の Rich の提案に加えて、ncSOS で作業するには、次のことを行う必要がありました。

  1. CF-1.6 '座標' 属性を追加 ("time lat lon z")
  2. グローバル属性「featureType = timeSeries」を追加
  3. station_name 変数を追加
  4. ポイントからステーションへのデータ型の変更

結果は次のとおりです。

    <attribute name="featureType" value="timeSeries" />
    <remove type="dimension" name="lon"/>
    <remove type="dimension" name="lat"/>
    <remove type="dimension" name="z"/>
    <dimension name="name_strlen" length="4"/>
    <variable name="lat" shape=""/>
    <variable name="lon" shape=""/>
    <variable name="z" shape=""/>
    <variable name="station_name" shape="name_strlen" type="char">
      <attribute name="long_name" value="NS01" />
      <attribute name="cf_role" value="timeseries_id" />
      <values>NS01</values>
    </variable>
    <variable name="temp" shape="time">
      <attribute name="coordinates" value="time lat lon z" />
    </variable>
于 2013-09-25T18:24:15.880 に答える
2

NcML (バージョン 4.4 以降) には、長さ 1 の次元を削除する操作があります。

<variable name="temp">
  <logicalReduce dimNames="lat lon" />
</variable>

見る

http://www.unidata.ucar.edu/software/thredds/current/netcdf-java/ncml/AnnotatedSchema4.html#logicalReduce

于 2015-10-19T21:45:03.453 に答える