0

我正在使用来自 unidata 的 NetCDF 4 java 库来读取 GRIB 文件。GRIB 文件结构如下所示:

  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";
}

我想编写将 x 和 y 转换为 lat/lng 小数点的程序。我是平面/地球映射的新手。

4

1 回答 1

0

感谢 Fildor 提供链接。我需要(并且我发现了如何)是使用 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() );
    }        
于 2016-04-22T12:54:16.683 回答