diff --git a/.classpath b/.classpath index 756245a..f38b7ff 100644 --- a/.classpath +++ b/.classpath @@ -1,6 +1,7 @@ + diff --git a/netcdf_data.html b/netcdf_data.html new file mode 100644 index 0000000..91cbdee --- /dev/null +++ b/netcdf_data.html @@ -0,0 +1,411 @@ + + + + + + + + + + + + + + + + World Ocean Atlas 2009 data in NetCDF format + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
National Oceanic and Atmospheric AdministrationNODC, National Oceanographic Data CenterDepartment of Commerce
NOAA Satellite and Information Service
+ + + + + +
+ + + + + +
+ + +
+
+ + + +
World Ocean Atlas 2009 Data in NetCDF format +
Data are available courtesy of Upendra Dadi. +For any questions about this product, please e-mail OCLhelp desk. +

+The data can be accessed by using OpenDAP or +you can do simple analysis and visualization of the data using the NODC Live Access Server. + +The THREDDS page below have an OpenDAP link to the netCDF files. +
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Grid SizeVariableTime PeriodFTP Link to NetCDF fileTHREDDS LinkOpenDAP Metadata Link
1 DEGREETemperatureAnnualtemperature_annual_1deg.nctemperature_annual_1deg.nctemperature_annual_1deg.nc.info
Seasonaltemperature_seasonal_1deg.nctemperature_seasonal_1deg.nctemperature_seasonal_1deg.nc.info
Monthlytemperature_monthly_1deg.nctemperature_monthly_1deg.nctemperature_monthly_1deg.nc.info
SalinityAnnualsalinity_annual_1deg.ncsalinity_annual_1deg.ncsalinity_annual_1deg.nc.info
Seasonalsalinity_seasonal_1deg.ncsalinity_seasonal_1deg.ncsalinity_seasonal_1deg.nc.info
Monthlysalinity_monthly_1deg.ncsalinity_monthly_1deg.ncsalinity_monthly_1deg.nc.info
Dissolved OxygenAnnualdissolved_oxygen_annual_1deg.ncdissolved_oxygen_annual_1deg.ncdissolved_oxygen_annual_1deg.nc.info
Seasonaldissolved_oxygen_seasonal_1deg.ncdissolved_oxygen_seasonal_1deg.ncdissolved_oxygen_seasonal_1deg.nc.info
Monthlydissolved_oxygen_monthly_1deg.ncdissolved_oxygen_monthly_1deg.ncdissolved_oxygen_monthly_1deg.nc.info
Oxygen SaturationAnnualoxygen_saturation_annual_1deg.ncoxygen_saturation_annual_1deg.ncoxygen_saturation_annual_1deg.nc.info
Seasonaloxygen_saturation_seasonal_1deg.ncoxygen_saturation_seasonal_1deg.ncoxygen_saturation_seasonal_1deg.nc.info
Monthlyoxygen_saturation_monthly_1deg.ncoxygen_saturation_monthly_1deg.ncoxygen_saturation_monthly_1deg.nc.info
Apparent Oxygen
Utilization
Annualapparent_oxygen_utilization_annual_1deg.ncapparent_oxygen_utilization_annual_1deg.ncapparent_oxygen_utilization_annual_1deg.nc.info
Seasonalapparent_oxygen_utilization_seasonal_1deg.ncapparent_oxygen_utilization_seasonal_1deg.ncapparent_oxygen_utilization_seasonal_1deg.nc.info
Monthlyapparent_oxygen_utilization_monthly_1deg.ncapparent_oxygen_utilization_monthly_1deg.ncapparent_oxygen_utilization_monthly_1deg.nc.info
PhosphateAnnualphosphate_annual_1deg.ncphosphate_annual_1deg.ncphosphate_annual_1deg.nc.info
Seasonalphosphate_seasonal_1deg.ncphosphate_seasonal_1deg.ncphosphate_seasonal_1deg.nc.info
Monthlyphosphate_monthly_1deg.ncphosphate_monthly_1deg.ncphosphate_monthly_1deg.nc.info
SilicateAnnualsilicate_annual_1deg.ncsilicate_annual_1deg.ncsilicate_annual_1deg.nc.info
Seasonalsilicate_seasonal_1deg.ncsilicate_seasonal_1deg.ncsilicate_seasonal_1deg.nc.info
Monthlysilicate_monthly_1deg.ncsilicate_monthly_1deg.ncsilicate_monthly_1deg.nc.info
NitrateAnnualnitrate_annual_1deg.ncnitrate_annual_1deg.ncnitrate_annual_1deg.nc.info
Seasonalnitrate_seasonal_1deg.ncnitrate_seasonal_1deg.ncnitrate_seasonal_1deg.nc.info
Monthlynitrate_monthly_1deg.ncnitrate_monthly_1deg.ncnitrate_monthly_1deg.nc.info
5 DEGREETemperatureAnnualtemperature_annual_5deg.nctemperature_annual_5deg.nctemperature_annual_5deg.nc.info
Seasonaltemperature_seasonal_5deg.nctemperature_seasonal_5deg.nctemperature_seasonal_5deg.nc.info
Monthlytemperature_monthly_5deg.nctemperature_monthly_5deg.nctemperature_monthly_5deg.nc.info
SalinityAnnualsalinity_annual_5deg.ncsalinity_annual_5deg.ncsalinity_annual_5deg.nc.info
Seasonalsalinity_seasonal_5deg.ncsalinity_seasonal_5deg.ncsalinity_seasonal_5deg.nc.info
Monthlysalinity_monthly_5deg.ncsalinity_monthly_5deg.ncsalinity_monthly_5deg.nc.info
Dissolved OxygenAnnualdissolved_oxygen_annual_5deg.ncdissolved_oxygen_annual_5deg.ncdissolved_oxygen_annual_5deg.nc.info
Seasonaldissolved_oxygen_seasonal_5deg.ncdissolved_oxygen_seasonal_5deg.ncdissolved_oxygen_seasonal_5deg.nc.info
Monthlydissolved_oxygen_monthly_5deg.ncdissolved_oxygen_monthly_5deg.ncdissolved_oxygen_monthly_5deg.nc.info
Oxygen SaturationAnnualoxygen_saturation_annual_5deg.ncoxygen_saturation_annual_5deg.ncoxygen_saturation_annual_5deg.nc.info
Seasonaloxygen_saturation_seasonal_5deg.ncoxygen_saturation_seasonal_5deg.ncoxygen_saturation_seasonal_5deg.nc.info
Monthlyoxygen_saturation_monthly_5deg.ncoxygen_saturation_monthly_5deg.ncoxygen_saturation_monthly_5deg.nc.info
Apparent Oxygen
Utilization
Annualapparent_oxygen_utilization_annual_5deg.ncapparent_oxygen_utilization_annual_5deg.ncapparent_oxygen_utilization_annual_5deg.nc.info
Seasonalapparent_oxygen_utilization_seasonal_5deg.ncapparent_oxygen_utilization_seasonal_5deg.ncapparent_oxygen_utilization_seasonal_5deg.nc.info
Monthlyapparent_oxygen_utilization_monthly_5deg.ncapparent_oxygen_utilization_monthly_5deg.ncapparent_oxygen_utilization_monthly_5deg.nc.info
PhosphateAnnualphosphate_annual_5deg.ncphosphate_annual_5deg.ncphosphate_annual_5deg.nc.info
Seasonalphosphate_seasonal_5deg.ncphosphate_seasonal_5deg.ncphosphate_seasonal_5deg.nc.info
Monthlyphosphate_monthly_5deg.ncphosphate_monthly_5deg.ncphosphate_monthly_5deg.nc.info
SilicateAnnualsilicate_annual_5deg.ncsilicate_annual_5deg.ncsilicate_annual_5deg.nc.info
Seasonalsilicate_seasonal_5deg.ncsilicate_seasonal_5deg.ncsilicate_seasonal_5deg.nc.info
Monthlysilicate_monthly_5deg.ncsilicate_monthly_5deg.ncsilicate_monthly_5deg.nc.info
NitrateAnnualnitrate_annual_5deg.ncnitrate_annual_5deg.ncnitrate_annual_5deg.nc.info
Seasonalnitrate_seasonal_5deg.ncnitrate_seasonal_5deg.ncnitrate_seasonal_5deg.nc.info
Monthlynitrate_monthly_5deg.ncnitrate_monthly_5deg.ncnitrate_monthly_5deg.nc.info
+ +
+ + + + + + + + + + + + + + + + + + + + +
  + Last modified:    Mon, 9-Jul-2012 14:08 UTC + NODC.Webmaster@noaa.gov
 
