2016-04-15 7 views
0

Ich verwende die NetCDF 4 Java-Bibliothek von unidata, um GRIB-Dateien zu lesen. GRIB Dateien Struktur sieht wie folgt aus:Konvertieren von Lambert Conformal Conic Projektion zu lat/lng Dezimalstellen mit NetCDF in Java

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

Ich möchte Programm schreiben, die x und y wandelt in lat/lng Dezimalstellen. Ich bin neu in der Kartierung von Ebenen und Globus.

+0

Was hält Sie davon ab? Haben Sie sich schon bemüht? – Fildor

+0

ja. Ich habe versucht, ein Beispiel zu finden, wie man Projektionen und vertikale Transformationen in der NetCDF Java Bibliothek benutzt, aber keinen Erfolg. –

+1

Nein, ich meine: Hast du angefangen Code zu schreiben? Ich verstehe Java/Programmierung im Allgemeinen ist nicht dein Problem, ist das richtig? – Fildor

Antwort

0

Danke Fildor für Links. Was ich brauchte (und ich fand heraus, wie), ist die Methode projToLatLon zu verwenden. So habe ich den Breiten- und Längengrad von x- und y-Werten erhalten:

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()); 
    }   
Verwandte Themen