[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: Still struggling; MPE - GRIB2 decoders
- Subject: Re: Still struggling; MPE - GRIB2 decoders
- Date: Thu, 13 Mar 2008 10:53:12 -0600 (MDT)
Jelle,
attached is some code to print out the GDS and then the data. I think this
was what you wanted.
java -Xmx256m ucar/grib/grib2/Grib2MPE <MPE data file> <output>
if you want you can add another parameter for an output file
robb...
On Mon, 10 Mar 2008, Jelle Ferwerda wrote:
Dear Rob,
Sorry to bug you once more..
I have now received the data and am trying to automate extraction of my
data, for which I need to set up projections in IDL. Not a problem. however,
I need to programmatically extract the projection parameters from the GRIB2
(MPE) files. And somehow I am doing something wrong, I think. I get almost
only 0's as output, and an unknown earth shape. Even though the NETcdftoosl
2.2 can show me the information just fine. I think it might have to do with
not selecting a product, but I cannot find out how to do this.
I hope you have time to pop me a line and explain where I am going wrong?
This is how I have been trying:
// Create a unidata specified RandomAccesFile for reading
ucar.unidata.io.RandomAccessFile InRA = new
ucar.unidata.io.RandomAccessFile(InFile, "r");
// get the grid definitions Grib2GridDefinitionSection gds = new
Grib2GridDefinitionSection(InRA, false);
System.out.println("-------------------------");
System.out.println(gds.getShapeName());
System.out.println(gds.getGdtn());
System.out.println(gds.getLa1());
System.out.println(gds.getLo1());
System.out.println(gds.getLa2());
System.out.println(gds.getLo2());
System.out.println(gds.getDx());
System.out.println(gds.getDy());
System.out.println(gds.getMajorAxis());
System.out.println(gds.getMinorAxis());
System.out.println(gds.getEarthRadius());
System.out.println(gds.getResolution());
System.out.println("-------------------------");
which returns:
-------------------------
Unknown Earth Shape
30
0.345602
0.026597999
0.0
0.0
805306.4
6825.5654
0.0
0.0
0.0
123
-------------------------
Thanks,
Jelle.
-----------------------------------------------
Jelle Ferwerda
Postdoctoral Research Fellow
Animal Behavior Research Group
Department of Zoology / University of Oxford
South Parks Road / Oxford / OX13PS
United Kingdom
email: address@hidden
Office Phone: +44 18652 71214
WWW: http://www.bio-vision.nl
http://www.cookseasonal.com
-----------------------------------------------
===============================================================================
Robb Kambic Unidata Program Center
Software Engineer III Univ. Corp for Atmospheric Research
address@hidden WWW: http://www.unidata.ucar.edu/
===============================================================================
/*
* Copyright 1997-2004 Unidata Program Center/University Corporation for
* Atmospheric Research, P.O. Box 3000, Boulder, CO 80307,
* address@hidden.
*
* This library is free software; you can redistribute it and/or modify it
* under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation; either version 2.1 of the License, or (at
* your option) any later version.
*
* This library is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser
* General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with this library; if not, write to the Free Software Foundation,
* Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
// $Id: Grib2MPE.java,v 1.36 2006/08/18 20:22:10 rkambic Exp $
package ucar.grib.grib2;
import ucar.grib.Index;
import ucar.grib.NoValidGribException;
import ucar.grib.NotSupportedException;
/**
* Grib2MPE.java
* @author Robb Kambic 10/20/03
*
*
*/
// import statements
import ucar.unidata.io.RandomAccessFile;
import ucar.unidata.io.RandomAccessFile;
import java.io.BufferedOutputStream; // Input/Output functions
import java.io.FileOutputStream; // Input/Output functions
import java.io.IOException;
import java.io.PrintStream; // Input/Output functions
import java.io.File;
import java.lang.*; // Standard java functions
import java.util.*; // Extra utilities from sun
/**
* Prints GDS and the data for a MPE grib.
* see <a href="../../../IndexFormat.txt"> IndexFormat.txt</a>
*
*/
public class Grib2MPE {
/**
* Write a Grib file index; optionally create an in-memory index.
* @param inputRaf GRIB file raf
* @param ps write output to here
* @param makeIndex make an in-memory index if true
* @throws IOException
* @return Index if makeIndex is true, else null
*/
public final Index writeFileIndex(RandomAccessFile inputRaf,
PrintStream ps,
boolean makeIndex)
throws IOException {
/**
* date format "yyyy-MM-dd'T'HH:mm:ss'Z'".
*/
final java.text.SimpleDateFormat dateFormat;
dateFormat =
new java.text.SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'");
dateFormat.setTimeZone(java.util.TimeZone.getTimeZone("GMT")); //same
as UTC
Date now = Calendar.getInstance().getTime();
//System.out.println(now.toString() + " ... Start of GribMPE");
long start = System.currentTimeMillis();
int count = 0;
Index index = makeIndex
? new Index()
: null;
// Opening of grib data must be inside a try-catch block
try {
inputRaf.seek(0);
// Create Grib2Input instance
Grib2Input g2i = new Grib2Input(inputRaf);
// params getProducts (implies unique GDSs too), oneRecord
g2i.scan(true, false);
/*
// Section 1 Global attributes
// while needed here to process complete stream
ps.println("index_version = " + Index.current_index_version);
ps.println("grid_edition = " + 2);
ps.println("location = " + inputRaf.getLocation());
ps.println("length = " + inputRaf.length());
ps.println("created = " + dateFormat.format(now));
//ps.println("version = 1.0");
if (makeIndex) {
index.addGlobalAttribute("length",
Long.toString(inputRaf.length()));
index.addGlobalAttribute("location", inputRaf.getLocation());
index.addGlobalAttribute("created", dateFormat.format(now));
//index.addGlobalAttribute( "version", "1.0");
}
*/
// section 3: GDSs in this File
HashMap gdsHM = g2i.getGDSs();
for (Iterator it = gdsHM.keySet().iterator(); it.hasNext(); ) {
ps.println(
"--------------------------------------------------------------------");
String key = (String) it.next();
//ps.println("GDSkey = " + key);
Grib2GridDefinitionSection gds =
(Grib2GridDefinitionSection) gdsHM.get(key);
printGDS(gds, ps);
if (makeIndex) {
index.addHorizCoordSys(makeGdsRecord(gds));
}
ps.println(
"--------------------------------------------------------------------");
}
Grib2Data g2d = new Grib2Data(inputRaf);
// section 2 grib records
ArrayList products = g2i.getProducts();
for (int i = 0; i < products.size(); i++) {
Grib2Product product = (Grib2Product) products.get(i);
Grib2ProductDefinitionSection pds = product.getPDS();
/*
Grib2IdentificationSection id = product.getID();
if (i == 0) {
ps.println("center = " + id.getCenter_id());
ps.println("sub_center = " + id.getSubcenter_id());
ps.println("table_version = "
+ id.getLocal_table_version());
ps.println(
"--------------------------------------------------------------------");
}
*/
/*
ps.println(pds.getProductDefinition() + " "
+ product.getDiscipline() + " "
+ pds.getParameterCategory() + " "
+ pds.getParameterNumber() + " "
+ pds.getTypeGenProcess() + " "
+ pds.getTypeFirstFixedSurface() + " "
+ pds.getValueFirstFixedSurface() + " "
+ pds.getTypeSecondFixedSurface() + " "
+ pds.getValueSecondFixedSurface() + " "
+ product.getReferenceTime() + " "
+ pds.getForecastTime() + " "
+ product.getGDSkey() + " "
+ product.getGdsOffset() + " "
+ product.getPdsOffset());
*/
float data[] = g2d.getData(product.getGdsOffset(),
product.getPdsOffset());
if (data != null) {
for (int j = 0; j < data.length; j++) {
ps.println("data[ " + j + " ]=" + data[j]);
}
}
count++;
}
// Catch thrown errors from GribFile
} catch (NotSupportedException noSupport) {
System.err.println("NotSupportedException : " + noSupport);
}
ps.close();
//System.out.println(" "+count+" products took
"+(System.currentTimeMillis() - start) + " msec");
return index;
} // end writeFileIndex
/**
* creates a GribRecord from a Grib2Product.
*
* @param index _more_
* @param product
* @return Index.GribRecord
*/
protected static final Index.GribRecord makeGribRecord(Index index,
Grib2Product product) {
Index.GribRecord gr = index.getGribRecord();
Grib2ProductDefinitionSection pds = product.getPDS();
gr.productType = pds.getProductDefinition();
gr.discipline = product.getDiscipline();
gr.category = pds.getParameterCategory();
gr.paramNumber = pds.getParameterNumber();
gr.typeGenProcess = pds.getTypeGenProcess();
gr.levelType1 = pds.getTypeFirstFixedSurface();
gr.levelValue1 = pds.getValueFirstFixedSurface();
gr.levelType2 = pds.getTypeSecondFixedSurface();
gr.levelValue2 = pds.getValueSecondFixedSurface();
gr.refTime = product.getReferenceTime().toString();
gr.forecastTime = pds.getForecastTime();
gr.gdsKey = product.getGDSkey().trim();
gr.offset1 = product.getGdsOffset();
gr.offset2 = product.getPdsOffset();
return gr;
}
/**
* Creates a Index.GdsRecord from a GDS
* @param gds
* @return Index.GdsRecord
*/
protected static final Index.GdsRecord makeGdsRecord(
Grib2GridDefinitionSection gds) {
Index.GdsRecord igds = new Index.GdsRecord();
igds.gdsKey = gds.getCheckSum();
igds.addParam("GDSkey", gds.getCheckSum());
//System.out.println( "igds.gdsKey ="+ igds.gdsKey );
String winds = ((gds.getResolution() & 8) == 0)
? "Relative"
: "True";
if (((gds.getGdtn() < 50) || (gds.getGdtn() > 53))
&& (gds.getGdtn() != 100) && (gds.getGdtn() != 120)
&& (gds.getGdtn() != 1200)) {
igds.grid_shape_code = gds.getShape();
igds.addParam("grid_shape_code",
Integer.toString(gds.getShape()));
igds.grid_type = gds.getGdtn();
igds.addParam("grid_type", Integer.toString(gds.getGdtn()));
igds.addParam("grid_shape", gds.getShapeName());
if ((gds.getShape() < 2) || (gds.getShape() == 6)) {
igds.radius_spherical_earth = gds.getEarthRadius();
igds.addParam("radius_spherical_earth",
Double.toString(gds.getEarthRadius()));
} else if ((gds.getShape() > 1) && (gds.getShape() < 5)) {
igds.major_axis_earth = gds.getMajorAxis();
igds.addParam("major_axis_earth",
Double.toString(gds.getMajorAxis()));
igds.minor_axis_earth = gds.getMinorAxis();
igds.addParam("minor_axis_earth",
Double.toString(gds.getMinorAxis()));
}
}
switch (gds.getGdtn()) { // Grid Definition Template
Number
case 0 :
case 1 :
case 2 :
case 3 : // Latitude/Longitude Grid
igds.nx = gds.getNx();
igds.addParam("Nx", Integer.toString(gds.getNx()));
igds.ny = gds.getNy();
igds.addParam("Ny", Integer.toString(gds.getNy()));
igds.La1 = gds.getLa1();
igds.addParam("La1", Double.toString(gds.getLa1()));
igds.Lo1 = gds.getLo1();
igds.addParam("Lo1", Double.toString(gds.getLo1()));
igds.resolution = gds.getResolution();
igds.addParam("ResCompFlag", Integer.toString(gds.getResolution()
));
igds.winds = winds;
igds.addParam("La2", Double.toString(gds.getLa2()));
igds.addParam("Lo2", Double.toString(gds.getLo2()));
igds.dx = gds.getDx();
igds.addParam("Dx", Double.toString(gds.getDx()));
igds.dy = gds.getDy();
igds.addParam("Dy", Double.toString(gds.getDy()));
if (gds.getGdtn() == 1) { //Rotated Latitude/longitude
igds.addParam("SpLat", Double.toString(gds.getSpLat()));
igds.addParam("SpLon", Double.toString(gds.getSpLon()));
} else if (gds.getGdtn() == 2) { //Stretched Latitude/longitude
igds.addParam("pLat", Double.toString(gds.getPoleLat()));
igds.addParam("pLon", Double.toString(gds.getPoleLon()));
} else if (gds.getGdtn() == 3) { //Stretched and Rotated
// Latitude/longitude
igds.addParam("SpLat", Double.toString(gds.getSpLat()));
igds.addParam("SpLon", Double.toString(gds.getSpLon()));
}
break;
case 10 : // Mercator
igds.nx = gds.getNx();
igds.addParam("Nx", Integer.toString(gds.getNx()));
igds.ny = gds.getNy();
igds.addParam("Ny", Integer.toString(gds.getNy()));
igds.La1 = gds.getLa1();
igds.addParam("La1", Double.toString(gds.getLa1()));
igds.Lo1 = gds.getLo1();
igds.addParam("Lo1", Double.toString(gds.getLo1()));
igds.resolution = gds.getResolution();
igds.addParam("ResCompFlag", Integer.toString(gds.getResolution()
));
igds.winds = winds;
igds.addParam("La2", Double.toString(gds.getLa2()));
igds.addParam("Lo2", Double.toString(gds.getLo2()));
igds.addParam("Angle", Double.toString(gds.getAngle()));
igds.dx = gds.getDx();
igds.addParam("Dx", Double.toString(gds.getDx()));
igds.dy = gds.getDy();
igds.addParam("Dy", Double.toString(gds.getDy()));
break;
case 20 : // Polar stereographic projection
igds.nx = gds.getNx();
igds.addParam("Nx", Integer.toString(gds.getNx()));
igds.ny = gds.getNy();
igds.addParam("Ny", Integer.toString(gds.getNy()));
igds.La1 = gds.getLa1();
igds.addParam("La1", Double.toString(gds.getLa1()));
igds.Lo1 = gds.getLo1();
igds.addParam("Lo1", Double.toString(gds.getLo1()));
igds.resolution = gds.getResolution();
igds.addParam("ResCompFlag", Integer.toString(gds.getResolution()
));
String NpProj = ((gds.getProjectionCenter() & 128) == 0)
? "true"
: "false";
igds.addParam("NpProj", NpProj);
//System.out.println( "makeGdsRec NpProj ="+ NpProj );
igds.winds = winds;
igds.LaD = gds.getLad();
igds.addParam("Lad", Double.toString(gds.getLad()));
igds.LoV = gds.getLov();
igds.addParam("Lov", Double.toString(gds.getLov()));
igds.dx = gds.getDx();
igds.addParam("Dx", Double.toString(gds.getDx()));
igds.dy = gds.getDy();
igds.addParam("Dy", Double.toString(gds.getDy()));
break;
case 30 : // Lambert Conformal
igds.nx = gds.getNx();
igds.addParam("Nx", Integer.toString(gds.getNx()));
igds.ny = gds.getNy();
igds.addParam("Ny", Integer.toString(gds.getNy()));
igds.La1 = gds.getLa1();
igds.addParam("La1", Double.toString(gds.getLa1()));
igds.Lo1 = gds.getLo1();
igds.addParam("Lo1", Double.toString(gds.getLo1()));
igds.resolution = gds.getResolution();
igds.addParam("ResCompFlag", Integer.toString(gds.getResolution()
));
NpProj = ((gds.getProjectionCenter() & 128) == 0)
? "true"
: "false";
igds.addParam("NpProj", NpProj);
//System.out.println( "makeGdsRec NpProj ="+ NpProj );
igds.winds = winds;
igds.LaD = gds.getLad();
igds.addParam("Lad", Double.toString(gds.getLad()));
igds.LoV = gds.getLov();
igds.addParam("Lov", Double.toString(gds.getLov()));
igds.dx = gds.getDx();
igds.addParam("Dx", Double.toString(gds.getDx()));
igds.dy = gds.getDy();
igds.addParam("Dy", Double.toString(gds.getDy()));
igds.latin1 = gds.getLatin1();
igds.addParam("Latin1", Double.toString(gds.getLatin1()));
igds.latin2 = gds.getLatin2();
igds.addParam("Latin2", Double.toString(gds.getLatin2()));
igds.addParam("SpLat", Double.toString(gds.getSpLat()));
igds.addParam("SpLon", Double.toString(gds.getSpLon()));
break;
case 31 : // Albers equal area
igds.nx = gds.getNx();
igds.addParam("Nx", Integer.toString(gds.getNx()));
igds.ny = gds.getNy();
igds.addParam("Ny", Integer.toString(gds.getNy()));
igds.La1 = gds.getLa1();
igds.addParam("La1", Double.toString(gds.getLa1()));
igds.Lo1 = gds.getLo1();
igds.addParam("Lo1", Double.toString(gds.getLo1()));
igds.resolution = gds.getResolution();
igds.addParam("ResCompFlag", Integer.toString(gds.getResolution()
));
NpProj = ((gds.getProjectionCenter() & 128) == 0)
? "true"
: "false";
igds.addParam("NpProj", NpProj);
//System.out.println( "makeGdsRec NpProj ="+ NpProj );
igds.winds = winds;
igds.LaD = gds.getLad();
igds.addParam("Lad", Double.toString(gds.getLad()));
igds.LoV = gds.getLov();
igds.addParam("Lov", Double.toString(gds.getLov()));
igds.dx = gds.getDx();
igds.addParam("Dx", Double.toString(gds.getDx()));
igds.dy = gds.getDy();
igds.addParam("Dy", Double.toString(gds.getDy()));
igds.latin1 = gds.getLatin1();
igds.addParam("Latin1", Double.toString(gds.getLatin1()));
igds.latin2 = gds.getLatin2();
igds.addParam("Latin2", Double.toString(gds.getLatin2()));
igds.addParam("SpLat", Double.toString(gds.getSpLat()));
igds.addParam("SpLon", Double.toString(gds.getSpLon()));
break;
case 40 :
case 41 :
case 42 :
case 43 : // Gaussian latitude/longitude
igds.nx = gds.getNx();
igds.addParam("Nx", Integer.toString(gds.getNx()));
igds.ny = gds.getNy();
igds.addParam("Ny", Integer.toString(gds.getNy()));
igds.La1 = gds.getLa1();
igds.addParam("La1", Double.toString(gds.getLa1()));
igds.Lo1 = gds.getLo1();
igds.addParam("Lo1", Double.toString(gds.getLo1()));
igds.resolution = gds.getResolution();
igds.addParam("ResCompFlag", Integer.toString(gds.getResolution()
));
igds.winds = winds;
igds.addParam("La2", Double.toString(gds.getLa2()));
igds.addParam("Lo2", Double.toString(gds.getLo2()));
igds.dx = gds.getDx();
igds.addParam("Dx", Double.toString(gds.getDx()));
igds.addParam("NumberParallels", Double.toString(gds.getN()));
if (gds.getGdtn() == 41) { //Rotated Gaussian
Latitude/longitude
igds.addParam("SpLat", Double.toString(gds.getSpLat()));
igds.addParam("SpLon", Double.toString(gds.getSpLon()));
} else if (gds.getGdtn() == 42) { //Stretched Gaussian
igds.addParam("pLat", Double.toString(gds.getPoleLat()));
igds.addParam("pLon", Double.toString(gds.getPoleLon()));
// Latitude/longitude
} else if (gds.getGdtn() == 43) { //Stretched and Rotated
Gaussian
// Latitude/longitude
igds.addParam("SpLat", Double.toString(gds.getSpLat()));
igds.addParam("SpLon", Double.toString(gds.getSpLon()));
igds.addParam("Angle", Double.toString(gds.getAngle()));
igds.addParam("pLat", Double.toString(gds.getPoleLat()));
igds.addParam("pLon", Double.toString(gds.getPoleLon()));
}
break;
case 50 :
case 51 :
case 52 :
case 53 : // Spherical harmonic coefficients
break;
case 90 : // Space view perspective or orthographic
igds.nx = gds.getNx();
igds.addParam("Nx", Integer.toString(gds.getNx()));
igds.ny = gds.getNy();
igds.addParam("Ny", Integer.toString(gds.getNy()));
igds.addParam("Lap", Double.toString(gds.getLap()));
igds.addParam("Lop", Double.toString(gds.getLop()));
igds.resolution = gds.getResolution();
igds.addParam("ResCompFlag", Integer.toString(gds.getResolution()
));
igds.winds = winds;
igds.dx = gds.getDx();
igds.addParam("Dx", Double.toString(gds.getDx()));
igds.dy = gds.getDy();
igds.addParam("Dy", Double.toString(gds.getDy()));
igds.addParam("Xp", Double.toString(gds.getXp()));
igds.addParam("Yp", Double.toString(gds.getYp()));
igds.addParam("Angle", Double.toString(gds.getAngle()));
igds.addParam("Nr", Double.toString(gds.getAltitude()));
igds.addParam("Xo", Double.toString(gds.getXo()));
igds.addParam("Yo", Double.toString(gds.getYo()));
break;
case 100 : // Triangular grid based on an icosahedron
igds.addParam("pLat", Double.toString(gds.getPoleLat()));
igds.addParam("pLon", Double.toString(gds.getPoleLon()));
break;
case 110 : // Equatorial azimuthal equidistant projection
igds.nx = gds.getNx();
igds.addParam("Nx", Integer.toString(gds.getNx()));
igds.ny = gds.getNy();
igds.addParam("Ny", Integer.toString(gds.getNy()));
igds.La1 = gds.getLa1();
igds.addParam("La1", Double.toString(gds.getLa1()));
igds.Lo1 = gds.getLo1();
igds.addParam("Lo1", Double.toString(gds.getLo1()));
igds.resolution = gds.getResolution();
igds.addParam("ResCompFlag", Integer.toString(gds.getResolution()
));
NpProj = ((gds.getProjectionCenter() & 128) == 0)
? "true"
: "false";
igds.addParam("NpProj", NpProj);
//System.out.println( "makeGdsRec NpProj ="+ NpProj );
igds.winds = winds;
igds.dx = gds.getDx();
igds.addParam("Dx", Double.toString(gds.getDx()));
igds.dy = gds.getDy();
igds.addParam("Dy", Double.toString(gds.getDy()));
break;
case 120 : // Azimuth-range Projection
igds.La1 = gds.getLa1();
igds.addParam("La1", Double.toString(gds.getLa1()));
igds.Lo1 = gds.getLo1();
igds.addParam("Lo1", Double.toString(gds.getLo1()));
igds.dx = gds.getDx();
igds.addParam("Dx", Double.toString(gds.getDx()));
break;
case 204 : // Curvilinear orthographic
igds.nx = gds.getNx();
igds.addParam("Nx", Integer.toString(gds.getNx()));
igds.ny = gds.getNy();
igds.addParam("Ny", Integer.toString(gds.getNy()));
igds.resolution = gds.getResolution();
igds.addParam("ResCompFlag", Integer.toString(gds.getResolution()
));
igds.winds = winds;
//igds.dx = gds.getDx();
//igds.addParam("Dx", Double.toString(gds.getDx()));
//igds.dy = gds.getDy();
//igds.addParam("Dy", Double.toString(gds.getDy()));
break;
/*
case 1000: // Cross-Section Grid with Points Equally Spaced
on the Horizontal
igds.La1 = gds.getLa1();
igds.addParam( "La1", Double.toString( gds.getLa1() ) );
igds.Lo1 = gds.getLo1();
igds.addParam( "Lo1", Double.toString( gds.getLo1() ) );
igds.resolution = gds.getResolution();
igds.addParam("ResCompFlag",
Integer.toString(gds.getResolution() ));
igds.winds = winds;
igds.addParam( "La2", Double.toString( gds.getLa2() ) );
igds.addParam( "Lo2", Double.toString( gds.getLo2() ) );
break;
*/
} // end switch gdtn
return igds;
}
/**
* prints out a products GDS.
* @param gds
* @param ps printStream used to write Index
*/
public void printGDS(Grib2GridDefinitionSection gds,
PrintStream ps) {
ps.println("grid_type = " + gds.getGdtn());
ps.println("grid_name = " + gds.getName());
String winds = ((gds.getResolution() & 8) == 0)
? "Relative"
: "True";
if (((gds.getGdtn() < 50) || (gds.getGdtn() > 53))
&& (gds.getGdtn() != 100) && (gds.getGdtn() != 120)
&& (gds.getGdtn() != 1200)) {
ps.println("grid_shape_code = " + gds.getShape());
ps.println("grid_shape = " + gds.getShapeName());
if ((gds.getShape() < 2) || (gds.getShape() == 6)) {
ps.println("radius_spherical_earth = "
+ gds.getEarthRadius());
} else if ((gds.getShape() > 1) && (gds.getShape() < 5)) {
ps.println("major_axis_earth = " + gds.getMajorAxis());
ps.println("minor_axis_earth = " + gds.getMinorAxis());
}
}
switch (gds.getGdtn()) { // Grid Definition Template
Number
case 0 :
case 1 :
case 2 :
case 3 : // Latitude/Longitude Grid
ps.println("Nx = " + gds.getNx());
ps.println("Ny = " + gds.getNy());
ps.println("La1 = " + gds.getLa1());
ps.println("Lo1 = " + gds.getLo1());
ps.println("ResCompFlag = " + gds.getResolution());
ps.println("Winds = " + winds);
ps.println("La2 = " + gds.getLa2());
ps.println("Lo2 = " + gds.getLo2());
ps.println("Dx = " + gds.getDx());
ps.println("Dy = " + gds.getDy());
//ps.println("ScanningMode = " + gds.getScanMode());
if (gds.getGdtn() == 1) { //Rotated Latitude/longitude
ps.println("SpLat = " + gds.getSpLat());
ps.println("SpLon = " + gds.getSpLon());
ps.println("RotationAngle = " + gds.getRotationangle());
} else if (gds.getGdtn() == 2) { //Stretched Latitude/longitude
ps.println("pLat = " + gds.getPoleLat());
ps.println("pLon = " + gds.getPoleLon());
ps.println("StretchingFactor = " + gds.getFactor());
} else if (gds.getGdtn() == 3) { //Stretched and Rotated
// Latitude/longitude
ps.println("SpLat = " + gds.getSpLat());
ps.println("SpLon = " + gds.getSpLon());
ps.println("RotationAngle = " + gds.getRotationangle());
ps.println("pLat = " + gds.getPoleLat());
ps.println("pLon = " + gds.getPoleLon());
ps.println("StretchingFactor = " + gds.getFactor());
}
break;
case 10 : // Mercator
ps.println("Nx = " + gds.getNx());
ps.println("Ny = " + gds.getNy());
ps.println("La1 = " + gds.getLa1());
ps.println("Lo1 = " + gds.getLo1());
ps.println("ResCompFlag = " + gds.getResolution());
ps.println("Winds = " + winds);
ps.println("La2 = " + gds.getLa2());
ps.println("Lo2 = " + gds.getLo2());
//ps.println("ScanningMode = " + gds.getScanMode());
ps.println("BasicAngle = " + gds.getAngle());
ps.println("Dx = " + gds.getDx());
ps.println("Dy = " + gds.getDy());
break;
case 20 : // Polar stereographic projection
ps.println("Nx = " + gds.getNx());
ps.println("Ny = " + gds.getNy());
ps.println("La1 = " + gds.getLa1());
ps.println("Lo1 = " + gds.getLo1());
ps.println("ResCompFlag = " + gds.getResolution());
ps.println("Winds = " + winds);
ps.println("LaD = " + gds.getLad());
ps.println("LoV = " + gds.getLov());
ps.println("Dx = " + gds.getDx());
ps.println("Dy = " + gds.getDy());
ps.println("ProjFlag = " + gds.getProjectionCenter());
ps.println("NpProj = " + ((gds.getProjectionCenter() & 128) ==
0));
//ps.println("ScanningMode = " + gds.getScanMode());
break;
case 30 : // Lambert Conformal
ps.println("Nx = " + gds.getNx());
ps.println("Ny = " + gds.getNy());
ps.println("La1 = " + gds.getLa1());
ps.println("Lo1 = " + gds.getLo1());
ps.println("ResCompFlag = " + gds.getResolution());
ps.println("Winds = " + winds);
ps.println("LaD = " + gds.getLad());
ps.println("LoV = " + gds.getLov());
ps.println("Dx = " + gds.getDx());
ps.println("Dy = " + gds.getDy());
ps.println("ProjFlag = " + gds.getProjectionCenter());
ps.println("NpProj = " + ((gds.getProjectionCenter() & 128) ==
0));
//ps.println("ScanningMode = " + gds.getScanMode());
ps.println("Latin1 = " + gds.getLatin1());
ps.println("Latin2 = " + gds.getLatin2());
ps.println("SpLat = " + gds.getSpLat());
ps.println("SpLon = " + gds.getSpLon());
break;
case 40 :
case 41 :
case 42 :
case 43 : // Gaussian latitude/longitude
ps.println("Nx = " + gds.getNx());
ps.println("Ny = " + gds.getNy());
ps.println("La1 = " + gds.getLa1());
ps.println("Lo1 = " + gds.getLo1());
ps.println("ResCompFlag = " + gds.getResolution());
ps.println("Winds = " + winds);
ps.println("La2 = " + gds.getLa2());
ps.println("Lo2 = " + gds.getLo2());
ps.println("Dx = " + gds.getDx());
ps.println("StretchingFactor = " + gds.getFactor());
ps.println("NumberParallels = " + gds.getN());
//ps.println("ScanningMode = " + gds.getScanMode());
if (gds.getGdtn() == 41) { //Rotated Gaussian
Latitude/longitude
ps.println("SpLat = " + gds.getSpLat());
ps.println("SpLon = " + gds.getSpLon());
ps.println("RotationAngle = " + gds.getRotationangle());
} else if (gds.getGdtn() == 42) { //Stretched Gaussian
// Latitude/longitude
ps.println("pLat = " + gds.getPoleLat());
ps.println("pLon = " + gds.getPoleLon());
ps.println("StretchingFactor = " + gds.getFactor());
} else if (gds.getGdtn() == 43) { //Stretched and Rotated
Gaussian
// Latitude/longitude
ps.println("SpLat = " + gds.getSpLat());
ps.println("SpLon = " + gds.getSpLon());
ps.println("RotationAngle = " + gds.getRotationangle());
ps.println("pLat = " + gds.getPoleLat());
ps.println("pLon = " + gds.getPoleLon());
ps.println("StretchingFactor = " + gds.getFactor());
}
break;
case 50 :
case 51 :
case 52 :
case 53 : // Spherical harmonic coefficients
ps.println("J = " + gds.getJ());
ps.println("K = " + gds.getK());
ps.println("M = " + gds.getM());
ps.println("MethodNorm = " + gds.getMethod());
ps.println("ModeOrder = " + gds.getMode());
if (gds.getGdtn() == 51) { //Rotated Spherical harmonic
coefficients
ps.println("SpLat = " + gds.getSpLat());
ps.println("SpLon = " + gds.getSpLon());
ps.println("RotationAngle = " + gds.getRotationangle());
} else if (gds.getGdtn() == 52) { //Stretched Spherical
// harmonic coefficients
ps.println("pLat = " + gds.getPoleLat());
ps.println("pLon = " + gds.getPoleLon());
ps.println("StretchingFactor = " + gds.getFactor());
} else if (gds.getGdtn() == 53) { //Stretched and Rotated
// Spherical harmonic coefficients
ps.println("SpLat = " + gds.getSpLat());
ps.println("SpLon = " + gds.getSpLon());
ps.println("RotationAngle = " + gds.getRotationangle());
ps.println("pLat = " + gds.getPoleLat());
ps.println("pLon = " + gds.getPoleLon());
ps.println("StretchingFactor = " + gds.getFactor());
}
break;
case 90 : // Space view perspective or orthographic
ps.println("Nx = " + gds.getNx());
ps.println("Ny = " + gds.getNy());
ps.println("Lap = " + gds.getLap());
ps.println("Lop = " + gds.getLop());
//ps.println("NumberPointsParallel = " + gds.getNx());
//ps.println("NumberPointsMeridian = " + gds.getNy());
//ps.println("LatitudeSub-satellitePoint = " + gds.getLap());
//ps.println("LongitudeSub-satellitePoint = " + gds.getLop());
ps.println("ResCompFlag = " + gds.getResolution());
ps.println("Winds = " + winds);
ps.println("Dx = " + gds.getDx());
ps.println("Dy = " + gds.getDy());
ps.println("Xp = " + gds.getXp());
ps.println("Yp = " + gds.getYp());
//ps.println("ScanningMode = " + gds.getScanMode());
ps.println("Angle = " + gds.getAngle());
ps.println("Nr = " + gds.getAltitude());
ps.println("Xo = " + gds.getXo());
ps.println("Yo = " + gds.getYo());
break;
case 100 : // Triangular grid based on an icosahedron
ps.println("Exponent2Intervals = " + gds.getN2());
ps.println("Exponent3Intervals = " + gds.getN3());
ps.println("NumberIntervals = " + gds.getNi());
ps.println("NumberDiamonds = " + gds.getNd());
ps.println("pLat = " + gds.getPoleLat());
ps.println("pLon = " + gds.getPoleLon());
ps.println("GridPointPosition = " + gds.getPosition());
ps.println("NumberOrderDiamonds = " + gds.getOrder());
//ps.println("ScanningMode = " + gds.getScanMode());
ps.println("NumberParallels = " + gds.getN());
break;
case 110 : // Equatorial azimuthal equidistant projection
ps.println("Nx = " + gds.getNx());
ps.println("Ny = " + gds.getNy());
ps.println("La1 = " + gds.getLa1());
ps.println("Lo1 = " + gds.getLo1());
ps.println("ResCompFlag = " + gds.getResolution());
ps.println("NpProj = " + ((gds.getProjectionCenter() & 128) ==
0));
ps.println("Winds = " + winds);
ps.println("Dx = " + gds.getDx());
ps.println("Dy = " + gds.getDy());
ps.println("ProjFlag = " + gds.getProjectionCenter());
//ps.println("ScanningMode = " + gds.getScanMode());
break;
case 120 : // Azimuth-range Projection
ps.println("NumberDataBins = " + gds.getNb());
ps.println("NumberRadials = " + gds.getNr());
ps.println("NumberPointsParallel = " + gds.getNx());
ps.println("La1 = " + gds.getLa1());
ps.println("Lo1 = " + gds.getLo1());
ps.println("Dx = " + gds.getDx());
ps.println("OffsetFromOrigin = " + gds.getDstart());
//ps.println( "need code to get azi and adelta" );
break;
case 204 : // Curvilinear orthographic
ps.println("Nx = " + gds.getNx());
ps.println("Ny = " + gds.getNy());
ps.println("ResCompFlag = " + gds.getResolution());
ps.println("Winds = " + winds);
//ps.println("Dx = " + gds.getDx());
//ps.println("Dy = " + gds.getDy());
//ps.println("ScanningMode = " + gds.getScanMode());
break;
default :
ps.println("Unknown Grid Type" + gds.getGdtn());
} // end switch gdtn
if (gds.getOlon() == 0) {
ps.println("Quasi = false");
} else {
ps.println("Quasi = true");
}
} // end printGDS
/**
*
* Dumps usage of the class.
* @param className Grib2MPE
*
*/
private static void usage(String className) {
System.out.println();
System.out.println("Usage of " + className + ":");
System.out.println("Parameters:");
System.out.println("<GribFileToRead> reads/scans for index");
System.out.println(
"<IndexFile.idx> where to write index, default STDOUT");
System.out.println();
System.out.println("java " + className
+ " <GribFileToRead> <IndexFile>");
System.exit(0);
}
/**
* creates a Grib2 index for given Grib2 file.
* @param args 2 if Grib file and index file name given
* @throws IOException
*/
public static void main(String args[]) throws IOException {
// Function References
Grib2MPE indexer = new Grib2MPE();
// Test usage
if (args.length < 1) {
// Get class name as String
Class cl = indexer.getClass();
usage(cl.getName());
System.exit(0);
}
RandomAccessFile raf = null;
PrintStream ps = System.out;
String infile = args[0];
raf = new RandomAccessFile(infile, "r");
raf.order(RandomAccessFile.BIG_ENDIAN);
if (args.length == 2) { // input file and index file name given
String idxfile;
if (args[1].endsWith(".dat")) {
idxfile = args[1];
} else {
idxfile = args[1].concat(".dat");
}
File idx = new File( idxfile );
// create tmp index file
idxfile = idxfile +".tmp";
//System.out.println( "idxfile ="+ idxfile );
ps = new PrintStream(
new BufferedOutputStream(
new FileOutputStream(idxfile, false)));
indexer.writeFileIndex(raf, ps, false);
ps.close();
File tidx = new File( idxfile );
tidx.renameTo( idx );
} else if (args.length == 1) { // output to STDOUT
ps = System.out;
indexer.writeFileIndex(raf, ps, false);
}
}
} // end Grib2MPE