Dept. of Commerce - NOAA - NESDIS - NODC
+
* Offsite Link Notification
+
+ + + +
USA.gov - The U.S. Government's Web Portal
+
+ + + + + + + diff --git a/src/main/java/org/gcube/dataanalysis/geo/insertion/ThreddsFetcher.java b/src/main/java/org/gcube/dataanalysis/geo/insertion/ThreddsFetcher.java index 362a9c1..688c14c 100644 --- a/src/main/java/org/gcube/dataanalysis/geo/insertion/ThreddsFetcher.java +++ b/src/main/java/org/gcube/dataanalysis/geo/insertion/ThreddsFetcher.java @@ -70,7 +70,9 @@ public class ThreddsFetcher { } // control if the file is yet on GN - String generatedTitle = generateTitle(filename, description, hStartDate, hEndDate, numberOfDimensions); +// String generatedTitle = generateTitle(filename, description, hStartDate, hEndDate, numberOfDimensions); + String generatedTitle = generateTitle(gds.getTitle()+": "+gds.getDescription(), description, hStartDate, hEndDate, numberOfDimensions); + CoordinateAxis xAxis = gdt.getCoordinateSystem().getXHorizAxis(); CoordinateAxis yAxis = gdt.getCoordinateSystem().getYHorizAxis(); AnalysisLogger.getLogger().debug("Bounds:"+xAxis.getMinValue()+","+yAxis.getMinValue()+","+xAxis.getMaxValue()+","+yAxis.getMaxValue()); @@ -87,8 +89,6 @@ public class ThreddsFetcher { } */ - - // get resolution - take the maximum regular step double resolutionX = Math.abs((double) (xAxis.getMaxValue() - xAxis.getMinValue()) / (double) xAxis.getShape()[0]); double resolutionY = Math.abs((double) (yAxis.getMaxValue() - yAxis.getMinValue()) / (double) yAxis.getShape()[0]); @@ -106,7 +106,7 @@ public class ThreddsFetcher { metadataInserter.setSourceFileName(filename); // insert ranges and sampling metadataInserter.setTitle(generatedTitle); - metadataInserter.setAbstractField(generateAbstractField(gdt.getFullName(), filename, description, gdt.getUnitsString().trim(), hStartDate, hEndDate, duration, resolution, numberOfDimensions)); + metadataInserter.setAbstractField(generateAbstractField(gdt.getFullName(), filename, description, gdt.getUnitsString().trim(), hStartDate, hEndDate, duration, resolution, numberOfDimensions, gds.getTitle(), gds.getDescription())); metadataInserter.setResolution(Math.max(resolutionX, resolutionY)); // set Bounding box @@ -116,7 +116,7 @@ public class ThreddsFetcher { metadataInserter.setYRightUpper(ThreddsDataExplorer.getMaxY(gdt.getCoordinateSystem())); //set keywords - metadataInserter.setCustomTopics(filename, description,numberOfDimensions+"D"); + metadataInserter.setCustomTopics(filename, description,numberOfDimensions+"D",gds.getTitle(),gds.getDescription()); //set Temporal Extent if (hStartDate!=null){ metadataInserter.setStartDate(dr.getStart().getDate()); @@ -143,10 +143,13 @@ public class ThreddsFetcher { else dateString = " from [" + startDate + "] to [" + endDate + "]"; } - return description.replaceAll("( )+", " ") + dateString+" (" + numberOfDimensions+ "D) {" + filename + "}"; + + description = description + " "+dateString+" (" + numberOfDimensions+ "D) {" + filename + "}"; + + return description.replaceAll("( )+", " "); } - public static String generateAbstractField(String layername, String filename, String description, String unit, String startDate, String endDate, String duration, String timeInstants, int numberOfDimensions) { + public static String generateAbstractField(String layername, String filename, String description, String unit, String startDate, String endDate, String duration, String timeInstants, int numberOfDimensions, String netcdftitle, String netcdfdescription) { String timeresolutionString = ""; String durationString = ""; if ((timeInstants != null) && (timeInstants.length() > 0)) @@ -166,7 +169,12 @@ public class ThreddsFetcher { String numberOfDimensionsString = ""; if (numberOfDimensions>0) numberOfDimensionsString = " Number of Dimensions: "+numberOfDimensions+"."; - return layername + ": " + description + unitString+dateString + durationString + timeresolutionString + numberOfDimensionsString+ " Taken from the file " + filename + " resident on a THREDDS instance."; + + String netcdfinfo = ""; + if (netcdftitle!=null) + netcdfinfo = " "+netcdftitle+": "+netcdfdescription+"."; + + return layername + ": " + description + unitString+dateString + durationString + timeresolutionString + numberOfDimensionsString+netcdfinfo+" Local file in iMarine: " + filename + "."; } public static void main(String[] args) throws Exception { diff --git a/src/main/java/org/gcube/dataanalysis/geo/utils/CrsHelper.java b/src/main/java/org/gcube/dataanalysis/geo/utils/CrsHelper.java new file mode 100644 index 0000000..6bf0c3a --- /dev/null +++ b/src/main/java/org/gcube/dataanalysis/geo/utils/CrsHelper.java @@ -0,0 +1,190 @@ +/* + * Copyright (c) 2009 The University of Reading + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * 1. Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in the + * documentation and/or other materials provided with the distribution. + * 3. Neither the name of the University of Reading, nor the names of the + * authors or contributors may be used to endorse or promote products + * derived from this software without specific prior written permission. + * + * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR + * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. + * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT + * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +package org.gcube.dataanalysis.geo.utils; + +import java.util.ArrayList; +import java.util.List; + +import org.geotoolkit.referencing.CRS; +import org.geotoolkit.referencing.crs.DefaultGeographicCRS; +import org.opengis.referencing.crs.CoordinateReferenceSystem; +import org.opengis.referencing.cs.CoordinateSystemAxis; +import org.opengis.referencing.operation.MathTransform; +import org.opengis.referencing.operation.TransformException; + +import ucar.unidata.geoloc.LatLonPoint; +import ucar.unidata.geoloc.LatLonPointImpl; +import ucar.unidata.geoloc.ProjectionPoint; +import ucar.unidata.geoloc.ProjectionPointImpl; + +/** + * This class wraps the GeoTools/GeoAPI coordinate reference system methods, providing a set of convenience methods such as transformations and validity checks. + * + * @todo this object is immutable and could be re-used. + * @author Jon + */ +public final class CrsHelper { + + public static final String PLATE_CARREE_CRS_CODE = "CRS:84"; + public static final List SUPPORTED_CRS_CODES = new ArrayList(); + + private CoordinateReferenceSystem crs; + private MathTransform crsToLatLon; + private MathTransform latLonToCrs; + private boolean isLatLon; + + static { + // Find the supported CRS codes + // I think this is the appropriate method to get all the CRS codes + // that we can support + for (Object codeObj : CRS.getSupportedCodes("urn:ogc:def")) { + SUPPORTED_CRS_CODES.add((String) codeObj); + } + } + + /** Private constructor to prevent direct instantiation */ + private CrsHelper() { + } + + public static CrsHelper fromCrsCode(String crsCode) throws Exception { + // TODO: could cache CrsHelpers with the same code + CrsHelper crsHelper = new CrsHelper(); + try { + // The "true" means "force longitude first" axis order + crsHelper.crs = CRS.decode(crsCode, true); + // Get transformations to and from lat-lon. + // The "true" means "lenient", i.e. ignore datum shifts. This + // is necessary to prevent "Bursa wolf parameters required" + // errors (Some CRSs, including British National Grid, fail if + // we are not "lenient".) + crsHelper.crsToLatLon = CRS.findMathTransform(crsHelper.crs, DefaultGeographicCRS.WGS84, true); + crsHelper.latLonToCrs = CRS.findMathTransform(DefaultGeographicCRS.WGS84, crsHelper.crs, true); + crsHelper.isLatLon = crsHelper.crsToLatLon.isIdentity(); + return crsHelper; + } catch (Exception e) { + throw new Exception("Error creating CrsHelper from code " + crsCode); + } + } + + public CoordinateReferenceSystem getCoordinateReferenceSystem() { + return this.crs; + } + + /** + * @return true if the given coordinate pair is within the valid range of both the x and y axis of this coordinate reference system. + */ + public boolean isPointValidForCrs(ProjectionPoint point) { + return this.isPointValidForCrs(point.getX(), point.getY()); + } + + /** + * @return true if the given coordinate pair is within the valid range of both the x and y axis of this coordinate reference system. + */ + public boolean isPointValidForCrs(double x, double y) { + CoordinateSystemAxis xAxis = this.crs.getCoordinateSystem().getAxis(0); + CoordinateSystemAxis yAxis = this.crs.getCoordinateSystem().getAxis(1); + return x >= xAxis.getMinimumValue() && x <= xAxis.getMaximumValue() && y >= yAxis.getMinimumValue() && y <= yAxis.getMaximumValue(); + } + + /** + * Transforms the given x-y point in this {@link #getCoordinateReferenceSystem() CRS} to a LatLonPoint. + * + * @throws TransformException + * if the required transformation could not be performed + */ + public LatLonPoint crsToLatLon(double x, double y) throws TransformException { + if (this.isLatLon) { + // We don't need to do the transformation + return new LatLonPointImpl(y, x); + } + // We know x must go first in this array because we selected + // "force longitude-first" when creating the CRS for this grid + double[] point = new double[] { x, y }; + // Transform to lat-lon in-place + this.crsToLatLon.transform(point, 0, point, 0, 1); + return new LatLonPointImpl(point[1], point[0]); + } + + /** + * Transforms the given x-y point in this {@link #getCoordinateReferenceSystem() CRS} to a LatLonPoint. + * + * @throws TransformException + * if the required transformation could not be performed + */ + public LatLonPoint crsToLatLon(ProjectionPoint point) throws TransformException { + return this.crsToLatLon(point.getX(), point.getY()); + } + + /** + * Transforms the given LatLonPoint to an x-y point in this {@link #getCoordinateReferenceSystem() CRS}. + * + * @throws TransformException + * if the required transformation could not be performed + */ + public ProjectionPoint latLonToCrs(LatLonPoint latLonPoint) throws TransformException { + return this.latLonToCrs(latLonPoint.getLongitude(), latLonPoint.getLatitude()); + } + + /** + * Transforms the given longitude-latitude point to an x-y point in this {@link #getCoordinateReferenceSystem() CRS}. + * + * @throws TransformException + * if the required transformation could not be performed + */ + public ProjectionPoint latLonToCrs(double longitude, double latitude) throws TransformException { + if (this.isLatLon) { + // We don't need to do the transformation + return new ProjectionPointImpl(longitude, latitude); + } + // We know x must go first in this array because we selected + // "force longitude-first" when creating the CRS for this grid + double[] point = new double[] { longitude, latitude }; + // Transform to lat-lon in-place + this.latLonToCrs.transform(point, 0, point, 0, 1); + return new ProjectionPointImpl(point[0], point[1]); + } + + /** + * @return true if this crs is lat-lon + */ + public boolean isLatLon() { + return this.isLatLon; + } + + public static void main(String[] args) throws Exception{ + CrsHelper helper = fromCrsCode("CRS:84"); +// boolean valid = helper.isPointValidForCrs(180, 0); +// System.out.println(valid); + LatLonPoint point = helper.crsToLatLon(190,10); + double x = point.getLongitude(); + double y = point.getLatitude(); + System.out.println(point+" ("+x+","+y+")"); + } + +} diff --git a/src/main/java/org/gcube/dataanalysis/geo/utils/ThreddsDataExplorer.java b/src/main/java/org/gcube/dataanalysis/geo/utils/ThreddsDataExplorer.java index 18aab3a..562a0f1 100644 --- a/src/main/java/org/gcube/dataanalysis/geo/utils/ThreddsDataExplorer.java +++ b/src/main/java/org/gcube/dataanalysis/geo/utils/ThreddsDataExplorer.java @@ -259,20 +259,22 @@ public class ThreddsDataExplorer { } public static double adjX(double x) { + /* if (x < -180) x = -180; if (x > 180) x = 180; - + */ return x; } public static double adjY(double y) { + /* if (y < -90) y = -90; if (y > 90) y = 90; - + */ return y; } diff --git a/temperature_annual_1deg.nc b/temperature_annual_1deg.nc new file mode 100644 index 0000000..e946858 Binary files /dev/null and b/temperature_annual_1deg.nc differ diff --git a/wgetfiles.sh b/wgetfiles.sh new file mode 100644 index 0000000..a944bcb --- /dev/null +++ b/wgetfiles.sh @@ -0,0 +1,48 @@ +wget --output-document=temperature_annual_1deg_ENVIRONMENT_OCEANS_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/temperature_annual_1deg.nc +wget --output-document=temperature_seasonal_1deg_ENVIRONMENT_OCEANS_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/temperature_seasonal_1deg.nc +wget --output-document=temperature_monthly_1deg_ENVIRONMENT_OCEANS_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/temperature_monthly_1deg.nc +wget --output-document=salinity_annual_1deg_ENVIRONMENT_OCEANS_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/salinity_annual_1deg.nc +wget --output-document=salinity_seasonal_1deg_ENVIRONMENT_OCEANS_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/salinity_seasonal_1deg.nc +wget --output-document=salinity_monthly_1deg_ENVIRONMENT_OCEANS_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/salinity_monthly_1deg.nc +wget --output-document=dissolved_oxygen_annual_1deg_ENVIRONMENT_BIOTA_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/dissolved_oxygen_annual_1deg.nc +wget --output-document=dissolved_oxygen_seasonal_1deg_ENVIRONMENT_BIOTA_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/dissolved_oxygen_seasonal_1deg.nc +wget --output-document=dissolved_oxygen_monthly_1deg_ENVIRONMENT_BIOTA_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/dissolved_oxygen_monthly_1deg.nc +wget --output-document=oxygen_saturation_annual_1deg_ENVIRONMENT_BIOTA_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/oxygen_saturation_annual_1deg.nc +wget --output-document=oxygen_saturation_seasonal_1deg_ENVIRONMENT_BIOTA_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/oxygen_saturation_seasonal_1deg.nc +wget --output-document=oxygen_saturation_monthly_1deg_ENVIRONMENT_BIOTA_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/oxygen_saturation_monthly_1deg.nc +wget --output-document=apparent_oxygen_utilization_annual_1deg_ENVIRONMENT_BIOTA_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/apparent_oxygen_utilization_annual_1deg.nc +wget --output-document=apparent_oxygen_utilization_seasonal_1deg_ENVIRONMENT_BIOTA_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/apparent_oxygen_utilization_seasonal_1deg.nc +wget --output-document=apparent_oxygen_utilization_monthly_1deg_ENVIRONMENT_BIOTA_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/apparent_oxygen_utilization_monthly_1deg.nc +wget --output-document=phosphate_annual_1deg_ENVIRONMENT_BIOTA_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/phosphate_annual_1deg.nc +wget --output-document=phosphate_seasonal_1deg_ENVIRONMENT_BIOTA_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/phosphate_seasonal_1deg.nc +wget --output-document=phosphate_monthly_1deg_ENVIRONMENT_BIOTA_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/phosphate_monthly_1deg.nc +wget --output-document=silicate_annual_1deg_ENVIRONMENT_BIOTA_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/silicate_annual_1deg.nc +wget --output-document=silicate_seasonal_1deg_ENVIRONMENT_BIOTA_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/silicate_seasonal_1deg.nc +wget --output-document=silicate_monthly_1deg_ENVIRONMENT_BIOTA_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/silicate_monthly_1deg.nc +wget --output-document=nitrate_annual_1deg_ENVIRONMENT_BIOTA_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/nitrate_annual_1deg.nc +wget --output-document=nitrate_seasonal_1deg_ENVIRONMENT_BIOTA_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/nitrate_seasonal_1deg.nc +wget --output-document=nitrate_monthly_1deg_ENVIRONMENT_BIOTA_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/nitrate_monthly_1deg.nc +wget --output-document=temperature_annual_5deg_ENVIRONMENT_OCEANS_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/temperature_annual_5deg.nc +wget --output-document=temperature_seasonal_5deg_ENVIRONMENT_OCEANS_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/temperature_seasonal_5deg.nc +wget --output-document=temperature_monthly_5deg_ENVIRONMENT_OCEANS_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/temperature_monthly_5deg.nc +wget --output-document=salinity_annual_5deg_ENVIRONMENT_OCEANS_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/salinity_annual_5deg.nc +wget --output-document=salinity_seasonal_5deg_ENVIRONMENT_OCEANS_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/salinity_seasonal_5deg.nc +wget --output-document=salinity_monthly_5deg_ENVIRONMENT_OCEANS_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/salinity_monthly_5deg.nc +wget --output-document=dissolved_oxygen_annual_5deg_ENVIRONMENT_BIOTA_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/dissolved_oxygen_annual_5deg.nc +wget --output-document=dissolved_oxygen_seasonal_5deg_ENVIRONMENT_BIOTA_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/dissolved_oxygen_seasonal_5deg.nc +wget --output-document=dissolved_oxygen_monthly_5deg_ENVIRONMENT_BIOTA_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/dissolved_oxygen_monthly_5deg.nc +wget --output-document=oxygen_saturation_annual_5deg_ENVIRONMENT_BIOTA_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/oxygen_saturation_annual_5deg.nc +wget --output-document=oxygen_saturation_seasonal_5deg_ENVIRONMENT_BIOTA_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/oxygen_saturation_seasonal_5deg.nc +wget --output-document=oxygen_saturation_monthly_5deg_ENVIRONMENT_BIOTA_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/oxygen_saturation_monthly_5deg.nc +wget --output-document=apparent_oxygen_utilization_annual_5deg_ENVIRONMENT_BIOTA_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/apparent_oxygen_utilization_annual_5deg.nc +wget --output-document=apparent_oxygen_utilization_seasonal_5deg_ENVIRONMENT_BIOTA_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/apparent_oxygen_utilization_seasonal_5deg.nc +wget --output-document=apparent_oxygen_utilization_monthly_5deg_ENVIRONMENT_BIOTA_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/apparent_oxygen_utilization_monthly_5deg.nc +wget --output-document=phosphate_annual_5deg_ENVIRONMENT_BIOTA_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/phosphate_annual_5deg.nc +wget --output-document=phosphate_seasonal_5deg_ENVIRONMENT_BIOTA_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/phosphate_seasonal_5deg.nc +wget --output-document=phosphate_monthly_5deg_ENVIRONMENT_BIOTA_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/phosphate_monthly_5deg.nc +wget --output-document=silicate_annual_5deg_ENVIRONMENT_BIOTA_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/silicate_annual_5deg.nc +wget --output-document=silicate_seasonal_5deg_ENVIRONMENT_BIOTA_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/silicate_seasonal_5deg.nc +wget --output-document=silicate_monthly_5deg_ENVIRONMENT_BIOTA_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/silicate_monthly_5deg.nc +wget --output-document=nitrate_annual_5deg_ENVIRONMENT_BIOTA_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/nitrate_annual_5deg.nc +wget --output-document=nitrate_seasonal_5deg_ENVIRONMENT_BIOTA_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/nitrate_seasonal_5deg.nc +wget --output-document=nitrate_monthly_5deg_ENVIRONMENT_BIOTA_.nc http://data.nodc.noaa.gov/thredds/fileServer/woa/WOA09/NetCDFdata/nitrate_monthly_5deg.nc