2016-04-15 2 views
0

私はunidataのNetCDF 4 Javaライブラリを使用してGRIBファイルを読み込みます。 GRIBファイルの構造は次のようになります。Lambert Conformal Conic投影法をJavaのNetCDFで緯度/小数点に変換する方法

dimensions: 
    x = 401; 
    y = 301; 
    time = 1; 
    variables: 
    int LambertConformal_Projection; 
     :grid_mapping_name = "lambert_conformal_conic"; 
     :latitude_of_projection_origin = 46.12000274658203; // double 
     :longitude_of_central_meridian = 14.815000534057617; // double 
     :standard_parallel = 46.12000274658203; // double 
     :earth_radius = 6367470.0; // double 
     :_CoordinateTransformType = "Projection"; 
     :_CoordinateAxisTypes = "GeoX GeoY"; 

    float VAR219-0-219-170_surface(time=1, y=301, x=401); 
     :long_name = "Unknown Parameter 219-0-219-170 @ Ground or water surface"; 
     :units = ""; 
     :missing_value = NaNf; // float 
     :grid_mapping = "LambertConformal_Projection"; 
     :coordinates = "reftime time y x "; 
     :Grib_Variable_Id = "VAR_219-0-219-170_L1"; 
     :Grib1_Center = 219; // int 
     :Grib1_Subcenter = 0; // int 
     :Grib1_TableVersion = 219; // int 
     :Grib1_Parameter = 170; // int 
     :Grib1_Level_Type = 1; // int 
     :Grib1_Level_Desc = "Ground or water surface"; 

    float x(x=401); 
     :standard_name = "projection_x_coordinate"; 
     :units = "km"; 
     :_CoordinateAxisType = "GeoX"; 

    float y(y=301); 
     :standard_name = "projection_y_coordinate"; 
     :units = "km"; 
     :_CoordinateAxisType = "GeoY"; 

    double reftime; 
     :units = "Minute since 2016-02-18T12:00:00Z"; 
     :standard_name = "forecast_reference_time"; 
     :long_name = "GRIB reference time"; 
     :calendar = "proleptic_gregorian"; 
     :_CoordinateAxisType = "RunTime"; 

    double time(time=1); 
     :units = "Minute since 2016-02-18T12:00:00Z"; 
     :standard_name = "time"; 
     :long_name = "GRIB forecast or observation time"; 
     :calendar = "proleptic_gregorian"; 
     :_CoordinateAxisType = "Time"; 

    // global attributes: 
    :Originating_or_generating_Center = "Ljubljana"; 
    :Originating_or_generating_Subcenter = "0"; 
    :GRIB_table_version = "0,219"; 
    :file_format = "GRIB-1"; 
    :Conventions = "CF-1.6"; 
    :history = "Read using CDM IOSP GribCollection v3"; 
    :featureType = "GRID"; 
    :_CoordSysBuilder = "ucar.nc2.dataset.conv.CF1Convention"; 
} 

私は/ LNG小数点をLATし、xとyを変換するプログラムを書きたいと思います。私は平面/地球マッピングには新しいです。

+0

このようにすることを止めているのは何ですか?まだ何か努力していますか? – Fildor

+0

はい。私は、NetCDF Javaライブラリで投影法と垂直変換を使用する方法の例を見つけようとしていましたが、成功しませんでした。 –

+1

いいえ、私は:あなたは実際にコードを書くことを始めましたか?私は一般的にJava /プログラミングはあなたの問題ではないことを理解しています、それは正しいですか? – Fildor

答えて

0

リンクありがとうございます。私が必要としていたこと(と私はどのようにして見つけた)は、メソッドprojToLatLonを使うことです。これはxとyの値から緯度と経度を取得した方法です:

NetcdfDataset gid = 
    GridDataset gds = ucar.nc2.dt.grid.GridDataset.open("file.GRB"); 
    GridCoordSystem gcs = gds.getGrids().get(0).getCoordinateSystem(); 
    ProjectionImpl proj = gcs.getProjection(); 
    Variable vr = gid.findVariable("x"); 
    Variable vr2 = gid.findVariable("y"); 
    Array data1 = vr.read(); 
    Array data2 = vr2.read(); 

    int[] shape = data1.getShape(); 
    int[] shape2 = data2.getShape(); 
    Index index = data1.getIndex(); 
    Index index2 = data2.getIndex(); 
    double dval; 
    double dval2; 

    for (int j=0; j<shape2[0]; j++) 
     for (int i=0; i<shape[0]; i++){ 
      dval = data1.getDouble(index.set(i)); 
      dval2 = data2.getDouble(index2.set(j)); 
      System.out.println(dval + " " + dval2 + " " + proj.projToLatLon(dval, dval2).getLatitude() + " " + proj.projToLatLon(dval, dval2).getLongitude()); 
    }   
関連する問題