jgrib-commits Mailing List for Java GRIB reader (Page 2)
Status: Beta
Brought to you by:
kjellr
You can subscribe to this list here.
2003 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
(1) |
Jul
|
Aug
(1) |
Sep
|
Oct
|
Nov
(6) |
Dec
|
---|---|---|---|---|---|---|---|---|---|---|---|---|
2004 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
(2) |
Sep
|
Oct
|
Nov
(4) |
Dec
|
2005 |
Jan
|
Feb
|
Mar
(2) |
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2006 |
Jan
|
Feb
|
Mar
(2) |
Apr
|
May
|
Jun
|
Jul
(43) |
Aug
(44) |
Sep
(18) |
Oct
(1) |
Nov
(1) |
Dec
|
2007 |
Jan
|
Feb
|
Mar
|
Apr
(1) |
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
|
Nov
|
Dec
|
2008 |
Jan
|
Feb
|
Mar
|
Apr
|
May
|
Jun
|
Jul
|
Aug
|
Sep
|
Oct
(10) |
Nov
(2) |
Dec
|
From: Peter G. <fr...@us...> - 2006-09-11 11:11:57
|
Update of /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib/exceptions In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv611/src/net/sourceforge/jgrib/exceptions Added Files: NotSupportedException.java NoValidGribException.java Log Message: Added package to hold exception related code, makes it easier to get an overview of the working interface --- NEW FILE: NotSupportedException.java --- /** * =============================================================================== * $Id: NotSupportedException.java,v 1.1 2006/09/11 11:11:53 frv_peg Exp $ * =============================================================================== * JGRIB library * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Authors: * See AUTHORS file * =============================================================================== */ /** * NotSupportedException.java 1.0 16 Sep 2002 * * @author Richard D. Gonzalez * @version 1.0 */ package net.sourceforge.jgrib.exceptions; /** * A class that represents an exception thrown when a GRIB feature is not * (yet) supported. * * Currently, only GRIB edition 1 is supported * * @author Richard D. Gonzalez * @version 1.0 */ public class NotSupportedException extends Exception { /** * peg - Added default generated variable * Default variable, that must be implemented, when * extending Exception */ private static final long serialVersionUID = 1L; /** * Construct a new Exception with message <tt>msg</tt>. * * @param msg error message */ public NotSupportedException(String msg) { super(msg); } } --- NEW FILE: NoValidGribException.java --- /** * =============================================================================== * $Id: NoValidGribException.java,v 1.1 2006/09/11 11:11:53 frv_peg Exp $ * =============================================================================== * JGRIB library * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Authors: * See AUTHORS file * =============================================================================== */ /* * NoValidGribException.java 1.0 01/01/2001 * * (C) Benjamin Stark */ package net.sourceforge.jgrib.exceptions; /** * A class that represents an exception during GRIB file operations. * * @author Benjamin Stark * @version 1.0 */ public class NoValidGribException extends Exception { /** * peg - Added default generated variable * Default variable, that must be implemented, when * extending Exception */ private static final long serialVersionUID = 1L; /** * Construct a new Exception with message <tt>msg</tt>. * * @param msg error message */ public NoValidGribException(String msg) { super(msg); } } |
From: Peter G. <fr...@us...> - 2006-09-11 11:11:52
|
Update of /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib/exceptions In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv601/src/net/sourceforge/jgrib/exceptions Log Message: Directory /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib/exceptions added to the repository |
From: Peter G. <fr...@us...> - 2006-09-11 11:10:52
|
Update of /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv32687/src/net/sourceforge/jgrib Removed Files: NotSupportedException.java NoValidGribException.java Log Message: moved to package exceptions --- NotSupportedException.java DELETED --- --- NoValidGribException.java DELETED --- |
From: Peter G. <fr...@us...> - 2006-09-11 11:10:24
|
Update of /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib/unstable In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv32591/src/net/sourceforge/jgrib/unstable Added Files: GribFileGroup.java GribRecordComparator.java Log Message: Added package unstable to hold code not yet fully implemented --- NEW FILE: GribRecordComparator.java --- /** * =============================================================================== * $Id: GribRecordComparator.java,v 1.1 2006/09/11 11:10:19 frv_peg Exp $ * =============================================================================== * JGRIB library * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Authors: * See AUTHORS file * =============================================================================== */ package net.sourceforge.jgrib.unstable; /** * A comparator class used with HashSet-s when storing/sorting Records as * they are read. * * Compares numerous features from the record information to sort according * to a time, level, level-type, y-axis, x-axis order * * Not implemented yet, and may not be. Might be used when dealing with * multiple files that need to serve as single file. * * @author Capt Richard D. Gonzalez * @version 1.0 */ import java.util.Comparator; //import java.util.Calendar; import net.sourceforge.jgrib.GribRecord; /** * @author rdg * */ public class GribRecordComparator implements Comparator { /** * Method required to implement Comparator. * If obj1 is less than obj2, return -1, if equal, return 0, else return 1 * @param obj1 * @param obj2 * @return Integer value as result of compare operation */ public int compare(Object obj1, Object obj2){ // - peg - uncomment the variables, if long detailed check is re-implemented //float z1; //float z2; //String levelType1; //String levelType2; //int gridSize1; //int gridSize2; //Calendar time1; //Calendar time2; GribRecord gr1; GribRecord gr2; //GribRecordPDS pds1; //GribRecordPDS pds2; //GribPDSLevel level1; //GribPDSLevel level2; //int check; // get the records gr1 = (GribRecord) obj1; gr2 = (GribRecord) obj2; // quick check to see if they're the same record if (gr1 == gr2) return 0; return -1; /* // compare the GDS-s check = gr1.getGDS().compare(gr2.getGDS()); if (check < 0) return -1; if (check > 0) return 1; // if not either, they are equal and we continue // compare the PDS-s check = gr1.getGDS().compare(gr2.getGDS()); if (check < 0) return -1; if (check > 0) return 1; // if not either, they are equal and we continue // get the level level1 = gr1.getPDS().getPDSLevel(); level2 = gr2.getPDS().getPDSLevel(); // compare the levels // check = level1 if (level1.getIndex() < level2.getIndex()) return -1; if (level1.getIndex() > level2.getIndex()) return 1; // compare the z levels z1 = level1.getValue1(); z2 = level2.getValue1(); // if the levels are supposed to decrease with height, reverse comparator if (!(level1.getIsIncreasingUp())) { z1 = -z1; z2 = -z2; } if (z1 < z2) return -1; if (z1 > z2) return 1; // if not either, then equal and we continue // compare the forecast times // pds1 = gr1.getPDS(); // pds2 = gr2.getPDS(); */ } // end of method compare } --- NEW FILE: GribFileGroup.java --- /** * =============================================================================== * $Id: GribFileGroup.java,v 1.1 2006/09/11 11:10:19 frv_peg Exp $ * =============================================================================== * JGRIB library * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program 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 General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA * * Authors: * See AUTHORS file * =============================================================================== */ package net.sourceforge.jgrib.unstable; import java.io.FileNotFoundException; import java.io.IOException; import java.io.PrintStream; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import net.sourceforge.jgrib.GribFile; import net.sourceforge.jgrib.GribRecordGDS; import net.sourceforge.jgrib.GribRecordLight; import net.sourceforge.jgrib.exceptions.NoValidGribException; import net.sourceforge.jgrib.exceptions.NotSupportedException; /** * A class to store multiple GribFile-s while allowing access to the GribRecords * of those files as if they were one large file. * This came about because it seems most GRIB files are for a single forecast time, * and this will allow an entire forecast period to be built. * Therefore, the methods are biased towards the separate files being the same * model run at different forecast times. It can be used otherwise, but * files will be sorted according to forecast time. * * TODO - This is not yet functional - the next item on my "todo" list * @author Capt Richard D. Gonzalez * @version 1.0 */ public class GribFileGroup { /** * Store the Grib files */ private HashMap files = new HashMap(); /** * Store the dates */ private Date[] dates = null; // HashSet files = new HashSet(); /** * @param filenames * @throws FileNotFoundException * @throws IOException * @throws NotSupportedException * @throws NoValidGribException */ public GribFileGroup(String[] filenames)throws FileNotFoundException, IOException, NotSupportedException, NoValidGribException{ ArrayList dateList = new ArrayList(); for (int i=0;i<filenames.length;i++){ String filename = filenames[i]; GribFile gribFile = new GribFile(filename); Date date = gribFile.getRecord(1).getPDS().getLocalForecastTime().getTime(); dateList.add(date); files.put(date,gribFile); } dates = (Date[])dateList.toArray(dates); Arrays.sort(dates); } // *** public methods ********************************************************* // basically, reimplementations of the GribFile methods that adjust for // multiple files. /** * Get type names * @return array with names */ public String[] getTypeNames(){ GribFile gribFile = null; String[] allTypeNames = null; HashSet typeNames = new HashSet(); for (int i = 0; i<dates.length; i++){ Date date = dates[i]; gribFile = (GribFile)files.get(date); String[] types = gribFile.getTypeNames(); for (int j = 0; j < types.length; j++){ typeNames.add(types[j]); } } allTypeNames = (String[])typeNames.toArray(allTypeNames); return allTypeNames; } /** * Get Light GRIB records * @return Array with Light Grib Records */ public GribRecordLight[] getLightRecords(){ GribFile gribFile = null; GribRecordLight[] grls = null; ArrayList grlList = new ArrayList(); for (int i = 0; i<dates.length; i++){ Date date = dates[i]; gribFile = (GribFile)files.get(date); grls = gribFile.getLightRecords(); for (int j = 0; j < grls.length; j++){ grlList.add(grls[j]); } } grls = (GribRecordLight[])grlList.toArray(grls); return grls; } /** * Get get grids * @return array with grids */ public GribRecordGDS[] getGrids(){ GribFile gribFile = null; GribRecordGDS[] gdss = null; ArrayList gdsList = new ArrayList(); for (int i = 0; i<dates.length; i++){ Date date = dates[i]; gribFile = (GribFile)files.get(date); gdss = gribFile.getGrids(); for (int j = 0; j < gdss.length; j++){ gdsList.add(gdss[j]); } } gdss = (GribRecordGDS[])gdsList.toArray(gdss); return gdss; } /** * Get the number of records this GRIB file contains. * * @return number of records in this GRIB file */ public int getRecordCount(){ GribFile gribFile = null; int recordCount = 0; for (int i = 0; i<dates.length; i++){ Date date = dates[i]; gribFile = (GribFile)files.get(date); recordCount = recordCount + gribFile.getRecordCount(); } return recordCount; } /** * Print out overview of GRIB file content. * * @param out print stream the output is written to * * @throws IOException if a record can not be opened etc. * @throws NoValidGribException if a record is no valid GRIB record * @throws NotSupportedException */ public void listRecords(PrintStream out) throws IOException, NoValidGribException, NotSupportedException { GribFile gribFile = null; // peg - recordCount and record never used //int recordCount; //int record; for (int i = 0; i<dates.length; i++){ Date date = dates[i]; gribFile = (GribFile)files.get(date); gribFile.listRecords(out); } } /** * Method added by Richard Gonzalez 23 Sep 02. * * Print out listing of parameters in GRIB file. * * @param out print stream the output is written to */ public void listParameters(PrintStream out){ GribFile gribFile = null; for (int i = 0; i<dates.length; i++){ Date date = dates[i]; gribFile = (GribFile)files.get(date); gribFile.listParameters(out); } } /** * Get a string representation of the GRIB file. * * @return NoValidGribException if record is no valid GRIB record */ public String toString(){ GribFile gribFile = null; String theString = null; for (int i = 0; i<dates.length; i++){ Date date = dates[i]; gribFile = (GribFile)files.get(date); theString = theString + gribFile.toString(); } return theString; } } |
From: Peter G. <fr...@us...> - 2006-09-11 11:10:15
|
Update of /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib/unstable In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv32577/src/net/sourceforge/jgrib/unstable Log Message: Directory /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib/unstable added to the repository |
From: Peter G. <fr...@us...> - 2006-09-11 11:10:07
|
Update of /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv32218/src/net/sourceforge/jgrib Removed Files: GribFileGroup.java GribRecordComparator.java Log Message: Moved to unstable package --- GribRecordComparator.java DELETED --- --- GribFileGroup.java DELETED --- |
From: Peter G. <fr...@us...> - 2006-09-06 13:31:06
|
Update of /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib/gds In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv22825/src/net/sourceforge/jgrib/gds Modified Files: GribGDSPolarStereo.java Log Message: Improved documentation, reimplemented forwardTrans() and reversTrans() according to matematical background material Index: GribGDSPolarStereo.java =================================================================== RCS file: /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib/gds/GribGDSPolarStereo.java,v retrieving revision 1.7 retrieving revision 1.8 diff -C2 -d -r1.7 -r1.8 *** GribGDSPolarStereo.java 31 Aug 2006 11:35:04 -0000 1.7 --- GribGDSPolarStereo.java 6 Sep 2006 13:31:01 -0000 1.8 *************** *** 51,61 **** * * Handles the grids defined in the Polar Stereographic projection. ! * * For a polar stereographic projection as a simplified case of the general * stereographic projection. It's defined, that the origo of the projection is * holding the following coordinates:<br> ! * latitude of origo: 90.0<br> * longitude of origo: 0.0<br> ! * * If bit no. 2 of GDS octet 17 is set to zero, the earth is assumed spherical, which * is accieved by setting the ellipsoid eccentricity equal to zero. --- 51,69 ---- * * Handles the grids defined in the Polar Stereographic projection. ! * <p> ! * <h3>Matematical background</h3> ! * It should be noted that the matematical background material is available ! * online as PDF: <a href="http://www.epsg.org/guides/docs/G7-2.pdf">OPG G7-2</a> ! * <p> ! * Comparison between the GRIB standard and the matematical background states, that ! * the <b>polar stereographic projection</b> should be implemented as <b>case B</b>. ! * There is currently 3 different definitions of polar stereographic projections ! * refered to as <b>case: A,B,C</b> * For a polar stereographic projection as a simplified case of the general * stereographic projection. It's defined, that the origo of the projection is * holding the following coordinates:<br> ! * latitude of origo: -90.0 or 90.0<br> * longitude of origo: 0.0<br> ! * <p> * If bit no. 2 of GDS octet 17 is set to zero, the earth is assumed spherical, which * is accieved by setting the ellipsoid eccentricity equal to zero. *************** *** 69,73 **** * your grid might be placed wrongly, because the GRIB standard looses precission is * adding a calculated value for DX and DY. To cope with that you use the provided ! * methods: setGridXCoords() and setGridYCoords(). * * When working with coordinate projections you should be aware, that there is --- 77,83 ---- * your grid might be placed wrongly, because the GRIB standard looses precission is * adding a calculated value for DX and DY. To cope with that you use the provided ! * methods: setGridXCoords() and setGridYCoords(). Of course this requires, that you ! * have access to the precise values in the polar stereographic projection, which you ! * must gain access to prior to using the JGRIB library. * * When working with coordinate projections you should be aware, that there is *************** *** 88,92 **** private static Logger logger = Logger.getLogger(GribGDSPolarStereo.class.getName()); ! /* start of attributes unique to the Polar Stereo GDS */ /** --- 98,103 ---- private static Logger logger = Logger.getLogger(GribGDSPolarStereo.class.getName()); ! ! /* start of attributes unique to the Polar Stereo GDS */ /** *************** *** 532,546 **** * longitude values under the assumption, that the earth is spherical. * ! * Implementation is based upon the formula: 5.114 page 100, or formulas ! * 4.17 and 4.18 page 63 in the book:<br> ! * Map Projections by Addler and Richardus<br> ! * Published by New Holland, ISBN: 0720450071<br> ! * <br> ! * For a quick look online see:<br> ! * <a href="http://www.posc.org/Epicentre.2_2/DataModel/ExamplesofUsage/eu_cs34j.html">online docs</a> ! * and define the eccentricity to zero. ! * ! * TODO verify Easting and northing with respect to Meteorological definition ! * * @param lat - latitude value to convert * @param lon - longitude value to convert --- 543,550 ---- * longitude values under the assumption, that the earth is spherical. * ! * Implementation of polar stereographic projection (case B) as ! * tranformation from geodetic lat/lon to northing,easting. ! * See referenced matematical description in class description. ! * * @param lat - latitude value to convert * @param lon - longitude value to convert *************** *** 548,568 **** */ public double[] forwardTransSpherical(double lat, double lon) { ! // To follow the applied math as simple as possible we map ! // input variables to theese values ! double phi = Math.toRadians(lat); ! double lambda = Math.toRadians(lon); ! double[] xy = new double[2]; ! ! // equation 5.114 or 4.17 and 4.18 ! double rho = 2*this.EARTH_RADIUS*Math.tan(Math.PI/4 - phi/2); ! ! // Calculate northing ! xy[0] = rho*Math.sin(lambda); ! ! // Calculate eathing ! xy[1] = rho*Math.cos(lambda); ! return xy; } --- 552,564 ---- */ public double[] forwardTransSpherical(double lat, double lon) { + + // Set correct use of earth radius + GribRecordGDS.semiMajorAxis = this.EARTH_RADIUS; ! // Set eccentricity to zero, so ellipsoid/oblate spheroid transforms ! // to a spherical form. ! GribRecordGDS.setEccentricity(0.0); ! return this.forwardTrans(lat, lon); } *************** *** 571,583 **** * under the assumption, that the earth is spherical * ! * NOTE:<br> ! * This method is an exact inverse of the forwardTransSpherical() method. Thus it's ! * not validated to work as stand alone routine. ! * <br> ! * For a quick look online see:<br> ! * <a href="http://www.posc.org/Epicentre.2_2/DataModel/ExamplesofUsage/eu_cs34j.html">online docs</a> ! * and define the eccentricity to zero. ! * ! * TODO verify Easting and northing with respect to Meteorological definition * * @param N - Northing value to convert --- 567,573 ---- * under the assumption, that the earth is spherical * ! * Implementation of polar stereographic projection (case B) as ! * tranformation from northing,easting to geodetic lat/lon. ! * See referenced matematical description in class description. * * @param N - Northing value to convert *************** *** 587,621 **** public double[] reverseTransSpherical(double N, double E) { ! // To follow the applied math as simple as possible we map ! // input variables to theese values ! double[] xy = new double[2]; ! ! // Calculate rho ! double rho = Math.sqrt(Math.pow((E-GribRecordGDS.falseEasting),2) + Math.pow((GribRecordGDS.falseNorthing - N), 2)); ! ! // Calculate t ! double t = rho / (2*this.EARTH_RADIUS*GribRecordGDS.SCALE_FACTOR); ! ! // Calculate phi ! double phi = Math.PI/2 - 2*Math.tan(t); ! ! // Calculate lambda ! double lambda = Math.atan2((E-GribRecordGDS.falseEasting), (GribRecordGDS.falseNorthing-N)); ! // Move to degrees ! xy[0] = Math.toDegrees(lambda); ! xy[1] = Math.toDegrees(phi); ! return xy; } /** ! * Calculates Easting and Northing values based on geodetic latitude and ! * longitude values. * ! * Implementation is based upon the formulas: 5.102 and 5.105 pages 97-99 in ! * the book:<br> ! * Map Projections by Addler and Richardus<br> ! * Published by New Holland, ISBN: 0720450071<br> * * NOTE:<br> --- 577,597 ---- public double[] reverseTransSpherical(double N, double E) { ! // Set correct use of earth radius ! GribRecordGDS.semiMajorAxis = this.EARTH_RADIUS; ! // Set eccentricity to zero, so ellipsoid/oblate spheroid transforms ! // to a spherical form. ! GribRecordGDS.setEccentricity(0.0); ! return this.reverseTrans(N, E); } /** ! * Calculates Easting, Northing based upon latitude and longitude values ! * under the assumption, that the earth is an oblate spheroid or ellipsoid * ! * Implementation of polar stereographic projection (case B) as ! * tranformation from geodetic lat/lon to northing,easting. ! * See referenced matematical description in class description. * * NOTE:<br> *************** *** 623,630 **** * a specific ellipsoid by using static mehods of GribRecordGDS. * <br> - * For a quick look online see:<br> - * <a href="http://www.posc.org/Epicentre.2_2/DataModel/ExamplesofUsage/eu_cs34j.html">online docs</a> * - * TODO verify Easting and northing with respect to Meteorological definition * @param lat - latitude value to convert * @param lon - longitude value to convert --- 599,603 ---- *************** *** 640,668 **** double phi = Math.toRadians(lat); double lambda = Math.toRadians(lon); ! double lambdaZero = 0; double[] returnValues = new double[2]; ! // Helper variables: ! double eSinPhi = GribRecordGDS.eccentricity * Math.sin(phi); ! double tHelper = (1-eSinPhi)/(1+eSinPhi); ! tHelper = Math.pow(tHelper, (GribRecordGDS.eccentricity/2.0)); ! double rhoHelper = Math.pow((1+GribRecordGDS.eccentricity), (1-GribRecordGDS.eccentricity)) * ! Math.pow((1-GribRecordGDS.eccentricity), (1+GribRecordGDS.eccentricity)); // Calculate t ! double t = Math.tan((Math.PI/4)-(phi/2.0)) / tHelper; ! // Calculate rho ! double rho = (2*GribRecordGDS.semiMajorAxis*GribRecordGDS.SCALE_FACTOR*t) / Math.sqrt(rhoHelper); ! ! // Calculate E - Easting ! double E = GribRecordGDS.falseEasting + (rho * Math.sin(lambda - lambdaZero)); ! ! // Calculate N - Northing ! double N = GribRecordGDS.falseNorthing - (rho * Math.cos(lambda - lambdaZero)); ! // Add values to return argument ! returnValues[0] = N; ! returnValues[1] = E; // Return calculated values --- 613,664 ---- double phi = Math.toRadians(lat); double lambda = Math.toRadians(lon); ! double phi_ts = Math.toRadians(this.latitude_ts); double[] returnValues = new double[2]; ! // Calculate tf based upon phi_ts ! double tf = Double.NaN; ! if(this.latitude_ts < 0) { ! tf = Math.tan(Math.PI/4.0 + phi_ts/2.0) / ! Math.pow( (1 + GribRecordGDS.eccentricity*Math.sin(phi_ts))/(1-GribRecordGDS.eccentricity*Math.sin(phi_ts)),(GribRecordGDS.eccentricity/2.0) ); ! } else { ! tf = Math.tan(Math.PI/4.0 - phi_ts/2.0) * ! Math.pow( (1 + GribRecordGDS.eccentricity*Math.sin(phi_ts))/(1-GribRecordGDS.eccentricity*Math.sin(phi_ts)),(GribRecordGDS.eccentricity/2.0) ); ! } + // Calculate scale factor + double mf = Math.cos(phi_ts) / Math.sqrt(1 - Math.pow(GribRecordGDS.eccentricity, 2)*Math.pow(Math.sin(phi_ts),2)); + GribRecordGDS.SCALE_FACTOR = mf * Math.sqrt( Math.pow( (1+GribRecordGDS.eccentricity), (1+GribRecordGDS.eccentricity) ) * + Math.pow( (1-GribRecordGDS.eccentricity), (1-GribRecordGDS.eccentricity) ) ) / (2*tf); + // Calculate t ! double t = Double.NaN; ! if(this.latitude_ts < 0) { ! t = Math.tan(Math.PI/4.0 + phi/2.0) / ! Math.pow( (1 + GribRecordGDS.eccentricity*Math.sin(phi))/(1-GribRecordGDS.eccentricity*Math.sin(phi)),(GribRecordGDS.eccentricity/2.0) ); ! } else { ! t = Math.tan(Math.PI/4.0 - phi/2.0) * ! Math.pow( (1 + GribRecordGDS.eccentricity*Math.sin(phi))/(1-GribRecordGDS.eccentricity*Math.sin(phi)),(GribRecordGDS.eccentricity/2.0) ); ! } ! // Calculate rho ! double rho = (2*GribRecordGDS.semiMajorAxis*GribRecordGDS.SCALE_FACTOR*t) / ! Math.sqrt( Math.pow( (1+GribRecordGDS.eccentricity), (1+GribRecordGDS.eccentricity) ) * ! Math.pow( (1-GribRecordGDS.eccentricity), (1-GribRecordGDS.eccentricity) ) ); ! ! ! // Define Easting and Northing ! double easting = Double.NaN; ! double northing = Double.NaN; ! if(this.latitude_ts < 0) { ! easting = GribRecordGDS.falseEasting + rho*Math.sin(lambda); ! northing = GribRecordGDS.falseNorthing + rho*Math.cosh(lambda); ! } else { ! easting = GribRecordGDS.falseEasting + rho*Math.sin(lambda); ! northing = GribRecordGDS.falseNorthing - rho*Math.cosh(lambda); ! } ! // Add values to return argument ! returnValues[0] = northing; ! returnValues[1] = easting; // Return calculated values *************** *** 671,696 **** /** ! * Calculates latitude and longitude based upon Easting, Northing values. * - * NOTE:<br> - * This method is an exact inverse of the forwardTrans() method. Thus it's - * not validated to work as stand alone routine. - * <br> * NOTE:<br> * Requires knowledge of involved ellipsoid to work correctly. You can force * a specific ellipsoid by using static mehods of GribRecordGDS. * <br> - * For a quick look online see:<br> - * <a href="http://www.posc.org/Epicentre.2_2/DataModel/ExamplesofUsage/eu_cs34j.html">online docs</a> - * - * TODO verify Easting and northing with respect to Meteorological definition * ! * @param N - Northing value to convert ! * @param E - Easting value to convert ! * @return lon,lat - longitude,latitude, array * * @see net.sourceforge.jgrib.GribRecordGDS#setReferenceEllipsoid(double, double) * @see net.sourceforge.jgrib.GribRecordGDS#setReferenceEllipsoidAxis(double, double) - * */ public double[] reverseTrans(double N, double E) { --- 667,689 ---- /** ! * Calculates latitude and longitude based upon Easting, Northing values ! * under the assumption, that the earth is an oblate spheroid or ellipsoid ! * ! * Implementation of polar stereographic projection (case B) as ! * tranformation from northing,easting to geodetic lat/lon. ! * See referenced matematical description in class description. * * NOTE:<br> * Requires knowledge of involved ellipsoid to work correctly. You can force * a specific ellipsoid by using static mehods of GribRecordGDS. * <br> * ! * @param N - northing value to convert ! * @param E - easting value to convert ! * ! * @return northing,easting - array * * @see net.sourceforge.jgrib.GribRecordGDS#setReferenceEllipsoid(double, double) * @see net.sourceforge.jgrib.GribRecordGDS#setReferenceEllipsoidAxis(double, double) */ public double[] reverseTrans(double N, double E) { *************** *** 698,708 **** // To follow the applied math as simple as possible we map // input variables to theese values ! double lambdaZero = 0; double[] returnValues = new double[2]; ! // Define helper variables ! double tHelper = Math.pow((1 + GribRecordGDS.eccentricity), (1 - GribRecordGDS.eccentricity)) * ! Math.pow((1 - GribRecordGDS.eccentricity), (1 + GribRecordGDS.eccentricity)); ! tHelper = Math.sqrt(tHelper); // Used to calculate phi --- 691,730 ---- // To follow the applied math as simple as possible we map // input variables to theese values ! double phi_ts = Math.toRadians(this.latitude_ts); double[] returnValues = new double[2]; + + // Calculate tf based upon phi_ts + double tf = Double.NaN; + if(this.latitude_ts < 0) { + tf = Math.tan(Math.PI/4.0 + phi_ts/2.0) / + Math.pow( (1 + GribRecordGDS.eccentricity*Math.sin(phi_ts))/(1-GribRecordGDS.eccentricity*Math.sin(phi_ts)),(GribRecordGDS.eccentricity/2.0) ); + } else { + tf = Math.tan(Math.PI/4.0 - phi_ts/2.0) * + Math.pow( (1 + GribRecordGDS.eccentricity*Math.sin(phi_ts))/(1-GribRecordGDS.eccentricity*Math.sin(phi_ts)),(GribRecordGDS.eccentricity/2.0) ); + } + + // Calculate scale factor + double mf = Math.cos(phi_ts) / Math.sqrt(1 - Math.pow(GribRecordGDS.eccentricity, 2)*Math.pow(Math.sin(phi_ts),2)); + GribRecordGDS.SCALE_FACTOR = mf * Math.sqrt( Math.pow( (1+GribRecordGDS.eccentricity), (1+GribRecordGDS.eccentricity) ) * + Math.pow( (1-GribRecordGDS.eccentricity), (1-GribRecordGDS.eccentricity) ) ) / (2*tf); + + // Calculate rho + double rho = Math.sqrt( ( Math.pow((E-GribRecordGDS.falseEasting),2) + Math.pow((N-GribRecordGDS.falseNorthing), 2) ) ); + + // Calculate t + double t = rho * Math.sqrt( Math.pow( (1+GribRecordGDS.eccentricity), (1+GribRecordGDS.eccentricity) ) * + Math.pow( (1-GribRecordGDS.eccentricity), (1-GribRecordGDS.eccentricity) ) ) / + ( 2 * GribRecordGDS.semiMajorAxis * GribRecordGDS.SCALE_FACTOR); ! // calculate chi and lambda ! double chi = Double.NaN; ! double lambda = Double.NaN; ! if(this.latitude_ts < 0) { ! chi = 2*Math.atan(t) - Math.PI/2.0; ! lambda = Math.atan2(Math.pow((E-GribRecordGDS.falseEasting),2), Math.pow((N-GribRecordGDS.falseNorthing), 2)); ! } else { ! chi = Math.PI/2.0 - 2*Math.atan(t); ! lambda = Math.atan2(Math.pow((E-GribRecordGDS.falseEasting),2), Math.pow((GribRecordGDS.falseNorthing - N), 2)); ! } // Used to calculate phi *************** *** 711,725 **** double e6 = Math.pow(GribRecordGDS.eccentricity, 6); double e8 = Math.pow(GribRecordGDS.eccentricity, 8); ! ! // Calculate rho ! double rho = Math.sqrt(Math.pow((E - GribRecordGDS.falseEasting), 2) + ! Math.pow((N - GribRecordGDS.falseNorthing),2)); ! ! // Calculate t ! double t = (rho*tHelper) / (2 * GribRecordGDS.semiMajorAxis * GribRecordGDS.SCALE_FACTOR); ! ! // Calculate chi ! double chi = (Math.PI/2.0) - 2*Math.atan(t); ! // Calculate phi double phi = chi + ( ( (e2/2) + (5*e4/24) + (e6/12) + (13*e8/360) )*Math.sin(2*chi) ) --- 733,737 ---- double e6 = Math.pow(GribRecordGDS.eccentricity, 6); double e8 = Math.pow(GribRecordGDS.eccentricity, 8); ! // Calculate phi double phi = chi + ( ( (e2/2) + (5*e4/24) + (e6/12) + (13*e8/360) )*Math.sin(2*chi) ) *************** *** 727,737 **** + ( ( (7*e6/120) + (81*e8/1120) )*Math.sin(6*chi) ) + ( (4279*e8/161280)*Math.sin(8*chi) ); ! ! // Calculate lambda ! double lambda = lambdaZero + Math.atan((E - GribRecordGDS.falseEasting)/ ! (GribRecordGDS.falseNorthing - N)); ! // Return values as degrees ! double lon = Math.toDegrees(lambda)-180; double lat = Math.toDegrees(phi); --- 739,745 ---- + ( ( (7*e6/120) + (81*e8/1120) )*Math.sin(6*chi) ) + ( (4279*e8/161280)*Math.sin(8*chi) ); ! // Return values as degrees ! double lon = Math.toDegrees(lambda); double lat = Math.toDegrees(phi); |
From: Peter G. <fr...@us...> - 2006-09-06 13:30:01
|
Update of /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv22365/src/net/sourceforge/jgrib Modified Files: GribRecordGDS.java Log Message: Added static method setEccentricity(), Improved documentation of class Index: GribRecordGDS.java =================================================================== RCS file: /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib/GribRecordGDS.java,v retrieving revision 1.13 retrieving revision 1.14 diff -C2 -d -r1.13 -r1.14 *** GribRecordGDS.java 31 Aug 2006 11:33:18 -0000 1.13 --- GribRecordGDS.java 6 Sep 2006 13:29:51 -0000 1.14 *************** *** 53,62 **** * Users should be aware, that the static methods of this class is an extention * of the GRIB standard, which allows for more precise calculations of latitude ! * and longitude from ie. the polar stereographic projection. ! * ! * The lat/lon and rotated lat/lon grid will totally ignore theese features. * <p> * Further documentation: ! * <a href="http://www.nco.ncep.noaa.gov/pmb/docs/on388/section2.html">section2.html</a> * * @author Benjamin Stark <p> --- 53,65 ---- * Users should be aware, that the static methods of this class is an extention * of the GRIB standard, which allows for more precise calculations of latitude ! * and longitude from ie. the polar stereographic projection. ! * <p> ! * The matematical background involved in transformations between geodetic latitude/longitude ! * is based on the recommendations provided by <b>OGP Surveying & Positioning Committee</b>. ! * If interested please visit the OGP homepage. * <p> * Further documentation: ! * <a href="http://www.nco.ncep.noaa.gov/pmb/docs/on388/section2.html">section2.html</a><br> ! * <a href="http://www.epsg.org/">OGP Surveying & Positioning Committee</a> * * @author Benjamin Stark <p> *************** *** 324,328 **** // Set invers flattening ! GribRecordGDS.inverseFlattening = 1.0/((semiMajorAxis - semiMinorAxis) / semiMajorAxis); // Calculate eccentricity --- 327,331 ---- // Set invers flattening ! GribRecordGDS.inverseFlattening = semiMajorAxis / (semiMajorAxis - semiMinorAxis); // Calculate eccentricity *************** *** 351,354 **** --- 354,371 ---- } + /** + * Set eccentricity to the value you want to use in + * the transformations. You should be aware, that this + * value is calculated based upon input from the methods + * mentioned below. + * + * @param eccentricity - Ellipsoid eccentricity + * + * @see GribRecordGDS#setReferenceEllipsoid(double, double) + */ + public static void setEccentricity(double eccentricity) { + GribRecordGDS.eccentricity = eccentricity; + } + // *** public methods ************************************************************** |
From: Peter G. <fr...@us...> - 2006-08-31 11:35:16
|
Update of /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib/gds In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv31378/src/net/sourceforge/jgrib/gds Modified Files: GribGDSPolarStereo.java Log Message: Added new methods to cope with both spherical and spheroid earth definitions, still needs some testing though Index: GribGDSPolarStereo.java =================================================================== RCS file: /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib/gds/GribGDSPolarStereo.java,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** GribGDSPolarStereo.java 16 Aug 2006 14:38:11 -0000 1.6 --- GribGDSPolarStereo.java 31 Aug 2006 11:35:04 -0000 1.7 *************** *** 50,57 **** * A class that represents the grid definition section (GDS) of a GRIB record. * ! * Handles the grids defined in the Polar Stereographic projection. * ! * @author Benjamin Stark ! * @author Capt Richard D. Gonzalez * @author Peter Gylling - frv_peg at users.sourceforge.net */ --- 50,84 ---- * A class that represents the grid definition section (GDS) of a GRIB record. * ! * Handles the grids defined in the Polar Stereographic projection. * ! * For a polar stereographic projection as a simplified case of the general ! * stereographic projection. It's defined, that the origo of the projection is ! * holding the following coordinates:<br> ! * latitude of origo: 90.0<br> ! * longitude of origo: 0.0<br> ! * ! * If bit no. 2 of GDS octet 17 is set to zero, the earth is assumed spherical, which ! * is accieved by setting the ellipsoid eccentricity equal to zero. ! * This leeds to a set of simplified equations. There is extended documentation ! * about this issue available on the JGRIB sourceforge site.<br> ! * see: <a href="http://sourceforge.net/projects/jgrib/">JGRIB project documentation</> ! * <br> ! * ! * The GRIB standard prescribes, that the value of DX and DY is true at the ! * latitude value of 60 degrees closes to the pole. This is the main reason, that ! * your grid might be placed wrongly, because the GRIB standard looses precission is ! * adding a calculated value for DX and DY. To cope with that you use the provided ! * methods: setGridXCoords() and setGridYCoords(). ! * ! * When working with coordinate projections you should be aware, that there is ! * a difference in definitions between the geodetic and the meteorologic worlds. ! * <br> ! * The geodetic definition states, that X-direction yields Northing values, whereas ! * the meteorological definition states, that X-direction yields Easting values. IE the ! * algoritm involved must reflect the meteorological world given the fact, that GRIB ! * is a meteorological standard file format. ! * ! * @author Benjamin Stark - origininal author of JGRIB ! * @author Capt Richard D. Gonzalez - captgonzo at users.sourceforge.net * @author Peter Gylling - frv_peg at users.sourceforge.net */ *************** *** 173,178 **** // octets 29-32 are reserved ! //prepProjection(); ! double[] xy = this.forwardTrans(this.grid_lat1, this.grid_lon1, this.grid_lon2); this.grid_startx = xy[0]; this.grid_starty = xy[1]; --- 200,209 ---- // octets 29-32 are reserved ! double[] xy = new double[2]; ! if(this.isEarthSpherical()) { ! xy = this.forwardTransSpherical(this.grid_lat1, this.grid_lon1); ! } else { ! xy = this.forwardTrans(this.grid_lat1, this.grid_lon1); ! } this.grid_startx = xy[0]; this.grid_starty = xy[1]; *************** *** 189,192 **** --- 220,236 ---- } + /** + * Table 7. Resolution and Component Flags, + * bit 2 (from left) = 2^(8-2) = 64 = 0x64 : + * + * - True if earth is assumed spherical<br> + * - False if eath is assumed oblate spheroid<br> + * + * @return true/false - Depends value of bit no. 2 of GDS octet 17 + */ + public boolean isEarthSpherical() { + return (grid_mode & 0x64) == 0; + } + /** * @see net.sourceforge.jgrib.GribRecordGDS#compare(net.sourceforge.jgrib.GribRecordGDS) *************** *** 381,390 **** * * @see net.sourceforge.jgrib.GribRecordGDS#getGridCoords() ! * @see GribGDSPolarStereo#forwardTrans(double, double, double) ! * @see GribGDSPolarStereo#reverseTrans(double, double, double) ! * @see GribGDSPolarStereo#setXCoords(double, double, boolean) ! * @see GribGDSPolarStereo#setYCoords(double, double, boolean) * ! * @return longitide/latitude as doubles */ public double[] getGridCoords() --- 425,436 ---- * * @see net.sourceforge.jgrib.GribRecordGDS#getGridCoords() ! * @see GribGDSPolarStereo#forwardTransSpherical(double, double) ! * @see GribGDSPolarStereo#reverseTransSpherical(double, double) ! * @see GribGDSPolarStereo#forwardTrans(double, double) ! * @see GribGDSPolarStereo#reverseTrans(double, double) ! * @see GribRecordGDS#setGridXCoords(double, double, boolean) ! * @see GribRecordGDS#setGridYCoords(double, double, boolean) * ! * @return longitide/latitude pairs as doubles */ public double[] getGridCoords() *************** *** 400,404 **** { x = grid_startx + grid_dx*i; ! double[] latLon = this.reverseTrans(x,y,this.grid_lon2); coords[count++] = latLon[0]; coords[count++] = latLon[1]; --- 446,455 ---- { x = grid_startx + grid_dx*i; ! double[] latLon = new double[2]; ! if(this.isEarthSpherical()) { ! latLon = this.reverseTransSpherical(y, x); ! } else { ! latLon = this.reverseTrans(y,x); ! } coords[count++] = latLon[0]; coords[count++] = latLon[1]; *************** *** 425,499 **** return grid_starty; } - - /** - * Get a string representation of this GDS. - * @return string representation of this GDS - */ - public String toString() - { - - String str = " GDS section:\n "; - - str += " " + this.grid_type_string; - - - str += " (" + this.grid_nx + "x" + this.grid_ny + ")\n "; - str += " 1st point: Lat: " + this.grid_lat1; - str += " Lon: " + this.grid_lon1 +"\n "; - str += " Grid start X: " + this.grid_startx+ "m; "; - str += " Y: " + this.grid_starty+ "m;\n "; - str += " Grid length: X-Direction " + this.grid_dx + "m; "; - str += " Y-Direction: " + this.grid_dy + "m\n "; - str += " Orientation - East longitude parallel to y-axis: " ; - str += this.getGridLov() + "\n "; - str += " Resolution and Component Flags: \n "; - if ((this.grid_mode & 128) == 128) - { - str += " Direction increments given \n "; - } - else - { - str += " Direction increments not given \n "; - } - if ((this.grid_mode & 64) == 64){ - str += " Earth assumed oblate spheroid 6378.16 km at equator, " + - " 6356.775 km at pole, f=1/297.0\n "; - } - else{ - str += " Earth assumed spherical with radius = 6367.47 km \n "; - } - if ((this.grid_mode & 8) == 8){ - str += " u and v components are relative to the grid \n "; - } - else{ - str += " u and v components are relative to easterly and " + - "northerly directions \n "; - } - str += " Scanning mode: \n " ; - if ((this.grid_scan & 128) == 128){ - str += " Points scan in the -i direction \n "; - } - else{ - str += " Points scan in the +i direction \n "; - } - if ((this.grid_scan & 64) == 64){ - str += " Points scan in the +j direction \n "; - } - else{ - str += " Points scan in the -j direction \n "; - } - if ((this.grid_scan & 32) == 32){ - str += " Adjacent points in j direction are consecutive \n "; - } - else{ - str += " Adjacent points in i direction are consecutive\n"; - } - str += " proj_center flag: " + grid_proj_center + "\n"; - str += " latitude_ts: " + getLatitudeTrueScale() + "\n"; - str += " center_lon: " + getGridCenterLon() + "\n"; //=lov - str += " center_lat: " + getGridCenterLat()+ "\n"; - - return str; - } /** --- 476,479 ---- *************** *** 506,517 **** * to provide a precise grid. * ! * @param start_x - Northing start value ! * @param end_x - Northing end value * @param positiveDX - true/false */ ! public void setXCoords (double start_x, double end_x, boolean positiveDX) { ! this.grid_startx = start_x; ! this.grid_endx = end_x; ! double dx = Math.abs(end_x - start_x)/this.grid_nx; if(!positiveDX) { dx = -dx; --- 486,499 ---- * to provide a precise grid. * ! * @param startx - Northing start value (meters) ! * @param endx - Northing end value (meters) * @param positiveDX - true/false + * + * @see GribRecordGDS#setGridXCoords(double, double, boolean) */ ! public void setGridXCoords (double startx, double endx, boolean positiveDX) { ! this.grid_startx = startx; ! this.grid_endx = endx; ! double dx = Math.abs(endx - startx)/this.grid_nx; if(!positiveDX) { dx = -dx; *************** *** 529,540 **** * to provide a precise grid. * ! * @param start_y - Easting start value ! * @param end_y - Easting end value * @param positiveDY - true/false */ ! public void setYCoords (double start_y, double end_y, boolean positiveDY) { ! this.grid_starty = start_y; ! this.grid_endy = end_y; ! double dy = Math.abs(end_y - start_y)/this.grid_ny; if(!positiveDY) { dy = -dy; --- 511,524 ---- * to provide a precise grid. * ! * @param starty - Easting start value (meters) ! * @param endy - Easting end value (meters) * @param positiveDY - true/false + * + * @see GribRecordGDS#setGridYCoords(double, double, boolean) */ ! public void setGridYCoords (double starty, double endy, boolean positiveDY) { ! this.grid_starty = starty; ! this.grid_endy = endy; ! double dy = Math.abs(endy - starty)/this.grid_ny; if(!positiveDY) { dy = -dy; *************** *** 543,546 **** --- 527,613 ---- } + + /** + * Calculates Easting and Northing values based on geodetic latitude and + * longitude values under the assumption, that the earth is spherical. + * + * Implementation is based upon the formula: 5.114 page 100, or formulas + * 4.17 and 4.18 page 63 in the book:<br> + * Map Projections by Addler and Richardus<br> + * Published by New Holland, ISBN: 0720450071<br> + * <br> + * For a quick look online see:<br> + * <a href="http://www.posc.org/Epicentre.2_2/DataModel/ExamplesofUsage/eu_cs34j.html">online docs</a> + * and define the eccentricity to zero. + * + * TODO verify Easting and northing with respect to Meteorological definition + * + * @param lat - latitude value to convert + * @param lon - longitude value to convert + * @return northing,easting - array + */ + public double[] forwardTransSpherical(double lat, double lon) { + + // To follow the applied math as simple as possible we map + // input variables to theese values + double phi = Math.toRadians(lat); + double lambda = Math.toRadians(lon); + double[] xy = new double[2]; + + // equation 5.114 or 4.17 and 4.18 + double rho = 2*this.EARTH_RADIUS*Math.tan(Math.PI/4 - phi/2); + + // Calculate northing + xy[0] = rho*Math.sin(lambda); + + // Calculate eathing + xy[1] = rho*Math.cos(lambda); + + return xy; + } + + /** + * Calculates latitude and longitude based upon Easting, Northing values + * under the assumption, that the earth is spherical + * + * NOTE:<br> + * This method is an exact inverse of the forwardTransSpherical() method. Thus it's + * not validated to work as stand alone routine. + * <br> + * For a quick look online see:<br> + * <a href="http://www.posc.org/Epicentre.2_2/DataModel/ExamplesofUsage/eu_cs34j.html">online docs</a> + * and define the eccentricity to zero. + * + * TODO verify Easting and northing with respect to Meteorological definition + * + * @param N - Northing value to convert + * @param E - Easting value to convert + * @return lon,lat - longitude,latitude, array + */ + public double[] reverseTransSpherical(double N, double E) { + + // To follow the applied math as simple as possible we map + // input variables to theese values + double[] xy = new double[2]; + + // Calculate rho + double rho = Math.sqrt(Math.pow((E-GribRecordGDS.falseEasting),2) + Math.pow((GribRecordGDS.falseNorthing - N), 2)); + + // Calculate t + double t = rho / (2*this.EARTH_RADIUS*GribRecordGDS.SCALE_FACTOR); + + // Calculate phi + double phi = Math.PI/2 - 2*Math.tan(t); + + // Calculate lambda + double lambda = Math.atan2((E-GribRecordGDS.falseEasting), (GribRecordGDS.falseNorthing-N)); + + // Move to degrees + xy[0] = Math.toDegrees(lambda); + xy[1] = Math.toDegrees(phi); + + return xy; + } + /** * Calculates Easting and Northing values based on geodetic latitude and *************** *** 558,564 **** * For a quick look online see:<br> * <a href="http://www.posc.org/Epicentre.2_2/DataModel/ExamplesofUsage/eu_cs34j.html">online docs</a> * @param lat - latitude value to convert * @param lon - longitude value to convert - * @param lon_zero - longitude value of origin (lov) * @return northing,easting - array * --- 625,632 ---- * For a quick look online see:<br> * <a href="http://www.posc.org/Epicentre.2_2/DataModel/ExamplesofUsage/eu_cs34j.html">online docs</a> + * + * TODO verify Easting and northing with respect to Meteorological definition * @param lat - latitude value to convert * @param lon - longitude value to convert * @return northing,easting - array * *************** *** 566,570 **** * @see net.sourceforge.jgrib.GribRecordGDS#setReferenceEllipsoidAxis(double, double) */ ! public double[] forwardTrans (double lat, double lon, double lon_zero) { // To follow the applied math as simple as possible we map --- 634,638 ---- * @see net.sourceforge.jgrib.GribRecordGDS#setReferenceEllipsoidAxis(double, double) */ ! public double[] forwardTrans (double lat, double lon) { // To follow the applied math as simple as possible we map *************** *** 572,576 **** double phi = Math.toRadians(lat); double lambda = Math.toRadians(lon); ! double lambdaZero = Math.toRadians(lon_zero); double[] returnValues = new double[2]; --- 640,644 ---- double phi = Math.toRadians(lat); double lambda = Math.toRadians(lon); ! double lambdaZero = 0; double[] returnValues = new double[2]; *************** *** 615,621 **** * For a quick look online see:<br> * <a href="http://www.posc.org/Epicentre.2_2/DataModel/ExamplesofUsage/eu_cs34j.html">online docs</a> * @param N - Northing value to convert * @param E - Easting value to convert - * @param lon_zero - Longitude value of origin (lov) * @return lon,lat - longitude,latitude, array * --- 683,691 ---- * For a quick look online see:<br> * <a href="http://www.posc.org/Epicentre.2_2/DataModel/ExamplesofUsage/eu_cs34j.html">online docs</a> + * + * TODO verify Easting and northing with respect to Meteorological definition + * * @param N - Northing value to convert * @param E - Easting value to convert * @return lon,lat - longitude,latitude, array * *************** *** 624,632 **** * */ ! public double[] reverseTrans(double N, double E, double lon_zero) { // To follow the applied math as simple as possible we map // input variables to theese values ! double lambdaZero = Math.toRadians(lon_zero); double[] returnValues = new double[2]; --- 694,702 ---- * */ ! public double[] reverseTrans(double N, double E) { // To follow the applied math as simple as possible we map // input variables to theese values ! double lambdaZero = 0; double[] returnValues = new double[2]; *************** *** 674,677 **** --- 744,819 ---- return returnValues; } + + /** + * Get a string representation of this GDS. + * @return string representation of this GDS + */ + public String toString() + { + + String str = " GDS section:\n "; + + str += " " + this.grid_type_string; + + + str += " (" + this.grid_nx + "x" + this.grid_ny + ")\n "; + str += " 1st point: Lat: " + this.grid_lat1; + str += " Lon: " + this.grid_lon1 +"\n "; + str += " Grid start X: " + this.grid_startx+ "m; "; + str += " Y: " + this.grid_starty+ "m;\n "; + str += " Grid length: X-Direction " + this.grid_dx + "m; "; + str += " Y-Direction: " + this.grid_dy + "m\n "; + str += " Orientation - East longitude parallel to y-axis: " ; + str += this.getGridLov() + "\n "; + str += " Resolution and Component Flags: \n "; + if ((this.grid_mode & 128) == 128) + { + str += " Direction increments given \n "; + } + else + { + str += " Direction increments not given \n "; + } + if ((this.grid_mode & 64) == 64){ + str += " Earth assumed oblate spheroid 6378.16 km at equator, " + + " 6356.775 km at pole, f=1/297.0\n "; + } + else{ + str += " Earth assumed spherical with radius = 6367.47 km \n "; + } + if ((this.grid_mode & 8) == 8){ + str += " u and v components are relative to the grid \n "; + } + else{ + str += " u and v components are relative to easterly and " + + "northerly directions \n "; + } + str += " Scanning mode: \n " ; + if ((this.grid_scan & 128) == 128){ + str += " Points scan in the -i direction \n "; + } + else{ + str += " Points scan in the +i direction \n "; + } + if ((this.grid_scan & 64) == 64){ + str += " Points scan in the +j direction \n "; + } + else{ + str += " Points scan in the -j direction \n "; + } + if ((this.grid_scan & 32) == 32){ + str += " Adjacent points in j direction are consecutive \n "; + } + else{ + str += " Adjacent points in i direction are consecutive\n"; + } + str += " proj_center flag: " + grid_proj_center + "\n"; + str += " latitude_ts: " + getLatitudeTrueScale() + "\n"; + str += " center_lon: " + getGridCenterLon() + "\n"; //=lov + str += " center_lat: " + getGridCenterLat()+ "\n"; + + return str; + } + } |
From: Peter G. <fr...@us...> - 2006-08-31 11:34:18
|
Update of /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib/gds In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv31262/src/net/sourceforge/jgrib/gds Modified Files: package.html Log Message: Added documentation about differences between geodetic and meteorologic coordinate definitions Index: package.html =================================================================== RCS file: /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib/gds/package.html,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** package.html 12 Aug 2006 21:49:30 -0000 1.2 --- package.html 31 Aug 2006 11:34:12 -0000 1.3 *************** *** 1,2 **** --- 1,4 ---- + <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" + "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> *************** *** 28,32 **** </head> <body bgcolor="white"> ! Provides capability to handle differen grids <!-- break --> <br/> <h2>Very short introduction</h2> --- 30,34 ---- </head> <body bgcolor="white"> ! Provides capability to handle different grids <!-- break --> <br/> <h2>Very short introduction</h2> *************** *** 41,53 **** </ul> <h2>Extentions instructions</h2> In case you want to extend this library with capability of reading a new type of grid you will subclass the GribRecordGDS class and modify the GribGDSFactory class to handle the new type of grid. ! <p> Facts you will need: <ul> <li>The GDS facillity is using the <b>Template design pattern</b></li> ! <li>You will handle the bitStream input as shown in the documentation for your grid type/li> ! <li>Basically you could copy the constructor from the GribGDSLatLon class and extend it./li> </ul> --- 43,80 ---- </ul> + <h2>Geodetic contra Meteorological definitions</h2> + When working with coordinate transformation alogritms it must be stated, that the general coordinate + system udes by the geodetist is different from the coordinate system defined by the meteorologist. + Thus the algoritms implemented must adapt the meteorological definition given the fact, that GRIB is + a meteorological standard file format. + <p/> + The following table shows the differens with the polar stereographic projection as example. + <table border="1" cellspacing="3" align="center"> + <tr> + <td>Direction</td> + <td>Geodetic</td> + <td>Meteorologic</td> + </tr> + <tr> + <td>Easting</td> + <td align="center">Y</td> + <td align="center">X</td> + </tr> + <tr> + <td>Northing</td> + <td align="center">X</td> + <td align="center">Y</td> + </tr> + </table> + <h2>Extentions instructions</h2> In case you want to extend this library with capability of reading a new type of grid you will subclass the GribRecordGDS class and modify the GribGDSFactory class to handle the new type of grid. ! <p/> Facts you will need: <ul> <li>The GDS facillity is using the <b>Template design pattern</b></li> ! <li>You will handle the bitStream input as shown in the documentation for your grid type </li> ! <li>Basically you could copy the constructor from the GribGDSLatLon class and extend it. </li> </ul> |
From: Peter G. <fr...@us...> - 2006-08-31 11:33:24
|
Update of /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv30848/src/net/sourceforge/jgrib Modified Files: GribRecordGDS.java Log Message: Added new abstract methods to GribRecordGDS to allow users to specify the grid precisely Index: GribRecordGDS.java =================================================================== RCS file: /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib/GribRecordGDS.java,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** GribRecordGDS.java 16 Aug 2006 14:38:11 -0000 1.12 --- GribRecordGDS.java 31 Aug 2006 11:33:18 -0000 1.13 *************** *** 78,81 **** --- 78,89 ---- /** * Central Scale Factor. Defaults to 1.0 + * + * This factor refers to the ellipsoid distortion + * allong the meridians, thus you should not replace + * it with map scale factors like: 1:10000 or whatever + * is uses to produce a perfect fit to a specific map + * size. + * + * <b>!!! NOT map scale factor!!!</b> */ protected static double SCALE_FACTOR = 1.0; *************** *** 479,483 **** /** ! * Table J.Resolution and Component Flags, * bit 5 (from left) = 2^(8-5) = 8 = 0x08 : * false = u and v components are relative to east, north --- 487,491 ---- /** ! * Table 7. Resolution and Component Flags, * bit 5 (from left) = 2^(8-5) = 8 = 0x08 : * false = u and v components are relative to east, north *************** *** 516,520 **** return grid_rotang; } ! /** * Get x-increment/distance between two grid points. --- 524,552 ---- return grid_rotang; } ! ! /** ! * Set definitions needed to calculate precise values for x-direction grid points. ! * ! * Based upon the value of startx and endx grid dx value is calculated and signed ! * acoording to the state of positiveDX. ! * ! * @param startx - Start point of grid in X coordinate direction ! * @param endx - End point of grid in X coordinate direction ! * @param positiveDX - Defines if DX is positive or negative ! */ ! public abstract void setGridXCoords(double startx, double endx, boolean positiveDX); ! ! /** ! * Set definitions needed to calculate precise values for y-direction grid points. ! * ! * Based upon the value of startx and endx grid dy value is calculated and signed ! * acoording to the state of positiveDY. ! * ! * @param starty - Start point of grid in Y coordinate direction ! * @param endy - End point of grid in Y coordinate direction ! * @param positiveDY - Defines if DY is positive or negative ! */ ! public abstract void setGridYCoords(double starty, double endy, boolean positiveDY); ! /** * Get x-increment/distance between two grid points. |
From: Peter G. <fr...@us...> - 2006-08-31 11:33:24
|
Update of /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib/gds In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv30848/src/net/sourceforge/jgrib/gds Modified Files: GribGDSLambert.java GribGDSRotLatLon.java GribGDSLatLon.java Log Message: Added new abstract methods to GribRecordGDS to allow users to specify the grid precisely Index: GribGDSRotLatLon.java =================================================================== RCS file: /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib/gds/GribGDSRotLatLon.java,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** GribGDSRotLatLon.java 12 Aug 2006 21:48:40 -0000 1.2 --- GribGDSRotLatLon.java 31 Aug 2006 11:33:18 -0000 1.3 *************** *** 239,247 **** public boolean isRotatedGrid() { ! // Implicit IF-THEN ! return grid_type == 10; } /** * Get delta-Lon between two grid points. * --- 239,280 ---- public boolean isRotatedGrid() { ! return true; } /** + * @see GribRecordGDS#setGridXCoords(double, double, boolean) + * + * @param startx - Longitude start value (degrees) + * @param endx - Longitude end value (degrees) + * @param positiveDX - true/false + * + */ + public void setGridXCoords(double startx, double endx, boolean positiveDX) { + this.grid_lon1 = startx; + double dx = Math.abs(endx - startx)/this.grid_nx; + if(!positiveDX) { + dx = -dx; + } + this.grid_dx = dx; + } + + /** + * @see GribRecordGDS#setGridYCoords(double, double, boolean) + * + * @param starty - Latitude start value (degrees) + * @param endy - Latitude end value (degrees) + * @param positiveDY - true/false + * + */ + public void setGridYCoords(double starty, double endy, boolean positiveDY) { + this.grid_lat1 = starty; + double dy = Math.abs(endy - starty)/this.grid_ny; + if(!positiveDY) { + dy = -dy; + } + this.grid_dy = dy; + } + + /** * Get delta-Lon between two grid points. * Index: GribGDSLatLon.java =================================================================== RCS file: /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib/gds/GribGDSLatLon.java,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** GribGDSLatLon.java 12 Aug 2006 21:48:40 -0000 1.2 --- GribGDSLatLon.java 31 Aug 2006 11:33:18 -0000 1.3 *************** *** 237,245 **** public boolean isRotatedGrid() { ! // Implicit IF-THEN ! return grid_type == 10; } /** * Get delta-Lon between two grid points. * --- 237,278 ---- public boolean isRotatedGrid() { ! return false; } /** + * @see GribRecordGDS#setGridXCoords(double, double, boolean) + * + * @param startx - Longitude start value (degrees) + * @param endx - Longitude end value (degrees) + * @param positiveDX - true/false + * + */ + public void setGridXCoords(double startx, double endx, boolean positiveDX) { + this.grid_lon1 = startx; + double dx = Math.abs(endx - startx)/this.grid_nx; + if(!positiveDX) { + dx = -dx; + } + this.grid_dx = dx; + } + + /** + * @see GribRecordGDS#setGridYCoords(double, double, boolean) + * + * @param starty - Latitude start value (degrees) + * @param endy - Latitude end value (degrees) + * @param positiveDY - true/false + * + */ + public void setGridYCoords(double starty, double endy, boolean positiveDY) { + this.grid_lat1 = starty; + double dy = Math.abs(endy - starty)/this.grid_ny; + if(!positiveDY) { + dy = -dy; + } + this.grid_dy = dy; + } + + /** * Get delta-Lon between two grid points. * Index: GribGDSLambert.java =================================================================== RCS file: /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib/gds/GribGDSLambert.java,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** GribGDSLambert.java 12 Aug 2006 21:48:40 -0000 1.3 --- GribGDSLambert.java 31 Aug 2006 11:33:18 -0000 1.4 *************** *** 297,300 **** --- 297,335 ---- } + + /** + * @see GribRecordGDS#setGridXCoords(double, double, boolean) + * + * @param startx - Northing start value (meters) + * @param endx - Northing end value (meters) + * @param positiveDX - true/false + * + */ + public void setGridXCoords(double startx, double endx, boolean positiveDX) { + this.grid_startx = startx; + double dx = Math.abs(endx - startx)/this.grid_nx; + if(!positiveDX) { + dx = -dx; + } + this.grid_dx = dx; + } + + /** + * @see GribRecordGDS#setGridYCoords(double, double, boolean) + * + * @param starty - Easting start value (meters) + * @param endy - Easting end value (meters) + * @param positiveDY - true/false + * + */ + public void setGridYCoords(double starty, double endy, boolean positiveDY) { + this.grid_starty = starty; + double dy = Math.abs(endy - starty)/this.grid_ny; + if(!positiveDY) { + dy = -dy; + } + this.grid_dy = dy; + } + /** * Get x-increment/distance between two grid points. *************** *** 657,660 **** --- 692,697 ---- } + + } |
From: Peter G. <fr...@us...> - 2006-08-22 21:41:43
|
Update of /cvsroot/jgrib/jgrib/doc In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv4568/doc Added Files: grib_octet17.html Log Message: Added documentation about matematical background of GDS octet 17 --- NEW FILE: grib_octet17.html --- <!-- $Id: --> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-1252"/> <meta http-equiv="Content-Language" content="en-gb"/> <title>Extended documentation of GRIB GDS octet 17</title> </head> <body> <center> <h1>Extended documentation of GDS octet 17</h1> </center> This is a extention of the GRIB documentation available online at NCEP as <a href="http://www.nco.ncep.noaa.gov/pmb/docs/on388/table7.html">table7</a> <br/> The extention is mainly about how to understand the meaning of <b>bit 2</b> in the <b>GDS octet 17</b> <br/> <h3>Current information:</h3> <center> <table border="1" cellspacing="0" cellpadding="3" width="80%"> <tr> <th>BIT</th> <th>VALUE</th> <th>MEANING</th> </tr> <tr> <td rowspan="2"><center>2</center></td> <td><center>0</center></td> <td align="left">Earth assumed spherical with radius = 6367.47 km</td> </tr> <tr> <td><center>1</center></td> <td align="left">Earth assumed oblate spheroid with size as determined by IAU in 1965:<br/> 6378.160 km, 6356.775 km, f = 1/297.0</td> </tr> </table> </center> <h3>Correct information:</h3> <center> <table border="1" cellspacing="0" cellpadding="3" width="80%"> <tr> <th>BIT</th> <th>VALUE</th> <th>MEANING</th> </tr> <tr> <td rowspan="2"><center>2</center></td> <td><center>0</center></td> <td align="left">Earth assumed spherical with radius = 6367.472 km </td> </tr> <tr> <td><center>1</center></td> <td align="left">Earth assumed oblate spheroid with size as determined by IAU in 1968:<br/> 6378.160 km, 6356.775 km, f = 1/298.25</td> </tr> </table> </center> <h3>Matematical background</h3> See: <a href="http://en.wikipedia.org/wiki/Earth_radius#Meridional_Earth_radius"> Earth_radius - Meriditional earth radius </a> <br/> If you calculate the <b>Meriditional earth radius</b> based upon the ellipsoid or oblate spheroid values from <a href="http://www.iau.org/">IAU</a> (The International Astronomical Union) released in <b>1968</b> you will have:<br/> <ul> <li>Req = 6378160 (m)</li> <li>Rp = 6356775 (m)</li> <li>M_r = 6367471.998 (m)</li> </ul> The best online matematical references you will find here:<br/> <dl> <dd>- <a href="http://mathworld.wolfram.com/">Wolfram Mathworld</a></dd> <dd>- <a href="http://mathworld.wolfram.com/StereographicProjection.html"> Polar Stereographic projection (spheroid) </a></dd> <dd>- <a href="http://mathworld.wolfram.com/OblateSpheroid.html"> Oblate spheroid or Ellipsoid </a></dd> <dd>- <a href="http://mathworld.wolfram.com/ConformalLatitude.html"> Conformal latitude </a></dd> </dl> <h3>Ellipsoid reference data</h3> See: <a href="http://maic.jmu.edu/sic/standards/ellipsoid.htm">ellipsoid.htm</a> </body> </html> |
From: Peter G. <fr...@us...> - 2006-08-16 14:44:06
|
Update of /cvsroot/jgrib/jgrib In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv9258 Modified Files: ChangeLog Log Message: Changes related to GribGDSPolarStereo and GribRecordGDS Index: ChangeLog =================================================================== RCS file: /cvsroot/jgrib/jgrib/ChangeLog,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** ChangeLog 12 Aug 2006 21:50:16 -0000 1.12 --- ChangeLog 16 Aug 2006 14:44:00 -0000 1.13 *************** *** 8,11 **** --- 8,25 ---- CVS history. + 2006-08-16 Peter Gylling <frv_peg at users.sourceforge.net> + - Added static methods to GribRecordGDS to allow users to + set reference ellipsoid, false origin and scale factor. + Values needed to calculate correctly from lat/lon to and + from polar stereographic projection. + - Added methods to GribGDSPolarStereo to allow users to + finely control the grid. Added forwardTrans() and reversTrans() + methods to calculate to and from lat/lon. + - Currently this is only validated against the OSISAF sample file + supplied with JGRIB. To allow for better validation of the + applied algoritms more sample files is needed. + - Until further validation has been done the bug in getGridCoords() + is considered done. + 2006-08-12 Peter Gylling <frv_peg at users.sourceforge.net> - Applied template design pattern to GribRecordGDS class to |
From: Peter G. <fr...@us...> - 2006-08-16 14:38:16
|
Update of /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib/gds In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv7219/src/net/sourceforge/jgrib/gds Modified Files: GribGDSPolarStereo.java Log Message: Added static variables and static methods to set reference values concerning ellipsoid, scale factor and false origin - Values needed before a GDS of type Polar Stereographic is read. - Extention to grib standard. Index: GribGDSPolarStereo.java =================================================================== RCS file: /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib/gds/GribGDSPolarStereo.java,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** GribGDSPolarStereo.java 15 Aug 2006 20:54:57 -0000 1.5 --- GribGDSPolarStereo.java 16 Aug 2006 14:38:11 -0000 1.6 *************** *** 50,58 **** * A class that represents the grid definition section (GDS) of a GRIB record. * * @author Benjamin Stark * @author Capt Richard D. Gonzalez ! * @version 2.0 ! * ! * Modified 4 Sep 02 to be constructed by GribGDSFactory - Richard D. Gonzalez */ --- 50,58 ---- * A class that represents the grid definition section (GDS) of a GRIB record. * + * Handles the grids defined in the Polar Stereographic projection. + * * @author Benjamin Stark * @author Capt Richard D. Gonzalez ! * @author Peter Gylling - frv_peg at users.sourceforge.net */ *************** *** 70,121 **** /** * starting x value using this projection. ! * This is not a Longitude, but an x value based on the projection */ protected double grid_startx; /** ! * starting y value using this projection. ! * This is not a Latitude, but a y value based on the projection ! */ ! protected double grid_starty; ! ! /** ! * Latitude of Center - assumed 60 N or 60 S based on note 2 of table D ! */ ! protected double latitude_ts = 60.0; //true scale ! ! /** ! * Central Scale Factor. Assumed 1.0 ! */ ! private double SCALE_FACTOR = 1.0; ! ! /** ! * Semimajor axis of ellipsoid - Defaults to WGS84 ! * Requires value in meters! */ ! private double semiMajorAxis = 6378137; /** ! * Inverse flattening of ellipsoide - Defaults to WGS84 */ ! private double inverseFlattening = 298.25722; ! /** ! * Ellipsoide eccentricity - Defaults to WGS84 */ ! private double eccentricity = 0.0; /** ! * False Easting is used to manipulate Easting values to be positive ! */ ! private double falseEasting = 0.0; ! ! /** ! * False Northing is used to manipulate Northing values to be positive */ ! private double falseNorthing = 0.0; - // *** constructors ******************************************************* --- 70,101 ---- /** * starting x value using this projection. ! * This is not a longitude, but a Northing value based on the projection */ protected double grid_startx; /** ! * End x value using this projection. ! * This is not a logitude, but a Northing value base on the projection */ ! protected double grid_endx; /** ! * starting y value using this projection. ! * This is not a Latitude, but an Easting value based on the projection */ ! protected double grid_starty; ! /** ! * End y value using this projection. ! * This is not a latitude, but an Easting value base on the projection */ ! protected double grid_endy; /** ! * Latitude of Center - assumed 60 N or 60 S based on note 2 of table D */ ! protected double latitude_ts = 60.0; //true scale // *** constructors ******************************************************* *************** *** 390,455 **** } - - // /** - // * Prep the projection and determine the starting x and y values based on - // * Lat1 and Lon1 relative to the origin for this grid. - // * - // * adapted from J.P. Snyder, Map Projections - A Working Manual, - // * U.S. Geological Survey Professional Paper 1395, 1987 - // * Maintained his symbols, so the code matches his work. - // * Somewhat hard to follow, if interested, suggest looking up quick reference - // * at http://mathworld.wolfram.com/LambertConformalConicProjection.html - // * - // * Origin is where Lov intersects 60 degrees (from note 2 of Table D) north - // * or south (determined by bit 1 of the Projection Center Flag). - // * - // * This assumes a central scale factor of 1. - // * - // */ - // private void prepProjection() - // { - // double k; - // // peg - variables pi2 and pi4 never used - // //double pi2; - // //double pi4; - // double cosLat1; - // double sinLat1; - // double cos60; - // double sin60; - // double dLonr; - // - // cosLat1 = Math.cos(Math.toRadians(grid_lat1)); - // sinLat1 = Math.sin(Math.toRadians(grid_lat1)); - // cos60 = Math.cos(Math.toRadians(latitude_ts)); - // sin60 = Math.sin(Math.toRadians(latitude_ts)); - // //dLonr = Math.toRadians(grid_lon1 - grid_lon2); //lon2 is lov - // dLonr = Math.toRadians(grid_lon1); //lon2 is lov - // - // k = 2.0 * SCALE_FACTOR / - // (1 + (sin60 * sinLat1) + cos60 * cosLat1 * Math.cos(dLonr)); - // grid_startx = EARTH_RADIUS * k * cosLat1 * Math.sin(dLonr); - // grid_starty = EARTH_RADIUS * k * - // ((cos60*sinLat1) - (sin60 * cosLat1 * Math.cos(dLonr))); - // - // } - - - /** * Get grid coordinates in longitude/latitude * ! * adapted from J.P. Snyder, Map Projections - A Working Manual, ! * U.S. Geological Survey Professional Paper 1395, 1987 ! * Maintained his symbols, so the code matches his work. ! * Somewhat hard to follow, if interested, suggest looking up quick reference ! * at http://mathworld.wolfram.com/StereographicProjection.html ! * ! * assumes scale factor of 1.0 * ! * rdg - may not be correct yet - did not align with display software I ! * was using, but they implemented using a center point, vice LOV ! * TODO verify projection implementation * ! * @see net.sourceforge.jgrib.GribRecordGDS#getGridCoords() * @return longitide/latitude as doubles */ --- 370,389 ---- } /** * Get grid coordinates in longitude/latitude * ! * This method is returning longitude/latitude pairs based upon ! * the forwardTrans() and reverseTrans() methods. If you ! * require precise data please set the grid coordinates using the ! * setXCoords() and setYCoords() methods. * ! * TODO verify projection implementation - Sample files needed * ! * @see net.sourceforge.jgrib.GribRecordGDS#getGridCoords() ! * @see GribGDSPolarStereo#forwardTrans(double, double, double) ! * @see GribGDSPolarStereo#reverseTrans(double, double, double) ! * @see GribGDSPolarStereo#setXCoords(double, double, boolean) ! * @see GribGDSPolarStereo#setYCoords(double, double, boolean) ! * * @return longitide/latitude as doubles */ *************** *** 457,489 **** { int count = 0; - //double rho, c, cosC, sinC, cos60, sin60, lon, lat, x, y; double x,y; double[] coords = new double[grid_nx * grid_ny * 2]; - //cos60 = Math.cos(Math.toRadians(latitude_ts)); - //sin60 = Math.sin(Math.toRadians(latitude_ts)); for (int j = 0; j < grid_ny; j++) { - //y = grid_starty + grid_dy*j; y = grid_starty + grid_dy*j; for (int i = 0; i < grid_nx; i++) { x = grid_startx + grid_dx*i; - - // rho = Math.sqrt(x*x + y*y); - // c = 2.0 * Math.atan(rho/(2.0 * EARTH_RADIUS * SCALE_FACTOR)); - // cosC = Math.cos(Math.toRadians(c)); - // sinC = Math.sin(Math.toRadians(c)); - // - // lat = Math.asin(cosC * sin60 + (y * sinC * cos60 / rho)); - // lon = grid_lon2 + Math.atan(x * sinC / (rho * cos60 * cosC - y * cos60 * sinC)); - // - // // move x-coordinates to the range -180..180 - // if (lon >= 180.0) lon = lon - 360.0; - // if (lon < -180.0) lon = lon + 360.0; - // if (lat > 90.0 || lat < -90.0) - // { - // System.err.println("GribGDSPolarStereo: latitude out of range (-90 to 90)."); - // } double[] latLon = this.reverseTrans(x,y,this.grid_lon2); coords[count++] = latLon[0]; --- 391,403 ---- *************** *** 495,498 **** --- 409,413 ---- /** + * Get grid start point - Northing value * @return Value of x start point as double */ *************** *** 503,506 **** --- 418,422 ---- /** + * Get grid start point - Easting value * @return Value of y start point as double */ *************** *** 512,516 **** /** * Get a string representation of this GDS. - * TODO - ensure this returns PS specific info - probably still a copy of LC * @return string representation of this GDS */ --- 428,431 ---- *************** *** 583,642 **** /** ! * Set the reference values of the ellipsoid of choice when ! * calculating the position of lat/lon or X,Y values in the ! * polar stereographic projection. * ! * Defaults to WGS84:<br> ! * - semiMajorAxis = 6378137 (meters)<bt> ! * - inverseFlattening = 298.25722<br> ! * - see: <a href="http://maic.jmu.edu/sic/standards/ellipsoid.htm">ellipsoid.htm</a> * ! * @param semiMajorAxis - The semimajor or equatorial radius of this ! * reference ellipsoid, in meters. ! * @param inverseFlattening - The reciprocal of the ellipticity or flattening ! * of this reference ellipsoid (dimensionless). */ ! public void setReferenceEllipsoid (double semiMajorAxis, double inverseFlattening) { ! ! // Set semiMajorAxis or equatorial radius ! this.semiMajorAxis = semiMajorAxis; ! ! // Set invers flattening ! this.inverseFlattening = inverseFlattening; ! ! // Calculate eccentricity ! double f = 1.0/this.inverseFlattening; ! this.eccentricity = Math.sqrt(f*(2.0-f)); } /** ! * Set scaleFactor to use with your mapping region - Defaults to 1.0 * ! * @param scaleFactor - Mapping scale factor ! */ ! public void setScaleFactor (double scaleFactor) { ! this.SCALE_FACTOR = scaleFactor; ! } ! ! /** ! * Set false origin of grid, so Easting and Northing values is ! * positive. Defaults to zero ! * @param falseEasting ! * @param falseNorthing */ ! public void setFalseOrigin(double falseEasting, double falseNorthing) { ! this.falseEasting = falseEasting; ! this.falseNorthing = falseNorthing; } - /** ! * see: <a href="http://www.posc.org/Epicentre.2_2/DataModel/ExamplesofUsage/eu_cs34j.html">online docs</a> ! * @param lat ! * @param lon ! * @param lov ! * @return northing,easting */ ! public double[] forwardTrans (double lat, double lon, double lov) { // To follow the applied math as simple as possible we map --- 498,570 ---- /** ! * To reach a higher degree of precission you can provide the ! * starting and ending northing values, so the distance between ! * points is precisely the value mathing the grid distance. * ! * This is particular helpfull, when we have to rely upon accuracy ! * from the grib files, where the precission usually isn't high enough ! * to provide a precise grid. * ! * @param start_x - Northing start value ! * @param end_x - Northing end value ! * @param positiveDX - true/false */ ! public void setXCoords (double start_x, double end_x, boolean positiveDX) { ! this.grid_startx = start_x; ! this.grid_endx = end_x; ! double dx = Math.abs(end_x - start_x)/this.grid_nx; ! if(!positiveDX) { ! dx = -dx; ! } ! this.grid_dx = dx; } /** ! * To reach a higher degree of precission you can provide the ! * starting and ending easting values, so the distance between ! * points is precisely the value mathing the grid distance. * ! * This is particular helpfull, when we have to rely upon accuracy ! * from the grib files, where the precission usually isn't high enough ! * to provide a precise grid. ! * ! * @param start_y - Easting start value ! * @param end_y - Easting end value ! * @param positiveDY - true/false */ ! public void setYCoords (double start_y, double end_y, boolean positiveDY) { ! this.grid_starty = start_y; ! this.grid_endy = end_y; ! double dy = Math.abs(end_y - start_y)/this.grid_ny; ! if(!positiveDY) { ! dy = -dy; ! } ! this.grid_dy = dy; } /** ! * Calculates Easting and Northing values based on geodetic latitude and ! * longitude values. ! * ! * Implementation is based upon the formulas: 5.102 and 5.105 pages 97-99 in ! * the book:<br> ! * Map Projections by Addler and Richardus<br> ! * Published by New Holland, ISBN: 0720450071<br> ! * ! * NOTE:<br> ! * Requires knowledge of involved ellipsoid to work correctly. You can force ! * a specific ellipsoid by using static mehods of GribRecordGDS. ! * <br> ! * For a quick look online see:<br> ! * <a href="http://www.posc.org/Epicentre.2_2/DataModel/ExamplesofUsage/eu_cs34j.html">online docs</a> ! * @param lat - latitude value to convert ! * @param lon - longitude value to convert ! * @param lon_zero - longitude value of origin (lov) ! * @return northing,easting - array ! * ! * @see net.sourceforge.jgrib.GribRecordGDS#setReferenceEllipsoid(double, double) ! * @see net.sourceforge.jgrib.GribRecordGDS#setReferenceEllipsoidAxis(double, double) */ ! public double[] forwardTrans (double lat, double lon, double lon_zero) { // To follow the applied math as simple as possible we map *************** *** 644,656 **** double phi = Math.toRadians(lat); double lambda = Math.toRadians(lon); ! double lambdaZero = Math.toRadians(lov); double[] returnValues = new double[2]; // Helper variables: ! double eSinPhi = this.eccentricity * Math.sin(phi); double tHelper = (1-eSinPhi)/(1+eSinPhi); ! tHelper = Math.pow(tHelper, (this.eccentricity/2.0)); ! double rhoHelper = Math.pow((1+this.eccentricity), (1+this.eccentricity)) * ! Math.pow((1-this.eccentricity), (1-this.eccentricity)); // Calculate t --- 572,584 ---- double phi = Math.toRadians(lat); double lambda = Math.toRadians(lon); ! double lambdaZero = Math.toRadians(lon_zero); double[] returnValues = new double[2]; // Helper variables: ! double eSinPhi = GribRecordGDS.eccentricity * Math.sin(phi); double tHelper = (1-eSinPhi)/(1+eSinPhi); ! tHelper = Math.pow(tHelper, (GribRecordGDS.eccentricity/2.0)); ! double rhoHelper = Math.pow((1+GribRecordGDS.eccentricity), (1-GribRecordGDS.eccentricity)) * ! Math.pow((1-GribRecordGDS.eccentricity), (1+GribRecordGDS.eccentricity)); // Calculate t *************** *** 658,670 **** // Calculate rho ! double rho = (2*this.semiMajorAxis*this.SCALE_FACTOR*t) / Math.sqrt(rhoHelper); // Calculate E - Easting ! double E = this.falseEasting + (rho * Math.sin(lambda - lambdaZero)); // Calculate N - Northing ! double N = this.falseNorthing - (rho * Math.cos(lambda - lambdaZero)); ! ! //System.out.println("(lat,lon) = ("+lat+","+lon+") -> (E,N) = ("+E+","+N+")"); // Add values to return argument --- 586,596 ---- // Calculate rho ! double rho = (2*GribRecordGDS.semiMajorAxis*GribRecordGDS.SCALE_FACTOR*t) / Math.sqrt(rhoHelper); // Calculate E - Easting ! double E = GribRecordGDS.falseEasting + (rho * Math.sin(lambda - lambdaZero)); // Calculate N - Northing ! double N = GribRecordGDS.falseNorthing - (rho * Math.cos(lambda - lambdaZero)); // Add values to return argument *************** *** 677,710 **** /** ! * see: <a href="http://www.posc.org/Epicentre.2_2/DataModel/ExamplesofUsage/eu_cs34j.html">online docs</a> ! * @param N ! * @param E ! * @param lov ! * @return lon,lat */ ! public double[] reverseTrans(double N, double E, double lov) { // To follow the applied math as simple as possible we map // input variables to theese values ! double lambdaZero = Math.toRadians(lov); double[] returnValues = new double[2]; // Define helper variables ! double tHelper = Math.pow((1 + this.eccentricity), (1 + this.eccentricity)) * ! Math.pow((1 - this.eccentricity), (1 - this.eccentricity)); tHelper = Math.sqrt(tHelper); // Used to calculate phi ! double e2 = Math.pow(this.eccentricity, 2); ! double e4 = Math.pow(this.eccentricity, 4); ! double e6 = Math.pow(this.eccentricity, 6); ! double e8 = Math.pow(this.eccentricity, 8); // Calculate rho ! double rho = Math.sqrt(Math.pow((E - this.falseEasting), 2) + ! Math.pow((N - this.falseNorthing),2)); // Calculate t ! double t = (rho*tHelper) / (2 * this.semiMajorAxis * this.SCALE_FACTOR); // Calculate chi --- 603,651 ---- /** ! * Calculates latitude and longitude based upon Easting, Northing values. ! * ! * NOTE:<br> ! * This method is an exact inverse of the forwardTrans() method. Thus it's ! * not validated to work as stand alone routine. ! * <br> ! * NOTE:<br> ! * Requires knowledge of involved ellipsoid to work correctly. You can force ! * a specific ellipsoid by using static mehods of GribRecordGDS. ! * <br> ! * For a quick look online see:<br> ! * <a href="http://www.posc.org/Epicentre.2_2/DataModel/ExamplesofUsage/eu_cs34j.html">online docs</a> ! * @param N - Northing value to convert ! * @param E - Easting value to convert ! * @param lon_zero - Longitude value of origin (lov) ! * @return lon,lat - longitude,latitude, array ! * ! * @see net.sourceforge.jgrib.GribRecordGDS#setReferenceEllipsoid(double, double) ! * @see net.sourceforge.jgrib.GribRecordGDS#setReferenceEllipsoidAxis(double, double) ! * */ ! public double[] reverseTrans(double N, double E, double lon_zero) { // To follow the applied math as simple as possible we map // input variables to theese values ! double lambdaZero = Math.toRadians(lon_zero); double[] returnValues = new double[2]; // Define helper variables ! double tHelper = Math.pow((1 + GribRecordGDS.eccentricity), (1 - GribRecordGDS.eccentricity)) * ! Math.pow((1 - GribRecordGDS.eccentricity), (1 + GribRecordGDS.eccentricity)); tHelper = Math.sqrt(tHelper); // Used to calculate phi ! double e2 = Math.pow(GribRecordGDS.eccentricity, 2); ! double e4 = Math.pow(GribRecordGDS.eccentricity, 4); ! double e6 = Math.pow(GribRecordGDS.eccentricity, 6); ! double e8 = Math.pow(GribRecordGDS.eccentricity, 8); // Calculate rho ! double rho = Math.sqrt(Math.pow((E - GribRecordGDS.falseEasting), 2) + ! Math.pow((N - GribRecordGDS.falseNorthing),2)); // Calculate t ! double t = (rho*tHelper) / (2 * GribRecordGDS.semiMajorAxis * GribRecordGDS.SCALE_FACTOR); // Calculate chi *************** *** 718,727 **** // Calculate lambda ! double lambda = lambdaZero + Math.atan((E - this.falseEasting)/ ! (this.falseNorthing - N)); ! System.out.println("(lambda,phi) = ("+lambda+","+phi+")"); // Return values as degrees ! double lon = Math.toDegrees(lambda)-180.0; double lat = Math.toDegrees(phi); // Add values to return argument --- 659,669 ---- // Calculate lambda ! double lambda = lambdaZero + Math.atan((E - GribRecordGDS.falseEasting)/ ! (GribRecordGDS.falseNorthing - N)); ! // Return values as degrees ! double lon = Math.toDegrees(lambda)-180; double lat = Math.toDegrees(phi); + // Add values to return argument |
From: Peter G. <fr...@us...> - 2006-08-16 14:38:16
|
Update of /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv7219/src/net/sourceforge/jgrib Modified Files: GribRecordGDS.java Log Message: Added static variables and static methods to set reference values concerning ellipsoid, scale factor and false origin - Values needed before a GDS of type Polar Stereographic is read. - Extention to grib standard. Index: GribRecordGDS.java =================================================================== RCS file: /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib/GribRecordGDS.java,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** GribRecordGDS.java 12 Aug 2006 22:01:18 -0000 1.11 --- GribRecordGDS.java 16 Aug 2006 14:38:11 -0000 1.12 *************** *** 50,54 **** --- 50,59 ---- * grid. This feature is required to supply backward compability in the same time * as we want to be capable of extending the library with more types of grids. + * <p> + * Users should be aware, that the static methods of this class is an extention + * of the GRIB standard, which allows for more precise calculations of latitude + * and longitude from ie. the polar stereographic projection. * + * The lat/lon and rotated lat/lon grid will totally ignore theese features. * <p> * Further documentation: *************** *** 70,73 **** --- 75,115 ---- */ protected final double EARTH_RADIUS=6367470; + + /** + * Central Scale Factor. Defaults to 1.0 + */ + protected static double SCALE_FACTOR = 1.0; + + /** + * Semimajor axis of ellipsoid - Defaults to WGS84 + * Requires value in meters! + */ + protected static double semiMajorAxis = 6378137; + + /** + * Semiminor axis of ellipsoid - Defaults to WGS84 + * Requires value in meters! + */ + protected static double semiMinorAxis = 6356752.3140; + + /** + * Inverse flattening of ellipsoide - Defaults to WGS84 + */ + protected static double inverseFlattening = 298.25722; + + /** + * Ellipsoide eccentricity - Defaults to WGS84 + */ + protected static double eccentricity = 0.0818191913; + + /** + * False Easting is used to manipulate Easting values to be positive + */ + protected static double falseEasting = 0.0; + + /** + * False Northing is used to manipulate Northing values to be positive + */ + protected static double falseNorthing = 0.0; /** *************** *** 217,221 **** --- 259,346 ---- } + // *** public static methods ********************************************** + + /** + * Set the reference values of the ellipsoid of choice when + * calculating the position of lat/lon or Easting,Northing values in the + * applied projections + * + * Defaults to WGS84:<br> + * - semiMajorAxis = 6378137 (meters)<bt> + * - inverseFlattening = 298.25722<br> + * - see: <a href="http://maic.jmu.edu/sic/standards/ellipsoid.htm">ellipsoid.htm</a> + * + * @param semiMajorAxis - The semimajor or equatorial radius of this + * reference ellipsoid, in meters. + * @param inverseFlattening - The reciprocal of the ellipticity or flattening + * of this reference ellipsoid (dimensionless). + */ + public static void setReferenceEllipsoid (double semiMajorAxis, double inverseFlattening) { + + // Set semiMajorAxis or equatorial radius + GribRecordGDS.semiMajorAxis = semiMajorAxis; + + // Set invers flattening + GribRecordGDS.inverseFlattening = inverseFlattening; + + // Calculate eccentricity + double f = 1.0/GribRecordGDS.inverseFlattening; + GribRecordGDS.eccentricity = Math.sqrt(f*(2.0-f)); + + // Calculate semiMinorAxis + GribRecordGDS.semiMinorAxis = semiMajorAxis - f*semiMajorAxis; + } + /** + * Set the reference values of the ellipsoid of choice when + * calculating the position of lat/lon or Easting,Northing values in the + * applied projections + * + * Defaults to WGS84:<br> + * - semiMajorAxis = 6378137 (meters)<bt> + * - inverseFlattening = 298.25722<br> + * - see: <a href="http://maic.jmu.edu/sic/standards/ellipsoid.htm">ellipsoid.htm</a> + * + * @param semiMajorAxis - The semimajor or equatorial radius of this + * reference ellipsoid, in meters. + * @param semiMinorAxis - The semiminor or polar radius of this + * reference ellipsoid, in meters + */ + public static void setReferenceEllipsoidAxis (double semiMajorAxis, double semiMinorAxis) { + + // Set semiMajorAxis or equatorial radius + GribRecordGDS.semiMajorAxis = semiMajorAxis; + + // Set semiMinorAxis or polar radius + GribRecordGDS.semiMinorAxis = semiMinorAxis; + + // Set invers flattening + GribRecordGDS.inverseFlattening = 1.0/((semiMajorAxis - semiMinorAxis) / semiMajorAxis); + + // Calculate eccentricity + double f = 1.0/GribRecordGDS.inverseFlattening; + GribRecordGDS.eccentricity = Math.sqrt(f*(2.0-f)); + } + + /** + * Set scaleFactor to use with your mapping region - Defaults to 1.0 + * + * @param scaleFactor - Mapping scale factor (k) + */ + public static void setScaleFactor (double scaleFactor) { + GribRecordGDS.SCALE_FACTOR = scaleFactor; + } + + /** + * Set false origin of grid, so Easting and Northing values is + * positive. Defaults to zero + * @param falseEasting + * @param falseNorthing + */ + public static void setFalseOrigin(double falseEasting, double falseNorthing) { + GribRecordGDS.falseEasting = falseEasting; + GribRecordGDS.falseNorthing = falseNorthing; + } + // *** public methods ************************************************************** |
From: Peter G. <fr...@us...> - 2006-08-15 20:55:05
|
Update of /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib/gds In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv19453/src/net/sourceforge/jgrib/gds Modified Files: GribGDSPolarStereo.java Log Message: Validated forwardTrans and reverseTrans. Grib values for lat1,lon1 is though not near as precise as needed to validate correct calculation for the total grid in a file. Index: GribGDSPolarStereo.java =================================================================== RCS file: /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib/gds/GribGDSPolarStereo.java,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** GribGDSPolarStereo.java 15 Aug 2006 13:05:19 -0000 1.4 --- GribGDSPolarStereo.java 15 Aug 2006 20:54:57 -0000 1.5 *************** *** 366,375 **** double[] xCoords = new double[grid_nx]; - double startx = grid_startx/1000.0; - double dx = grid_dx/1000.0; - for (int i = 0; i < grid_nx; i++) { ! double x = startx + i * dx; xCoords[i] = x; } --- 366,372 ---- double[] xCoords = new double[grid_nx]; for (int i = 0; i < grid_nx; i++) { ! double x = this.grid_startx + i * this.grid_dx; xCoords[i] = x; } *************** *** 385,394 **** double[] yCoords = new double[grid_ny]; - double starty = grid_starty/1000.0; - double dy = grid_dy/1000.0; - for (int j = 0; j < grid_ny; j++) { ! double y = starty + j * dy; yCoords[j] = y; } --- 382,388 ---- double[] yCoords = new double[grid_ny]; for (int j = 0; j < grid_ny; j++) { ! double y = this.grid_starty + j * this.grid_dy; yCoords[j] = y; } *************** *** 397,442 **** ! /** ! * Prep the projection and determine the starting x and y values based on ! * Lat1 and Lon1 relative to the origin for this grid. ! * ! * adapted from J.P. Snyder, Map Projections - A Working Manual, ! * U.S. Geological Survey Professional Paper 1395, 1987 ! * Maintained his symbols, so the code matches his work. ! * Somewhat hard to follow, if interested, suggest looking up quick reference ! * at http://mathworld.wolfram.com/LambertConformalConicProjection.html ! * ! * Origin is where Lov intersects 60 degrees (from note 2 of Table D) north ! * or south (determined by bit 1 of the Projection Center Flag). ! * ! * This assumes a central scale factor of 1. ! * ! */ ! private void prepProjection() ! { ! double k; ! // peg - variables pi2 and pi4 never used ! //double pi2; ! //double pi4; ! double cosLat1; ! double sinLat1; ! double cos60; ! double sin60; ! double dLonr; ! ! cosLat1 = Math.cos(Math.toRadians(grid_lat1)); ! sinLat1 = Math.sin(Math.toRadians(grid_lat1)); ! cos60 = Math.cos(Math.toRadians(latitude_ts)); ! sin60 = Math.sin(Math.toRadians(latitude_ts)); ! //dLonr = Math.toRadians(grid_lon1 - grid_lon2); //lon2 is lov ! dLonr = Math.toRadians(grid_lon1); //lon2 is lov ! ! k = 2.0 * SCALE_FACTOR / ! (1 + (sin60 * sinLat1) + cos60 * cosLat1 * Math.cos(dLonr)); ! grid_startx = EARTH_RADIUS * k * cosLat1 * Math.sin(dLonr); ! grid_starty = EARTH_RADIUS * k * ! ((cos60*sinLat1) - (sin60 * cosLat1 * Math.cos(dLonr))); ! ! } --- 391,436 ---- ! // /** ! // * Prep the projection and determine the starting x and y values based on ! // * Lat1 and Lon1 relative to the origin for this grid. ! // * ! // * adapted from J.P. Snyder, Map Projections - A Working Manual, ! // * U.S. Geological Survey Professional Paper 1395, 1987 ! // * Maintained his symbols, so the code matches his work. ! // * Somewhat hard to follow, if interested, suggest looking up quick reference ! // * at http://mathworld.wolfram.com/LambertConformalConicProjection.html ! // * ! // * Origin is where Lov intersects 60 degrees (from note 2 of Table D) north ! // * or south (determined by bit 1 of the Projection Center Flag). ! // * ! // * This assumes a central scale factor of 1. ! // * ! // */ ! // private void prepProjection() ! // { ! // double k; ! // // peg - variables pi2 and pi4 never used ! // //double pi2; ! // //double pi4; ! // double cosLat1; ! // double sinLat1; ! // double cos60; ! // double sin60; ! // double dLonr; ! // ! // cosLat1 = Math.cos(Math.toRadians(grid_lat1)); ! // sinLat1 = Math.sin(Math.toRadians(grid_lat1)); ! // cos60 = Math.cos(Math.toRadians(latitude_ts)); ! // sin60 = Math.sin(Math.toRadians(latitude_ts)); ! // //dLonr = Math.toRadians(grid_lon1 - grid_lon2); //lon2 is lov ! // dLonr = Math.toRadians(grid_lon1); //lon2 is lov ! // ! // k = 2.0 * SCALE_FACTOR / ! // (1 + (sin60 * sinLat1) + cos60 * cosLat1 * Math.cos(dLonr)); ! // grid_startx = EARTH_RADIUS * k * cosLat1 * Math.sin(dLonr); ! // grid_starty = EARTH_RADIUS * k * ! // ((cos60*sinLat1) - (sin60 * cosLat1 * Math.cos(dLonr))); ! // ! // } *************** *** 463,470 **** { int count = 0; ! double rho, c, cosC, sinC, cos60, sin60, lon, lat, x, y; double[] coords = new double[grid_nx * grid_ny * 2]; ! cos60 = Math.cos(Math.toRadians(latitude_ts)); ! sin60 = Math.sin(Math.toRadians(latitude_ts)); for (int j = 0; j < grid_ny; j++) --- 457,465 ---- { int count = 0; ! //double rho, c, cosC, sinC, cos60, sin60, lon, lat, x, y; ! double x,y; double[] coords = new double[grid_nx * grid_ny * 2]; ! //cos60 = Math.cos(Math.toRadians(latitude_ts)); ! //sin60 = Math.sin(Math.toRadians(latitude_ts)); for (int j = 0; j < grid_ny; j++) *************** *** 671,675 **** double N = this.falseNorthing - (rho * Math.cos(lambda - lambdaZero)); ! System.out.println("(lat,lon) = ("+lat+","+lon+") -> (E,N) = ("+E+","+N+")"); // Add values to return argument --- 666,670 ---- double N = this.falseNorthing - (rho * Math.cos(lambda - lambdaZero)); ! //System.out.println("(lat,lon) = ("+lat+","+lon+") -> (E,N) = ("+E+","+N+")"); // Add values to return argument *************** *** 708,712 **** // Calculate rho double rho = Math.sqrt(Math.pow((E - this.falseEasting), 2) + ! Math.pow((N -this.falseNorthing),2)); // Calculate t --- 703,707 ---- // Calculate rho double rho = Math.sqrt(Math.pow((E - this.falseEasting), 2) + ! Math.pow((N - this.falseNorthing),2)); // Calculate t *************** *** 724,739 **** // Calculate lambda double lambda = lambdaZero + Math.atan((E - this.falseEasting)/ ! (N - this.falseNorthing)); ! // Return values as degrees ! double lon = Math.toDegrees(-lambda); double lat = Math.toDegrees(phi); ! ! // move longitude-coordinate to the range -180..180 ! if (lon >= 180.0) lon = lon - 180.0; ! if (lon < -180.0) lon = lon + 180.0; ! ! System.out.println("(E,N) = ("+E+","+N+") -> (lat,lon) = ("+lat+","+lon+")"); ! // Add values to return argument returnValues[0] = lon; --- 719,728 ---- // Calculate lambda double lambda = lambdaZero + Math.atan((E - this.falseEasting)/ ! (this.falseNorthing - N)); ! System.out.println("(lambda,phi) = ("+lambda+","+phi+")"); // Return values as degrees ! double lon = Math.toDegrees(lambda)-180.0; double lat = Math.toDegrees(phi); ! // Add values to return argument returnValues[0] = lon; |
From: Peter G. <fr...@us...> - 2006-08-15 13:05:23
|
Update of /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib/gds In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv24155/src/net/sourceforge/jgrib/gds Modified Files: GribGDSPolarStereo.java Log Message: Added methods to do forward and inverse calculations lat/lon <--> polar stereographic projection. Not 100% testet yet, but forwardTrans and reverseTrans _IS_ working as expected Index: GribGDSPolarStereo.java =================================================================== RCS file: /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib/gds/GribGDSPolarStereo.java,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** GribGDSPolarStereo.java 14 Aug 2006 14:45:33 -0000 1.3 --- GribGDSPolarStereo.java 15 Aug 2006 13:05:19 -0000 1.4 *************** *** 81,93 **** /** * Central Scale Factor. Assumed 1.0 */ ! protected final double SCALE_FACTOR = 1.0; /** ! * Latitude of Center - assumed 60 N or 60 S based on note 2 of table D */ ! protected double latitude_ts = 60.0; //true scale // *** constructors ******************************************************* --- 81,121 ---- /** + * Latitude of Center - assumed 60 N or 60 S based on note 2 of table D + */ + protected double latitude_ts = 60.0; //true scale + + /** * Central Scale Factor. Assumed 1.0 */ ! private double SCALE_FACTOR = 1.0; ! ! /** ! * Semimajor axis of ellipsoid - Defaults to WGS84 ! * Requires value in meters! ! */ ! private double semiMajorAxis = 6378137; ! ! /** ! * Inverse flattening of ellipsoide - Defaults to WGS84 ! */ ! private double inverseFlattening = 298.25722; ! ! /** ! * Ellipsoide eccentricity - Defaults to WGS84 ! */ ! private double eccentricity = 0.0; ! ! /** ! * False Easting is used to manipulate Easting values to be positive ! */ ! private double falseEasting = 0.0; /** ! * False Northing is used to manipulate Northing values to be positive */ ! private double falseNorthing = 0.0; + + // *** constructors ******************************************************* *************** *** 165,169 **** // octets 29-32 are reserved ! prepProjection(); } --- 193,200 ---- // octets 29-32 are reserved ! //prepProjection(); ! double[] xy = this.forwardTrans(this.grid_lat1, this.grid_lon1, this.grid_lon2); ! this.grid_startx = xy[0]; ! this.grid_starty = xy[1]; } *************** *** 445,465 **** x = grid_startx + grid_dx*i; ! rho = Math.sqrt(x*x + y*y); ! c = 2.0 * Math.atan(rho/(2.0 * EARTH_RADIUS * SCALE_FACTOR)); ! cosC = Math.cos(Math.toRadians(c)); ! sinC = Math.sin(Math.toRadians(c)); ! ! lat = Math.asin(cosC * sin60 + (y * sinC * cos60 / rho)); ! lon = grid_lon2 + Math.atan(x * sinC / (rho * cos60 * cosC - y * cos60 * sinC)); ! ! // move x-coordinates to the range -180..180 ! if (lon >= 180.0) lon = lon - 360.0; ! if (lon < -180.0) lon = lon + 360.0; ! if (lat > 90.0 || lat < -90.0) ! { ! System.err.println("GribGDSPolarStereo: latitude out of range (-90 to 90)."); ! } ! coords[count++] = lon; ! coords[count++] = lat; } } --- 476,497 ---- x = grid_startx + grid_dx*i; ! // rho = Math.sqrt(x*x + y*y); ! // c = 2.0 * Math.atan(rho/(2.0 * EARTH_RADIUS * SCALE_FACTOR)); ! // cosC = Math.cos(Math.toRadians(c)); ! // sinC = Math.sin(Math.toRadians(c)); ! // ! // lat = Math.asin(cosC * sin60 + (y * sinC * cos60 / rho)); ! // lon = grid_lon2 + Math.atan(x * sinC / (rho * cos60 * cosC - y * cos60 * sinC)); ! // ! // // move x-coordinates to the range -180..180 ! // if (lon >= 180.0) lon = lon - 360.0; ! // if (lon < -180.0) lon = lon + 360.0; ! // if (lat > 90.0 || lat < -90.0) ! // { ! // System.err.println("GribGDSPolarStereo: latitude out of range (-90 to 90)."); ! // } ! double[] latLon = this.reverseTrans(x,y,this.grid_lon2); ! coords[count++] = latLon[0]; ! coords[count++] = latLon[1]; } } *************** *** 554,557 **** --- 586,746 ---- return str; } + + /** + * Set the reference values of the ellipsoid of choice when + * calculating the position of lat/lon or X,Y values in the + * polar stereographic projection. + * + * Defaults to WGS84:<br> + * - semiMajorAxis = 6378137 (meters)<bt> + * - inverseFlattening = 298.25722<br> + * - see: <a href="http://maic.jmu.edu/sic/standards/ellipsoid.htm">ellipsoid.htm</a> + * + * @param semiMajorAxis - The semimajor or equatorial radius of this + * reference ellipsoid, in meters. + * @param inverseFlattening - The reciprocal of the ellipticity or flattening + * of this reference ellipsoid (dimensionless). + */ + public void setReferenceEllipsoid (double semiMajorAxis, double inverseFlattening) { + + // Set semiMajorAxis or equatorial radius + this.semiMajorAxis = semiMajorAxis; + + // Set invers flattening + this.inverseFlattening = inverseFlattening; + + // Calculate eccentricity + double f = 1.0/this.inverseFlattening; + this.eccentricity = Math.sqrt(f*(2.0-f)); + } + + /** + * Set scaleFactor to use with your mapping region - Defaults to 1.0 + * + * @param scaleFactor - Mapping scale factor + */ + public void setScaleFactor (double scaleFactor) { + this.SCALE_FACTOR = scaleFactor; + } + + /** + * Set false origin of grid, so Easting and Northing values is + * positive. Defaults to zero + * @param falseEasting + * @param falseNorthing + */ + public void setFalseOrigin(double falseEasting, double falseNorthing) { + this.falseEasting = falseEasting; + this.falseNorthing = falseNorthing; + } + + + /** + * see: <a href="http://www.posc.org/Epicentre.2_2/DataModel/ExamplesofUsage/eu_cs34j.html">online docs</a> + * @param lat + * @param lon + * @param lov + * @return northing,easting + */ + public double[] forwardTrans (double lat, double lon, double lov) { + + // To follow the applied math as simple as possible we map + // input variables to theese values + double phi = Math.toRadians(lat); + double lambda = Math.toRadians(lon); + double lambdaZero = Math.toRadians(lov); + double[] returnValues = new double[2]; + + // Helper variables: + double eSinPhi = this.eccentricity * Math.sin(phi); + double tHelper = (1-eSinPhi)/(1+eSinPhi); + tHelper = Math.pow(tHelper, (this.eccentricity/2.0)); + double rhoHelper = Math.pow((1+this.eccentricity), (1+this.eccentricity)) * + Math.pow((1-this.eccentricity), (1-this.eccentricity)); + + // Calculate t + double t = Math.tan((Math.PI/4)-(phi/2.0)) / tHelper; + + // Calculate rho + double rho = (2*this.semiMajorAxis*this.SCALE_FACTOR*t) / Math.sqrt(rhoHelper); + + // Calculate E - Easting + double E = this.falseEasting + (rho * Math.sin(lambda - lambdaZero)); + + // Calculate N - Northing + double N = this.falseNorthing - (rho * Math.cos(lambda - lambdaZero)); + + System.out.println("(lat,lon) = ("+lat+","+lon+") -> (E,N) = ("+E+","+N+")"); + + // Add values to return argument + returnValues[0] = N; + returnValues[1] = E; + + // Return calculated values + return returnValues; + } + + /** + * see: <a href="http://www.posc.org/Epicentre.2_2/DataModel/ExamplesofUsage/eu_cs34j.html">online docs</a> + * @param N + * @param E + * @param lov + * @return lon,lat + */ + public double[] reverseTrans(double N, double E, double lov) { + + // To follow the applied math as simple as possible we map + // input variables to theese values + double lambdaZero = Math.toRadians(lov); + double[] returnValues = new double[2]; + + // Define helper variables + double tHelper = Math.pow((1 + this.eccentricity), (1 + this.eccentricity)) * + Math.pow((1 - this.eccentricity), (1 - this.eccentricity)); + tHelper = Math.sqrt(tHelper); + + // Used to calculate phi + double e2 = Math.pow(this.eccentricity, 2); + double e4 = Math.pow(this.eccentricity, 4); + double e6 = Math.pow(this.eccentricity, 6); + double e8 = Math.pow(this.eccentricity, 8); + + // Calculate rho + double rho = Math.sqrt(Math.pow((E - this.falseEasting), 2) + + Math.pow((N -this.falseNorthing),2)); + + // Calculate t + double t = (rho*tHelper) / (2 * this.semiMajorAxis * this.SCALE_FACTOR); + + // Calculate chi + double chi = (Math.PI/2.0) - 2*Math.atan(t); + + // Calculate phi + double phi = chi + ( ( (e2/2) + (5*e4/24) + (e6/12) + (13*e8/360) )*Math.sin(2*chi) ) + + ( ( (7*e4/48) + (29*e6/240) + (811*e8/11520) )*Math.sin(4*chi) ) + + ( ( (7*e6/120) + (81*e8/1120) )*Math.sin(6*chi) ) + + ( (4279*e8/161280)*Math.sin(8*chi) ); + + // Calculate lambda + double lambda = lambdaZero + Math.atan((E - this.falseEasting)/ + (N - this.falseNorthing)); + + // Return values as degrees + double lon = Math.toDegrees(-lambda); + double lat = Math.toDegrees(phi); + + // move longitude-coordinate to the range -180..180 + if (lon >= 180.0) lon = lon - 180.0; + if (lon < -180.0) lon = lon + 180.0; + + System.out.println("(E,N) = ("+E+","+N+") -> (lat,lon) = ("+lat+","+lon+")"); + + // Add values to return argument + returnValues[0] = lon; + returnValues[1] = lat; + + // Return calculated values + return returnValues; + } } |
From: Peter G. <fr...@us...> - 2006-08-14 14:45:39
|
Update of /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib/gds In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv2283/src/net/sourceforge/jgrib/gds Modified Files: GribGDSPolarStereo.java Log Message: Bugfix in method getGridCoords(). Now correctly implemented according to documentation provided originally by Rick Gonzales. Index: GribGDSPolarStereo.java =================================================================== RCS file: /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib/gds/GribGDSPolarStereo.java,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** GribGDSPolarStereo.java 12 Aug 2006 21:48:40 -0000 1.2 --- GribGDSPolarStereo.java 14 Aug 2006 14:45:33 -0000 1.3 *************** *** 398,402 **** cos60 = Math.cos(Math.toRadians(latitude_ts)); sin60 = Math.sin(Math.toRadians(latitude_ts)); ! dLonr = Math.toRadians(grid_lon1 - grid_lon2); //lon2 is lov k = 2.0 * SCALE_FACTOR / --- 398,403 ---- cos60 = Math.cos(Math.toRadians(latitude_ts)); sin60 = Math.sin(Math.toRadians(latitude_ts)); ! //dLonr = Math.toRadians(grid_lon1 - grid_lon2); //lon2 is lov ! dLonr = Math.toRadians(grid_lon1); //lon2 is lov k = 2.0 * SCALE_FACTOR / *************** *** 417,421 **** * Maintained his symbols, so the code matches his work. * Somewhat hard to follow, if interested, suggest looking up quick reference ! * at http://mathworld.wolfram.com/PolarStereoConicProjection.html * * assumes scale factor of 1.0 --- 418,422 ---- * Maintained his symbols, so the code matches his work. * Somewhat hard to follow, if interested, suggest looking up quick reference ! * at http://mathworld.wolfram.com/StereographicProjection.html * * assumes scale factor of 1.0 *************** *** 438,442 **** for (int j = 0; j < grid_ny; j++) { ! y = grid_starty + grid_dy*j; for (int i = 0; i < grid_nx; i++) { --- 439,444 ---- for (int j = 0; j < grid_ny; j++) { ! //y = grid_starty + grid_dy*j; ! y = grid_starty + grid_dy*j; for (int i = 0; i < grid_nx; i++) { *************** *** 448,453 **** sinC = Math.sin(Math.toRadians(c)); ! lon = Math.asin(cosC * sin60 + (y * sinC * cos60 / rho)); ! lat = grid_lon2 + Math.atan(x * sinC / (rho * cos60 * cosC - y * cos60 * sinC)); // move x-coordinates to the range -180..180 --- 450,455 ---- sinC = Math.sin(Math.toRadians(c)); ! lat = Math.asin(cosC * sin60 + (y * sinC * cos60 / rho)); ! lon = grid_lon2 + Math.atan(x * sinC / (rho * cos60 * cosC - y * cos60 * sinC)); // move x-coordinates to the range -180..180 *************** *** 552,556 **** return str; } - } --- 554,557 ---- |
From: Peter G. <fr...@us...> - 2006-08-13 20:37:51
|
Update of /cvsroot/jgrib/jgrib/samples In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv2589/samples Modified Files: README.samples Log Message: Updated with link to OSISAF PDF documentation Index: README.samples =================================================================== RCS file: /cvsroot/jgrib/jgrib/samples/README.samples,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** README.samples 27 Jul 2006 13:10:56 -0000 1.1 --- README.samples 13 Aug 2006 20:37:45 -0000 1.2 *************** *** 44,47 **** --- 44,48 ---- Sample file: S_OSI_FRA_NOAA_NARSSTMNOR_F_200607201000Z.grb - Website: http://www.osi-saf.org/ + - Documentation: http://www.osi-saf.org/biblio/docs/ss1_pmnarsst_1_7.pdf - public available data: no - Polar Stereo |
Update of /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv3274/src/net/sourceforge/jgrib Modified Files: GribRecordGDS.java GribRecord.java GribFile.java GribTables.java SmartStringArray.java GribRecordLight.java Log Message: Fixed javadoc errors and warnings Index: GribRecordGDS.java =================================================================== RCS file: /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib/GribRecordGDS.java,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** GribRecordGDS.java 12 Aug 2006 21:48:40 -0000 1.10 --- GribRecordGDS.java 12 Aug 2006 22:01:18 -0000 1.11 *************** *** 59,63 **** * @author Peter Gylling, RDANH (Applied template design pattern) <p> * ! * @see: net.sourceforge.jgrib.GribRecord#UNDEFINED */ --- 59,63 ---- * @author Peter Gylling, RDANH (Applied template design pattern) <p> * ! * @see net.sourceforge.jgrib.GribRecord#UNDEFINED */ Index: SmartStringArray.java =================================================================== RCS file: /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib/SmartStringArray.java,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** SmartStringArray.java 25 Jul 2006 13:46:23 -0000 1.3 --- SmartStringArray.java 12 Aug 2006 22:01:18 -0000 1.4 *************** *** 27,31 **** /** * Class to handle addition of elements ! * Kjell Røang, 18/03/2002 */ public class SmartStringArray --- 27,31 ---- /** * Class to handle addition of elements ! * Kjell Roeang, 18/03/2002 */ public class SmartStringArray Index: GribRecordLight.java =================================================================== RCS file: /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib/GribRecordLight.java,v retrieving revision 1.5 retrieving revision 1.6 diff -C2 -d -r1.5 -r1.6 *** GribRecordLight.java 7 Aug 2006 13:46:49 -0000 1.5 --- GribRecordLight.java 12 Aug 2006 22:01:18 -0000 1.6 *************** *** 26,30 **** /** * Created by IntelliJ IDEA. ! * User: Kjell Røang * Date: 15.mar.02 */ --- 26,30 ---- /** * Created by IntelliJ IDEA. ! * User: Kjell Roeang * Date: 15.mar.02 */ Index: GribRecord.java =================================================================== RCS file: /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib/GribRecord.java,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** GribRecord.java 12 Aug 2006 21:47:02 -0000 1.6 --- GribRecord.java 12 Aug 2006 22:01:18 -0000 1.7 *************** *** 28,32 **** * * (C) Benjamin Stark ! * Updated Kjell Røang, 18/03/2002 */ --- 28,32 ---- * * (C) Benjamin Stark ! * Updated Kjell Roeang, 18/03/2002 */ Index: GribFile.java =================================================================== RCS file: /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib/GribFile.java,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** GribFile.java 7 Aug 2006 13:46:48 -0000 1.9 --- GribFile.java 12 Aug 2006 22:01:18 -0000 1.10 *************** *** 28,32 **** * * (C) Benjamin Stark ! * Updated Kjell Røang, 18/03/2002 * Updated Richard D. Gonzalez 7 Dec 02 */ --- 28,32 ---- * * (C) Benjamin Stark ! * Updated Kjell Roeang, 18/03/2002 * Updated Richard D. Gonzalez 7 Dec 02 */ *************** *** 633,637 **** while (in.available() > 2) { ! //This code has been commented by Antonio S. Cofiño, because if // you have this sequence of characters GGRIB you will skip the message // --- 633,637 ---- while (in.available() > 2) { ! //This code has been commented by Antonio S. Cofio, because if // you have this sequence of characters GGRIB you will skip the message // Index: GribTables.java =================================================================== RCS file: /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib/GribTables.java,v retrieving revision 1.6 retrieving revision 1.7 diff -C2 -d -r1.6 -r1.7 *** GribTables.java 25 Jul 2006 13:46:23 -0000 1.6 --- GribTables.java 12 Aug 2006 22:01:18 -0000 1.7 *************** *** 28,32 **** * * (C) Benjamin Stark ! * Updated Kjell Røang, 18/03/2002 */ --- 28,32 ---- * * (C) Benjamin Stark ! * Updated Kjell Roeang, 18/03/2002 */ |
From: Peter G. <fr...@us...> - 2006-08-12 21:50:19
|
Update of /cvsroot/jgrib/jgrib In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv31425 Modified Files: ChangeLog Log Message: Added summary of todays changes Index: ChangeLog =================================================================== RCS file: /cvsroot/jgrib/jgrib/ChangeLog,v retrieving revision 1.11 retrieving revision 1.12 diff -C2 -d -r1.11 -r1.12 *** ChangeLog 11 Aug 2006 19:36:16 -0000 1.11 --- ChangeLog 12 Aug 2006 21:50:16 -0000 1.12 *************** *** 8,11 **** --- 8,24 ---- CVS history. + 2006-08-12 Peter Gylling <frv_peg at users.sourceforge.net> + - Applied template design pattern to GribRecordGDS class to + facilitate the work involved in extending the library with + new grids. + - Added documentation about this in javadoc. + - Removed deprecated constructor from GribRecordGSD class. This + is part of the planned cleanup of the public interface needed + before the first stable release of JGRIB. + - Added static methods to GribRecord class holding the library + undefined value as int, float and double. This value has earlier + only been used in GribRecordBDS class. BTW the value is the + same as in wgrib. + 2006-08-11 Peter Gylling <frv_peg at users.sourceforge.net> - Updated all webpages to xhtml, including doctype definitions (DTD) |
From: Peter G. <fr...@us...> - 2006-08-12 21:49:34
|
Update of /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib/gds In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv31019/src/net/sourceforge/jgrib/gds Modified Files: package.html Log Message: Added documentation - Instructions about how to extend library with new grids Index: package.html =================================================================== RCS file: /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib/gds/package.html,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** package.html 9 Aug 2006 09:04:10 -0000 1.1 --- package.html 12 Aug 2006 21:49:30 -0000 1.2 *************** *** 40,43 **** --- 40,54 ---- <li>Rotated latitude/longitude - type 10</li> </ul> + + <h2>Extentions instructions</h2> + In case you want to extend this library with capability of reading a new type of grid you will + subclass the GribRecordGDS class and modify the GribGDSFactory class to handle the new type of grid. + <p> + Facts you will need: + <ul> + <li>The GDS facillity is using the <b>Template design pattern</b></li> + <li>You will handle the bitStream input as shown in the documentation for your grid type/li> + <li>Basically you could copy the constructor from the GribGDSLatLon class and extend it./li> + </ul> <h2>Related Documentation</h2> |
From: Peter G. <fr...@us...> - 2006-08-12 21:48:45
|
Update of /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv30622/src/net/sourceforge/jgrib Modified Files: GribRecordGDS.java Log Message: Applied the template design pattern to the GDS code section - to ease the future work and still provide backward compability Index: GribRecordGDS.java =================================================================== RCS file: /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib/GribRecordGDS.java,v retrieving revision 1.9 retrieving revision 1.10 diff -C2 -d -r1.9 -r1.10 *** GribRecordGDS.java 7 Aug 2006 14:02:33 -0000 1.9 --- GribRecordGDS.java 12 Aug 2006 21:48:40 -0000 1.10 *************** *** 33,94 **** package net.sourceforge.jgrib; - import java.io.IOException; - - import org.apache.log4j.Logger; - /** * A class that represents the grid definition section (GDS) of a GRIB record. * <p> ! * 5 Okt 05 - Changed class to become abstract as intended by RDG all common ! * methods between this class and all known subclasses is changed to ! * abstract methods, so it becomes more clear, which methods one should ! * actually implement, when adding support for a new type of GRIB files. ! * <p> ! * 4 Sep 02 - Modified to be implemented using GribGDSFactory class. ! * <p> ! * This class is used to store the first 32 octets of the GDS, which are ! * common, or similar, in all GDS types. ! * Sometimes names vary slightly in Table D, but functionality is similar, e.g. ! * <p><code> ! * Grid type Octet Id ! * Lat/Lon 7-8 Ni - Number of points along a latitude circle ! * Lambert 7-8 Nx - Number of points along x-axis ! * </code><p> ! * Other times, functionality is different, e.g. ! * <p><code> ! * Lat/Lon 18-20 La2 - latitude of grid point ! * Lambert 18-20 Lov - the orientation of the grid ! * </code><p> ! * However, all sets have at least 32 octets. Those 32 are stored here, and the ! * differences are resolved in the child classes, and therefore, all ! * attributes are set from the Child classes. ! * <p> ! * The names of the attributes are the same JGrib originally used , for ! * simplicity and continuity. The fact that some grids use a different number ! * of octets for doubles is irrelevant, as the conversion is stored, not the ! * octets. ! * <p> ! * The child classes should call the proper setters and getters. * <p> ! * The class retains every bit of the original functionality, so it can continue ! * to be used in legacy programs (still limited to grid_type 0 and 10). * <p> ! * New users should not create instances of this class directly (in fact, it ! * should be changed to an abstract class - it's on the to do list), but use the ! * GribGDS factory instead, and add new child classes (e.g. GribGDSXxxx) as ! * needed for additional grid_types. ! * * @author Benjamin Stark <p> * @author Capt Richard D. Gonzalez, USAF (Modified original code) <p> ! * @author Peter Gylling <peg at frv.dk> (Made class abstract)<p> ! * @version 3.0 */ public abstract class GribRecordGDS { - /** - * Get instance of logger - */ - private static Logger logger = Logger.getLogger(GribRecordGDS.class.getName()); /** --- 33,67 ---- package net.sourceforge.jgrib; /** * A class that represents the grid definition section (GDS) of a GRIB record. * <p> ! * To java developers trying to extend JGRIB with new types of grids. The ! * GribRecordGDS.java and known subclasses is implemented using the ! * <b>template design pattern</b>. This is used to provide backward ! * compability for the early implementations using the JGRIB library. ! * And also due to the fact, that the Lat/lon grid is so widely used, ! * that most users will benifit from having access to generally used ! * variables to descripe lat/lon or rotated lat/lon grids. * <p> ! * Users should notice, that this is generalized interface, which will give ! * you the 95% common metadata descriping the grids involved. Some methods ! * will in the specific case return the JGRIB library undefined value. Is this ! * the case, then it's because this information makes no sence to this particular ! * grid. This feature is required to supply backward compability in the same time ! * as we want to be capable of extending the library with more types of grids. ! * * <p> ! * Further documentation: ! * <a href="http://www.nco.ncep.noaa.gov/pmb/docs/on388/section2.html">section2.html</a> ! * * @author Benjamin Stark <p> * @author Capt Richard D. Gonzalez, USAF (Modified original code) <p> ! * @author Peter Gylling, RDANH (Applied template design pattern) <p> ! * ! * @see: net.sourceforge.jgrib.GribRecord#UNDEFINED */ public abstract class GribRecordGDS { /** *************** *** 101,110 **** * Length in bytes of this section. */ ! protected int length; /** * Number of vertical coordinate parameters; */ ! protected int nv; /** --- 74,83 ---- * Length in bytes of this section. */ ! protected int length = GribRecord.UNDEFINED_INT; /** * Number of vertical coordinate parameters; */ ! protected int nv = GribRecord.UNDEFINED_INT; /** *************** *** 118,163 **** * <a href="http://www.nco.ncep.noaa.gov/pmb/docs/on388/section2.html">section2.html</a> */ ! protected int octetPos; /** ! * Type of grid (See table 6) */ ! protected int grid_type; /** * Number of grid columns. (Also Ni) */ ! protected int grid_nx; /** * Number of grid rows. (Also Nj) */ ! protected int grid_ny; /** * Latitude of grid start point. */ ! protected double grid_lat1; /** * Longitude of grid start point. */ ! protected double grid_lon1; ! ! /** ! * Mode of grid (See table 7) ! * only 128 supported == increments given) ! */ ! protected int grid_mode; /** * Latitude of grid end point. */ ! protected double grid_lat2; /** * Longitude of grid end point. */ ! protected double grid_lon2; /** --- 91,149 ---- * <a href="http://www.nco.ncep.noaa.gov/pmb/docs/on388/section2.html">section2.html</a> */ ! protected int octetPos = GribRecord.UNDEFINED_INT; /** ! * Type of grid ! * ! * See: ! * <a href="http://www.nco.ncep.noaa.gov/pmb/docs/on388/table6.html">table6.html</a> */ ! protected int grid_type = GribRecord.UNDEFINED_INT; /** + * Type of grid - as String + * + * See: + * <a href="http://www.nco.ncep.noaa.gov/pmb/docs/on388/table6.html">table6.html</a> + */ + protected String grid_type_string = null; + + /** * Number of grid columns. (Also Ni) */ ! protected int grid_nx = GribRecord.UNDEFINED_INT; /** * Number of grid rows. (Also Nj) */ ! protected int grid_ny = GribRecord.UNDEFINED_INT; /** * Latitude of grid start point. */ ! protected double grid_lat1 = GribRecord.UNDEFINED_DOUBLE; /** * Longitude of grid start point. */ ! protected double grid_lon1 = GribRecord.UNDEFINED_DOUBLE; /** * Latitude of grid end point. */ ! protected double grid_lat2 = GribRecord.UNDEFINED_DOUBLE; /** * Longitude of grid end point. */ ! protected double grid_lon2 = GribRecord.UNDEFINED_DOUBLE; ! ! /** ! * Mode of grid ! * ! * See: ! * <a href="http://www.nco.ncep.noaa.gov/pmb/docs/on388/table7.html">table7.html</a> ! */ ! protected int grid_mode = GribRecord.UNDEFINED_INT; /** *************** *** 165,169 **** * can be delta-Lon or delta x. */ ! protected double grid_dx; /** --- 151,155 ---- * can be delta-Lon or delta x. */ ! protected double grid_dx = GribRecord.UNDEFINED_DOUBLE; /** *************** *** 171,181 **** * can be delta-Lat or delta y. */ ! protected double grid_dy; /** ! * Scanning mode (See table 8). */ ! protected int grid_scan; // *** constructors ******************************************************* --- 157,193 ---- * can be delta-Lat or delta y. */ ! protected double grid_dy = GribRecord.UNDEFINED_DOUBLE; /** ! * Scanning mode ! * ! * See: ! * <a href="http://www.nco.ncep.noaa.gov/pmb/docs/on388/table8.html">table8.html</a> */ ! protected int grid_scan = GribRecord.UNDEFINED_INT; ! ! /** ! * Table J.Resolution and Component Flags, ! * bit 5 (from left) = 2^(8-5) = 8 = 0x08 : ! * false = u and v components are relative to east, north ! * true = u and v components are relative to grid x,y direction (i,j) ! */ ! protected boolean isUVEastNorth; ! ! /** ! * y-coordinate/latitude of south pole of a rotated lat/lon grid. ! */ ! protected double grid_latsp = GribRecord.UNDEFINED_DOUBLE; + /** + * x-coordinate/longitude of south pole of a rotated lat/lon grid. + */ + protected double grid_lonsp = GribRecord.UNDEFINED_DOUBLE; + + /** + * Rotation angle of rotated lat/lon grid. + */ + protected double grid_rotang = GribRecord.UNDEFINED_DOUBLE; + // *** constructors ******************************************************* *************** *** 206,336 **** - /** - * Constructs a <tt>GribRecordGDS</tt> object from a bit input stream. - * - * @param in bit input stream with GDS content - * @deprecated - Call GribGDSFactory.getGDS() - * - * @throws IOException if stream can not be opened etc. - * @throws NoValidGribException if stream contains no valid GRIB file - * @see net.sourceforge.jgrib.gds.GribGDSFactory#getGDS(BitInputStream) - */ - public GribRecordGDS(BitInputStream in) - throws IOException, NoValidGribException - { - int[] data; - logger.warn("Deprecated contructor called: Call GribGDSFactory.getGDS() instead"); - - // octets 1-3 (Length of GDS) - data = in.readUI8(3); - this.length = Bytes2Number.uint3(data[0], data[1], data[2]); - - // octets 4-5 not implemented yet - - data = in.readUI8(this.length - 3); - - // octet 6 (grid type) - this.grid_type = data[2]; - if (this.grid_type != 0 && this.grid_type != 10) - throw new NoValidGribException("GribRecordGDS: Only supporting grid type 0 " + - "(latlon grid) and 10 (rotated latlon grid)."); - - - data = in.readUI8(this.length - 4); - - // octets 7-8 (number of points along a parallel) - this.grid_nx = Bytes2Number.uint2(data[3], data[4]); - - // octets 9-10 (number of points along a meridian) - this.grid_ny = Bytes2Number.uint2(data[5], data[6]); - - // octets 11-13 (latitude of first grid point) - this.grid_lat1 = Bytes2Number.int3(data[7], data[8], data[9]) / 1000.0; - - // octets 14-16 (longitude of first grid point) - this.grid_lon1 = Bytes2Number.int3(data[10], data[11], data[12]) / 1000.0; - - // octet 17 (resolution and component flags -> 128 == increments given.) - this.grid_mode = data[13]; - - // octets 18-20 (latitude of last grid point) - this.grid_lat2 = Bytes2Number.int3(data[14], data[15], data[16]) / 1000.0; - - // octets 21-23 (longitude of last grid point) - this.grid_lon2 = Bytes2Number.int3(data[17], data[18], data[19]) / 1000.0; - - // increments given - if (this.grid_mode == 128) - { - - // octets 24-25 (x increment) - this.grid_dx = Bytes2Number.uint2(data[20], data[21]) / 1000.0; - - // octets 26-27 (y increment) - this.grid_dy = -Bytes2Number.uint2(data[22], data[23]) / 1000.0; - - // octet 28 (point scanning mode) - this.grid_scan = data[24]; - if ((this.grid_scan & 63) != 0) - throw new NoValidGribException("GribRecordGDS: This scanning mode (" + this.grid_scan + - ") is not supported."); - if ((this.grid_scan & 128) != 0) this.grid_dx = -this.grid_dx; - // rdg - changed to != 64 here because table 8 shows -j if bit NOT set - if ((this.grid_scan & 64) != 64) this.grid_dy = -this.grid_dy; - // if ((this.grid_scan & 64) != 0) this.grid_dy = -this.grid_dy; - } - else - { - // calculate increments - this.grid_dx = (this.grid_lon2 - this.grid_lon1) / (this.grid_nx - 1); - this.grid_dy = (this.grid_lat2 - this.grid_lat1) / (this.grid_ny - 1); - } - - // Original code - //if (this.grid_type == 10) - //{ - // // octets 33-35 (lat of s.pole) - // this.grid_latsp = Bytes2Number.int3(data[29], data[30], data[31]) / 1000.0; - // - // // octets 36-38 (lon of s.pole) - // this.grid_lonsp = Bytes2Number.int3(data[32], data[33], data[34]) / 1000.0; - // - // // octets 39-42 (angle of rotation) - // this.grid_rotang = Bytes2Number.int4(data[35], data[36], data[37], data[38]) / 1000.0; - //} - - // Code inserted by Peter Gylling - fr...@us..., 2003-07-08 - // - // This switch uses the grid_type to define how to handle the - // southpole information. - // - // switch (this.grid_type) { - // case 0: - // // Standard Lat/Lon grid, no rotation - // this.grid_latsp = -90.0; - // this.grid_lonsp = 0.0; - // this.grid_rotang = 0.0; - // break; - // - // case 10: - // // Rotated Lat/Lon grid, Lat (octets 33-35), Lon (octets 36-38), rotang (octets 39-42) - // this.grid_latsp = Bytes2Number.int3(data[29], data[30], data[31]) / 1000.0; - // this.grid_lonsp = Bytes2Number.int3(data[32], data[33], data[34]) / 1000.0; - // this.grid_rotang = Bytes2Number.int4(data[35], data[36], data[37], data[38]) / 1000.0; - // break; - // - // default: - // // No knowledge yet - // // NEED to fix this later, if supporting other grid types - // this.grid_latsp = Double.NaN; - // this.grid_lonsp = Double.NaN; - // this.grid_rotang = Double.NaN; - // break; - // } - // // Back on original code - - } - - // *** public methods ************************************************************** --- 218,221 ---- *************** *** 339,346 **** // methods will work just fine. ! // peg - turned all common methods into abstract methods, so it will become ! // easier to subclass with a new GDS type class, this way it's much ! // more clear which methods is standard for all GDS types ! /** * Get length in bytes of this section. --- 224,235 ---- // methods will work just fine. ! // frv_peg: ! // ! // Consider all non abstract methods as default implementations or hooks. ! // You can override the methods where it makes a difference. ! // ! // The abstract methods is left to you to implement, when extending the ! // library with new types of grids. ! /** * Get length in bytes of this section. *************** *** 348,352 **** * @return length in bytes of this section */ ! public abstract int getLength(); /** --- 237,243 ---- * @return length in bytes of this section */ ! public int getLength() { ! return this.length; ! } /** *************** *** 355,359 **** * @return Number of vertical coordinate parameters */ ! public abstract int getNV(); /** --- 246,252 ---- * @return Number of vertical coordinate parameters */ ! public int getNV() { ! return this.nv; ! } /** *************** *** 362,366 **** * @return Octet position - or 255 */ ! public abstract int octetPos(); /** --- 255,261 ---- * @return Octet position - or 255 */ ! public int octetPos() { ! return this.octetPos; ! } /** *************** *** 369,388 **** * @return type of grid */ ! public abstract int getGridType(); /** ! * Get number of grid columns. * * @return number of grid columns */ ! public abstract int getGridNX(); /** ! * Get number of grid rows. * * @return number of grid rows. */ ! public abstract int getGridNY(); /** --- 264,298 ---- * @return type of grid */ ! public int getGridType() { ! return this.grid_type; ! } + /** + * Get type of grid. + * + * @return type of grid + */ + public String getGridTypeString() { + return this.grid_type_string; + } + /** ! * Get number of grid columns. (Nx or Ni) * * @return number of grid columns */ ! public int getGridNX() { ! return this.grid_nx; ! } /** ! * Get number of grid rows (Ny or Nj) * * @return number of grid rows. */ ! public int getGridNY() { ! return this.grid_ny; ! } /** *************** *** 391,395 **** * @return y-coordinate/latitude of grid start point */ ! public abstract double getGridLat1(); /** --- 301,307 ---- * @return y-coordinate/latitude of grid start point */ ! public double getGridLat1() { ! return this.grid_lat1; ! } /** *************** *** 398,412 **** * @return x-coordinate/longitude of grid start point */ ! public abstract double getGridLon1(); /** * Get grid mode. - * <i>Only 128 (increments given) supported so far.</i> * * @return grid mode */ ! public abstract int getGridMode(); /** * Get x-increment/distance between two grid points. * --- 310,396 ---- * @return x-coordinate/longitude of grid start point */ ! public double getGridLon1() { ! return this.grid_lon1; ! } ! ! /** ! * Get y-coordinate/latitude of grid end point. ! * ! * @return y-coordinate/latitude of grid end point ! */ ! public double getGridLat2() ! { ! return this.grid_lat2; ! } /** + * Get x-coordinate/longitude of grid end point. + * + * @return x-coordinate/longitude of grid end point + */ + public double getGridLon2() + { + return this.grid_lon2; + } + + /** * Get grid mode. * * @return grid mode */ ! public int getGridMode() { ! return this.grid_mode; ! } /** + * Get scan mode (sign of increments). + * <i>Only 64, 128 and 192 supported so far.</i> + * + * @return scan mode + */ + public int getGridScanmode() { + return this.grid_scan; + } + + /** + * Table J.Resolution and Component Flags, + * bit 5 (from left) = 2^(8-5) = 8 = 0x08 : + * false = u and v components are relative to east, north + * true = u and v components are relative to grid x,y direction (i,j) + * + * @return true/false + */ + public boolean isUVEastNorth() { + return this.isUVEastNorth; + } + + /** + * Get latitude component of the southpole of the rotated grid + * + * @return latitude of rotated grid southpole + */ + public double getGridLatSP() { + return grid_latsp; + } + + /** + * Get longitude component of the southpole of the rotated grid + * + * @return longitude of rotated grid southpole + */ + public double getGridLonSP() { + return grid_lonsp; + } + + /** + * Get rotation angle of the southpole of the rotated grid + * + * @return rotation angle of rotated grid southpole + */ + public double getGrid_rotang() { + return grid_rotang; + } + + /** * Get x-increment/distance between two grid points. * *************** *** 415,419 **** public abstract double getGridDX(); - /** * Get y-increment/distance between two grid points. --- 399,402 ---- *************** *** 423,435 **** public abstract double getGridDY(); - - /** - * Get scan mode (sign of increments). - * <i>Only 64, 128 and 192 supported so far.</i> - * - * @return scan mode - */ - public abstract int getGridScanmode(); - /** * Get all longitide coordinates --- 406,409 ---- *************** *** 450,462 **** public abstract double[] getGridCoords(); - /** - * Table J.Resolution and Component Flags, - * bit 5 (from left) = 2^(8-5) = 8 = 0x08 : - * false = u and v components are relative to east, north - * true = u and v components are relative to grid x,y direction (i,j) - * - * @return true/false - */ - public abstract boolean isUVEastNorth(); /** --- 424,427 ---- *************** *** 493,527 **** public abstract String toString(); - /** - * NOTE: This method must remain here, so we don't - * break backward compability - thus this method - * does not make any sence if the grid type isn't - * standard lat/lon or rotated lat/lon - * - * Get y-coordinate/latitude of grid end point. - * - * @return y-coordinate/latitude of grid end point - */ - public double getGridLat2() - { - return this.grid_lat2; - } - - - /** - * NOTE: This method must remain here, so we don't - * break backward compability - thus this method - * does not make any sence if the grid type isn't - * standard lat/lon or rotated lat/lon - * - * Get x-coordinate/longitude of grid end point. - * - * @return x-coordinate/longitude of grid end point - */ - public double getGridLon2() - { - return this.grid_lon2; - } - } --- 458,461 ---- |
From: Peter G. <fr...@us...> - 2006-08-12 21:48:44
|
Update of /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib/gds In directory sc8-pr-cvs6.sourceforge.net:/tmp/cvs-serv30622/src/net/sourceforge/jgrib/gds Modified Files: GribGDSLambert.java GribGDSRotLatLon.java GribGDSPolarStereo.java GribGDSLatLon.java Log Message: Applied the template design pattern to the GDS code section - to ease the future work and still provide backward compability Index: GribGDSRotLatLon.java =================================================================== RCS file: /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib/gds/GribGDSRotLatLon.java,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** GribGDSRotLatLon.java 7 Aug 2006 13:45:58 -0000 1.1 --- GribGDSRotLatLon.java 12 Aug 2006 21:48:40 -0000 1.2 *************** *** 55,72 **** // Attributes for Lat/Lon grid not included in GribRecordGDS - /** - * y-coordinate/latitude of south pole of a rotated lat/lon grid. - */ - protected double grid_latsp; - - /** - * x-coordinate/longitude of south pole of a rotated lat/lon grid. - */ - protected double grid_lonsp; - - /** - * Rotation angle of rotated lat/lon grid. - */ - protected double grid_rotang; /** --- 55,58 ---- *************** *** 87,90 **** --- 73,79 ---- super(header); + // Set type of grid as string + this.grid_type_string = "Rotated LatLon Grid"; + int[] data; *************** *** 150,155 **** --- 139,149 ---- } + // Extract value of south pole latitude this.grid_latsp = Bytes2Number.int3(data[26], data[27], data[28]) / 1000.0; + + // Extract value of south pole longitude this.grid_lonsp = Bytes2Number.int3(data[29], data[30], data[31]) / 1000.0; + + // Extract value of rotation angle of the south pole this.grid_rotang = Bytes2Number.float4(data[32], data[33], data[34], data[35]); *************** *** 241,284 **** /** - * Get length in bytes of this section. - * - * @return length in bytes of this section - */ - public int getLength() - { - return length; - } - - /** - * Get number of vertical coordinate paramters - * - * @return Number of vertical coordinate parameters - */ - public int getNV() - { - return this.nv; - } - - /** - * Get position of PL or PV as octet number - * - * @return Octet position - or 255 - */ - public int octetPos() - { - return this.octetPos; - } - - /** - * Get type of grid. This is type 0. - * - * @return type of grid - */ - public int getGridType() - { - return grid_type; - } - - /** * @return true/false */ --- 235,238 ---- *************** *** 290,363 **** /** - * Get number of grid columns. - * - * @return number of grid columns - */ - public int getGridNX() - { - return grid_nx; - } - - /** - * Get number of grid rows. - * - * @return number of grid rows. - */ - public int getGridNY() - { - return grid_ny; - } - - /** - * Get latitude of grid start point. - * - * @return latitude of grid start point - */ - public double getGridLat1() - { - return grid_lat1; - } - - /** - * Get longitude of grid start point. - * - * @return longitude of grid start point - */ - public double getGridLon1() - { - return grid_lon1; - } - - /** - * Get grid mode. <i>Only 128 (increments given) supported so far.</i> - * - * @return grid mode - */ - public int getGridMode() - { - return grid_mode; - } - - /** - * Get latitude of grid end point. - * - * @return latitude of grid end point - */ - public double getGridLat2() - { - return grid_lat2; - } - - /** - * Get longitude of grid end point. - * - * @return longitude of grid end point - */ - public double getGridLon2() - { - return grid_lon2; - } - - /** * Get delta-Lon between two grid points. * --- 244,247 ---- *************** *** 380,393 **** /** - * Get scan mode (sign of increments). <i>Only 64, 128 and 192 supported so far.</i> - * - * @return scan mode - */ - public int getGridScanmode() - { - return grid_scan; - } - - /** * Get longitide coordinates converted to the range +/- 180 * @return longtitude as double --- 264,267 ---- *************** *** 484,488 **** String str = " GDS section:\n "; ! str += " Rotated LatLon Grid"; str += " (" + this.grid_nx + "x" + this.grid_ny + ")\n "; --- 358,362 ---- String str = " GDS section:\n "; ! str += " " + this.grid_type_string; str += " (" + this.grid_nx + "x" + this.grid_ny + ")\n "; *************** *** 497,526 **** } - /** - * Get latitude component of the southpole of the rotated grid - * - * @return latitude of rotated grid southpole - */ - public double getGrid_latsp() { - return grid_latsp; - } - - /** - * Get longitude component of the southpole of the rotated grid - * - * @return longitude of rotated grid southpole - */ - public double getGrid_lonsp() { - return grid_lonsp; - } - - /** - * Get rotation angle of the southpole of the rotated grid - * - * @return rotation angle of rotated grid southpole - */ - public double getGrid_rotang() { - return grid_rotang; - } } --- 371,374 ---- Index: GribGDSLatLon.java =================================================================== RCS file: /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib/gds/GribGDSLatLon.java,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** GribGDSLatLon.java 7 Aug 2006 13:45:58 -0000 1.1 --- GribGDSLatLon.java 12 Aug 2006 21:48:40 -0000 1.2 *************** *** 75,78 **** --- 75,81 ---- { super(header); + + // Set type of grid as string + this.grid_type_string = "LatLon Grid"; int[] data; *************** *** 101,128 **** this.grid_mode = data[10]; - // if (this.grid_mode != 128 && this.grid_mode != 0) - // throw new NotSupportedException("GribGDSLatLon: No other component flag than 128 " + - // "(increments given) or 0 (not given) supported. " + - // "Current is: " + this.grid_mode); - /* - TABLE 7 - RESOLUTION AND COMPONENT FLAGS - (GDS Octet 17) - - Bit Value Meaning - 1 0 Direction increments not given - 1 Direction increments given - - 2 0 Earth assumed spherical with radius = 6367.47 km - 1 Earth assumed oblate spheroid with size - as determined by IAU in 1965: - 6378.160 km, 6356.775 km, f = 1/297.0 - - 3-4 reserved (set to 0) - - 5 0 u- and v-components of vector quantities resolved relative to easterly and northerly directions - 1 u and v components of vector quantities resolved relative to the defined grid in the direction of increasing x and y (or i and j) coordinates respectively - - 6-8 reserved (set to 0) - */ // octets 18-20 (latitude of last grid point) this.grid_lat2 = Bytes2Number.int3(data[11], data[12], data[13]) / 1000.0; --- 104,107 ---- *************** *** 131,172 **** this.grid_lon2 = Bytes2Number.int3(data[14], data[15], data[16]) / 1000.0; - // increments given - //if (this.grid_mode == 128) - - //grid_mode_isUVgridIJ = false; switch(this.grid_mode) { case 136: //grid_mode_isUVgridIJ = true; - break; case 128: ! // octets 24-25 (x increment) ! this.grid_dx = Bytes2Number.uint2(data[17], data[18]) / 1000.0; ! // octets 26-27 (y increment) ! this.grid_dy = Bytes2Number.uint2(data[19], data[20]) / 1000.0; ! // octet 28 (point scanning mode - See table 8) ! this.grid_scan = data[21]; ! if ((this.grid_scan & 63) != 0) ! throw new NotSupportedException("GribGDSLatLon: This scanning mode (" + this.grid_scan +") is not supported."); ! if ((this.grid_scan & 128) != 0) this.grid_dx = -this.grid_dx; ! // rdg - changed to != 64 here because table 8 shows -j if bit NOT set ! if ((this.grid_scan & 64) != 64) this.grid_dy = -this.grid_dy; ! // if ((this.grid_scan & 64) != 0) this.grid_dy = -this.grid_dy; ! // } ! // else ! // { ! break; case 0: ! // calculate increments ! this.grid_dx = (this.grid_lon2 - this.grid_lon1) / this.grid_nx; ! this.grid_dy = (this.grid_lat2 - this.grid_lat1) / this.grid_ny; ! break; default: ! throw new NotSupportedException("GribGDSLatLon: Supported grid mode flags are: " + " 136, 128, 0. Current is: " + this.grid_mode); } } --- 110,149 ---- this.grid_lon2 = Bytes2Number.int3(data[14], data[15], data[16]) / 1000.0; switch(this.grid_mode) { case 136: //grid_mode_isUVgridIJ = true; case 128: ! // octets 24-25 (x increment) ! this.grid_dx = Bytes2Number.uint2(data[17], data[18]) / 1000.0; ! // octets 26-27 (y increment) ! this.grid_dy = Bytes2Number.uint2(data[19], data[20]) / 1000.0; ! // octet 28 (point scanning mode - See table 8) ! this.grid_scan = data[21]; ! if ((this.grid_scan & 63) != 0) ! throw new NotSupportedException("GribGDSLatLon: This scanning mode (" + this.grid_scan +") is not supported."); ! if ((this.grid_scan & 128) != 0) this.grid_dx = -this.grid_dx; ! // rdg - changed to != 64 here because table 8 shows -j if bit NOT set ! if ((this.grid_scan & 64) != 64) this.grid_dy = -this.grid_dy; ! break; case 0: ! // calculate increments ! this.grid_dx = (this.grid_lon2 - this.grid_lon1) / this.grid_nx; ! this.grid_dy = (this.grid_lat2 - this.grid_lat1) / this.grid_ny; ! break; default: ! throw new NotSupportedException("GribGDSLatLon: Supported grid mode flags are: " + " 136, 128, 0. Current is: " + this.grid_mode); } + + // + // Setting values of the south pole - To give backward compability + // + this.grid_latsp = -90.0; + this.grid_lonsp = 0.0; + this.grid_rotang = 0.0; } *************** *** 256,299 **** /** - * Get length in bytes of this section. - * - * @return length in bytes of this section - */ - public int getLength() - { - return length; - } - - /** - * Get number of vertical coordinate paramters - * - * @return Number of vertical coordinate parameters - */ - public int getNV() - { - return this.nv; - } - - /** - * Get position of PL or PV as octet number - * - * @return Octet position - or 255 - */ - public int octetPos() - { - return this.octetPos; - } - - /** - * Get type of grid. This is type 0. - * - * @return type of grid - */ - public int getGridType() - { - return grid_type; - } - - /** * @return true/false */ --- 233,236 ---- *************** *** 305,378 **** /** - * Get number of grid columns. - * - * @return number of grid columns - */ - public int getGridNX() - { - return grid_nx; - } - - /** - * Get number of grid rows. - * - * @return number of grid rows. - */ - public int getGridNY() - { - return grid_ny; - } - - /** - * Get latitude of grid start point. - * - * @return latitude of grid start point - */ - public double getGridLat1() - { - return grid_lat1; - } - - /** - * Get longitude of grid start point. - * - * @return longitude of grid start point - */ - public double getGridLon1() - { - return grid_lon1; - } - - /** - * Get grid mode. <i>Only 128 (increments given) supported so far.</i> - * - * @return grid mode - */ - public int getGridMode() - { - return grid_mode; - } - - /** - * Get latitude of grid end point. - * - * @return latitude of grid end point - */ - public double getGridLat2() - { - return grid_lat2; - } - - /** - * Get longitude of grid end point. - * - * @return longitude of grid end point - */ - public double getGridLon2() - { - return grid_lon2; - } - - /** * Get delta-Lon between two grid points. * --- 242,245 ---- *************** *** 395,408 **** /** - * Get scan mode (sign of increments). <i>Only 64, 128 and 192 supported so far.</i> - * - * @return scan mode - */ - public int getGridScanmode() - { - return grid_scan; - } - - /** * Get longitide coordinates converted to the range +/- 180 * @return longtitude as double --- 262,265 ---- *************** *** 500,504 **** String str = " GDS section:\n "; ! str += " LatLon Grid"; str += " (" + this.grid_nx + "x" + this.grid_ny + ")\n "; --- 357,361 ---- String str = " GDS section:\n "; ! str += " " + this.grid_type_string; str += " (" + this.grid_nx + "x" + this.grid_ny + ")\n "; Index: GribGDSLambert.java =================================================================== RCS file: /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib/gds/GribGDSLambert.java,v retrieving revision 1.2 retrieving revision 1.3 diff -C2 -d -r1.2 -r1.3 *** GribGDSLambert.java 7 Aug 2006 14:02:33 -0000 1.2 --- GribGDSLambert.java 12 Aug 2006 21:48:40 -0000 1.3 *************** *** 125,128 **** --- 125,131 ---- { super(header); + + // Set type of grid as string + this.grid_type_string = "Lambert Conformal Grid"; int[] data; *************** *** 285,380 **** /** - * Get length in bytes of this section. - * - * @return length in bytes of this section - */ - public int getLength() - { - return this.length; - } - - /** - * Get number of vertical coordinate paramters - * - * @return Number of vertical coordinate parameters - */ - public int getNV() - { - return this.nv; - } - - /** - * Get position of PL or PV as octet number - * - * @return Octet position - or 255 - */ - public int octetPos() - { - return this.octetPos; - } - - /** - * Get type of grid. - * - * @return type of grid - */ - public int getGridType() - { - return this.grid_type; - } - - - /** - * Get number of grid columns. - * - * @return number of grid columns - */ - public int getGridNX() - { - return this.grid_nx; - } - - - /** - * Get number of grid rows. - * - * @return number of grid rows. - */ - public int getGridNY() - { - return this.grid_ny; - } - - /** - * Get y-coordinate/latitude of grid start point. - * - * @return y-coordinate/latitude of grid start point - */ - public double getGridLat1() - { - return this.grid_lat1; - } - - /** - * Get x-coordinate/longitude of grid start point. - * - * @return x-coordinate/longitude of grid start point - */ - public double getGridLon1() - { - return this.grid_lon1; - } - - /** - * Get grid mode. <i>Only 128 (increments given) supported so far.</i> - * - * @return grid mode - */ - public int getGridMode() - { - return this.grid_mode; - } - - /** * Get orientation of the grid * --- 288,291 ---- *************** *** 417,431 **** /** - * Get scan mode (sign of increments). <i>Only 64, 128 and 192 supported so far.</i> - * - * @return scan mode - */ - public int getGridScanmode() - { - return this.grid_scan; - } - - - /** * Get first latitude from the pole at which cone cuts spherical earth - * see note 8 of Table D --- 328,331 ---- *************** *** 450,475 **** /** - * Get latitude of south pole. - * - * @return latitude of south pole - */ - public double getGridLatSP() - { - return this.grid_latsp; - } - - - /** - * Get longitude of south pole of a rotated latitude/longitude grid. - * - * @return longitude of south pole - */ - public double getGridLonSP() - { - - return this.grid_lonsp; - } - - /** * Get starting x value for this grid - THIS IS NOT A LONGITUDE, but an x value * calculated for this specific projection, based on an origin of latin1, lov. --- 350,353 ---- *************** *** 722,726 **** String str = " GDS section:\n "; ! str += " Lambert Conformal Grid"; str += " (" + this.grid_nx + "x" + this.grid_ny + ")\n "; --- 600,604 ---- String str = " GDS section:\n "; ! str += " " + this.grid_type_string; str += " (" + this.grid_nx + "x" + this.grid_ny + ")\n "; Index: GribGDSPolarStereo.java =================================================================== RCS file: /cvsroot/jgrib/jgrib/src/net/sourceforge/jgrib/gds/GribGDSPolarStereo.java,v retrieving revision 1.1 retrieving revision 1.2 diff -C2 -d -r1.1 -r1.2 *** GribGDSPolarStereo.java 7 Aug 2006 13:45:58 -0000 1.1 --- GribGDSPolarStereo.java 12 Aug 2006 21:48:40 -0000 1.2 *************** *** 106,109 **** --- 106,112 ---- { super(header); + // Set type of grid as string + this.grid_type_string = "Polar Stereo Grid"; + logger.debug("Discovered GDS type: PolarStereo"); int[] data; *************** *** 254,347 **** /** - * Get length in bytes of this section. - * - * @return length in bytes of this section - */ - public int getLength() - { - return this.length; - } - - /** - * Get number of vertical coordinate paramters - * - * @return Number of vertical coordinate parameters - */ - public int getNV() - { - return this.nv; - } - - /** - * Get position of PL or PV as octet number - * - * @return Octet position - or 255 - */ - public int octetPos() - { - return this.octetPos; - } - - /** - * Get type of grid. - * - * @return type of grid - */ - public int getGridType() - { - return this.grid_type; - } - - /** - * Get number of grid columns. - * - * @return number of grid columns - */ - public int getGridNX() - { - return this.grid_nx; - } - - /** - * Get number of grid rows. - * - * @return number of grid rows. - */ - public int getGridNY() - { - return this.grid_ny; - } - - /** - * Get y-coordinate/latitude of grid start point. - * - * @return y-coordinate/latitude of grid start point - */ - public double getGridLat1() - { - return this.grid_lat1; - } - - /** - * Get x-coordinate/longitude of grid start point. - * - * @return x-coordinate/longitude of grid start point - */ - public double getGridLon1() - { - return this.grid_lon1; - } - - /** - * Get grid mode. <i>Only 128 (increments given) supported so far.</i> - * - * @return grid mode - */ - public int getGridMode() - { - return this.grid_mode; - } - - /** * Get East longitude parallel to y-axis * --- 257,260 ---- *************** *** 384,397 **** /** - * Get scan mode (sign of increments). <i>Only 64, 128 and 192 supported so far.</i> - * - * @return scan mode - */ - public int getGridScanmode() - { - return this.grid_scan; - } - - /** * Get the longitude of the circle where grid length are defined * --- 297,300 ---- *************** *** 588,592 **** String str = " GDS section:\n "; ! str += " Polar Stereo Grid"; --- 491,495 ---- String str = " GDS section:\n "; ! str += " " + this.grid_type_string; |