Hello,
In the attached test case, inconsistent coordinate results are returned
depending on which methods of the NetCDF Java API are called (tested
against v4.2.26).
Sample output:
Using coordAxis.getMinValue() method -----
minLon=-86.76239013671875
maxLon=268.2677307128906
minLat=21.105741500854492
maxLat=31.007230758666992
Using CoordinateAxis1D method -----
minLon=-86.76998901367188
maxLon=280.256103515625
minLat=18.15138816833496
maxLat=31.010635375976562
Using read method -----
minLon=-97.85687255859375
maxLon=-79.7386474609375
minLat=18.15138816833496
maxLat=31.010635375976562
-Dave
package gov.noaa.eds.threddsutilities.util;
import static org.junit.Assert.assertTrue;
import java.util.List;
import org.junit.Test;
import ucar.ma2.Array;
import ucar.nc2.Variable;
import ucar.nc2.constants.AxisType;
import ucar.nc2.dataset.CoordinateAxis;
import ucar.nc2.dataset.CoordinateAxis1D;
import ucar.nc2.dataset.NetcdfDataset;
public class ThreddsExtentUtilTest {
@Test
public void getExtentTest() {
// String urlStr =
//
"http://oos.soest.hawaii.edu/thredds/dodsC/pacioos/ncom/global/NCOM_Global_Ocean_Model_best.ncd";
// String urlStr =
//
"http://localhost:8080/thredds/dodsC/test/ncom_glb_sfc_2011050100.nc";
// String urlStr =
//
"dods://dods.ndbc.noaa.gov/thredds/dodsC/data/oceansites/DATA/MBARI/OS_MBARI-M0_20100614_R_M.nc";
// String urlStr =
//
"dods://dods.ndbc.noaa.gov/thredds/dodsC/data/oceansites/DATA/ANTARES/OS_ANTARES-1_200509_D_CTD.nc";
String urlStr =
"dods://testbedapps.sura.org/threddsdev/dodsC/inundation/FVCOM/ike/2Dvrwoww";
try {
NetcdfDataset ncd = NetcdfDataset.openDataset(urlStr);
List<CoordinateAxis> coordAxes =
ncd.getCoordinateAxes();
try {
double maxLon = -9999.999;
double minLon = 9999.999;
double maxLat = -9999.999;
double minLat = 9999.999;
for (CoordinateAxis coordAxis : coordAxes) {
if (coordAxis.getAxisType() ==
AxisType.Lat) {
minLat =
coordAxis.getMinValue();
maxLat =
coordAxis.getMaxValue();
}
if (coordAxis.getAxisType() ==
AxisType.Lon) {
minLon =
coordAxis.getMinValue();
maxLon =
coordAxis.getMaxValue();
}
}
System.out
.println("Using
coordAxis.getMinValue() method -----");
System.out.println("minLon=" + minLon);
System.out.println("maxLon=" + maxLon);
System.out.println("minLat=" + minLat);
System.out.println("maxLat=" + maxLat);
assertTrue(maxLon > -180.0);
} catch (Exception e) {
System.out
.println("Warning CF Axis
problem: " + e.getMessage());
}
} catch (Exception e) {
System.err.println(e);
}
}
@Test
public void getExtentUsing1DCoordTest() {
// String urlStr =
//
"dods://dods.ndbc.noaa.gov/thredds/dodsC/data/oceansites/DATA/ANTARES/OS_ANTARES-1_200509_D_CTD.nc";
// String varName = "LONGITUDE";
String urlStr =
"dods://testbedapps.sura.org/threddsdev/dodsC/inundation/FVCOM/ike/2Dvrwoww";
String lonName = "lon";
String latName = "lat";
try {
NetcdfDataset ncd = NetcdfDataset.openDataset(urlStr);
CoordinateAxis1D coordLon = (CoordinateAxis1D) ncd
.findVariable(lonName);
double maxLon = -9999.999;
double minLon = 9999.999;
double[] vals = coordLon.getCoordValues();
for (int i = 0; i < vals.length; i++) {
double lon = vals[i];
// System.out.println("lon=" + lon);
if (lon > maxLon) {
maxLon = lon;
}
if (lon < minLon) {
minLon = lon;
}
}
CoordinateAxis1D coordLat = (CoordinateAxis1D) ncd
.findVariable(latName);
double maxLat = -9999.999;
double minLat = 9999.999;
vals = coordLat.getCoordValues();
for (int i = 0; i < vals.length; i++) {
double lat = vals[i];
// System.out.println("lat=" + lat);
if (lat > maxLat) {
maxLat = lat;
}
if (lat < minLat) {
minLat = lat;
}
}
System.out.println("");
System.out.println("Using CoordinateAxis1D method
-----");
System.out.println("minLon=" + minLon);
System.out.println("maxLon=" + maxLon);
System.out.println("minLat=" + minLat);
System.out.println("maxLat=" + maxLat);
assertTrue(maxLon > -180.0);
} catch (Exception e) {
System.err.println(e);
}
}
@Test
public void getExtentUsingReadTest() {
// String urlStr =
//
"dods://dods.ndbc.noaa.gov/thredds/dodsC/data/oceansites/DATA/ANTARES/OS_ANTARES-1_200509_D_CTD.nc";
// String varName = "LONGITUDE";
String urlStr =
"dods://testbedapps.sura.org/threddsdev/dodsC/inundation/FVCOM/ike/2Dvrwoww";
String lonName = "lon";
String latName = "lat";
try {
NetcdfDataset ncd = NetcdfDataset.openDataset(urlStr);
Variable varLon = ncd.findVariable(lonName);
double maxLon = -9999.999;
double minLon = 9999.999;
Array vals = varLon.read();
for (int i = 0; i < vals.getSize(); i++) {
double lon = vals.getDouble(i);
// System.out.println("lon=" + lon);
if (lon > maxLon) {
maxLon = lon;
}
if (lon < minLon) {
minLon = lon;
}
}
Variable varLat = ncd.findVariable(latName);
double maxLat = -9999.999;
double minLat = 9999.999;
vals = varLat.read();
for (int i = 0; i < vals.getSize(); i++) {
double lat = vals.getDouble(i);
// System.out.println("lat=" + lat);
if (lat > maxLat) {
maxLat = lat;
}
if (lat < minLat) {
minLat = lat;
}
}
System.out.println("");
System.out.println("Using read method -----");
System.out.println("minLon=" + minLon);
System.out.println("maxLon=" + maxLon);
System.out.println("minLat=" + minLat);
System.out.println("maxLat=" + maxLat);
assertTrue(maxLon > -180.0);
} catch (Exception e) {
System.err.println(e);
}
}
}