2016-04-15 225 views
0

我正在使用unidata中的NetCDF 4 java庫來讀取GRIB文件。 GRIB文件結構如下:如何使用Java中的NetCDF將Lambert Conformal Conic投影轉換爲緯度/經度小數點

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以緯度/經度小數點。我是平面/全球映射的新手。

+0

那麼,什麼阻止你這麼做?做了什麼努力了嗎? – Fildor

+0

是的。我一直在試圖找到一個如何在NetCDF java庫中使用Projections和Vertical Transforms的例子,但沒有成功。 –

+1

不,我的意思是:你是否真的開始寫一些代碼?我理解java /編程一般不是你的問題,對嗎? – Fildor

回答

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()); 
    }   
相關問題