diff --git a/cdm/core/src/main/java/ucar/nc2/ft/DsgFeatureCollection.java b/cdm/core/src/main/java/ucar/nc2/ft/DsgFeatureCollection.java index a333b73b35..228c11b851 100644 --- a/cdm/core/src/main/java/ucar/nc2/ft/DsgFeatureCollection.java +++ b/cdm/core/src/main/java/ucar/nc2/ft/DsgFeatureCollection.java @@ -7,6 +7,7 @@ import javax.annotation.Nonnull; import javax.annotation.Nullable; import ucar.nc2.Variable; +import ucar.nc2.dataset.CoordinateAxis; import ucar.nc2.time.CalendarDateRange; import ucar.nc2.time.CalendarDateUnit; import java.util.List; @@ -36,20 +37,20 @@ public interface DsgFeatureCollection { ucar.nc2.constants.FeatureType getCollectionFeatureType(); /** - * The name of time unit. + * The name of time unit, if there is a time axis. * - * @return name of time unit string, may not be null + * @return name of time unit string, may be null */ - @Nonnull + @Nullable String getTimeName(); /** - * The time unit. + * The time unit, if there is a time axis. * - * @return time unit, may not be null + * @return time unit, may be null */ - @Nonnull + @Nullable CalendarDateUnit getTimeUnit(); /** @@ -68,6 +69,14 @@ public interface DsgFeatureCollection { @Nullable String getAltUnits(); + /** + * The list of coordinate variables in the collection + * + * @return the list of coordinate variables, may be empty but not null; + */ + @Nonnull + List getCoordinateVariables(); + /* * Other variables needed for completeness, eg joined coordinate variables * diff --git a/cdm/core/src/main/java/ucar/nc2/ft/FeatureDatasetFactoryManager.java b/cdm/core/src/main/java/ucar/nc2/ft/FeatureDatasetFactoryManager.java index 8f3bca76b8..e10e00343b 100644 --- a/cdm/core/src/main/java/ucar/nc2/ft/FeatureDatasetFactoryManager.java +++ b/cdm/core/src/main/java/ucar/nc2/ft/FeatureDatasetFactoryManager.java @@ -330,17 +330,6 @@ private static FeatureDataset wrapUnknown(NetcdfDataset ncd, ucar.nc2.util.Cance if (ft != null) return wrap(ft, ncd, task, errlog); - /* - * grids dont usually have a FeatureType attribute, so check these fist - * if (isGrid(ncd.getCoordinateSystems())) { - * ucar.nc2.dt.grid.GridDataset gds = new ucar.nc2.dt.grid.GridDataset(ncd); // LOOK - * if (gds.getGrids().size() > 0) { - * if (debug) System.out.println(" wrapUnknown found grids "); - * return gds; - * } - * } - */ - // find a Factory that claims this dataset Object analysis = null; FeatureDatasetFactory useFactory = null; @@ -355,16 +344,6 @@ private static FeatureDataset wrapUnknown(NetcdfDataset ncd, ucar.nc2.util.Cance } } - /* - * try again as a Grid - * if (null == useFactory) { - * // if no datatype was requested, give em a GridDataset only if some Grids are found. - * ucar.nc2.dt.grid.GridDataset gds = new ucar.nc2.dt.grid.GridDataset(ncd); - * if (gds.getGrids().size() > 0) - * return gds; - * } - */ - // Fail if (null == useFactory) { errlog.format("Failed (wrapUnknown) to find Datatype Factory for= %s%n", ncd.getLocation()); @@ -375,26 +354,6 @@ private static FeatureDataset wrapUnknown(NetcdfDataset ncd, ucar.nc2.util.Cance return useFactory.open(null, ncd, analysis, task, errlog); } - /* - * static private boolean isGrid(java.util.List csysList) { - * CoordinateSystem use = null; - * for (CoordinateSystem csys : csysList) { - * if (use == null) use = csys; - * else if (csys.getCoordinateAxes().size() > use.getCoordinateAxes().size()) - * use = csys; - * } - * - * if (use == null) return false; - * CoordinateAxis lat = use.getLatAxis(); - * CoordinateAxis lon = use.getLonAxis(); - * if ((lat != null) && (lat.getSize() <= 1)) return false; // COARDS singletons - * if ((lon != null) && (lon.getSize() <= 1)) return false; - * - * // hueristics - cant say i like this, multidim point features could easily violate - * return (use.getRankDomain() > 2) && (use.getRankDomain() <= use.getRankRange()); - * } - */ - /** * Determine if factory type matches wanted feature type. * diff --git a/cdm/core/src/main/java/ucar/nc2/ft/point/DsgCollectionImpl.java b/cdm/core/src/main/java/ucar/nc2/ft/point/DsgCollectionImpl.java index ee61fdff45..555dd07222 100644 --- a/cdm/core/src/main/java/ucar/nc2/ft/point/DsgCollectionImpl.java +++ b/cdm/core/src/main/java/ucar/nc2/ft/point/DsgCollectionImpl.java @@ -5,6 +5,7 @@ package ucar.nc2.ft.point; import ucar.nc2.Variable; +import ucar.nc2.dataset.CoordinateAxis; import ucar.nc2.ft.DsgFeatureCollection; import ucar.nc2.time.CalendarDateRange; import ucar.nc2.time.CalendarDateUnit; @@ -27,6 +28,7 @@ public abstract class DsgCollectionImpl implements DsgFeatureCollection { protected String altName = "altitude"; protected String altUnits; protected CollectionInfo info; + protected List coordVars; protected List extras; // variables needed to make CF/DSG writing work protected DsgCollectionImpl(String name, CalendarDateUnit timeUnit, String altUnits) { @@ -35,13 +37,19 @@ protected DsgCollectionImpl(String name, CalendarDateUnit timeUnit, String altUn this.altUnits = altUnits; } - protected DsgCollectionImpl(String name, String timeName, CalendarDateUnit timeUnit, String altName, - String altUnits) { + protected DsgCollectionImpl(String name, List coordVars) { this.name = name; - this.timeName = timeName; - this.timeUnit = timeUnit; - this.altName = altName; - this.altUnits = altUnits; + this.coordVars = coordVars; + + for (CoordinateAxis coord : coordVars) { + if (coord.getAxisType().isTime()) { + this.timeUnit = CalendarDateUnit.of(null, coord.getUnitsString()); + this.timeName = coord.getShortName(); + } else if (coord.getAxisType().isVert()) { + this.altUnits = coord.getUnitsString(); + this.altName = coord.getShortName(); + } + } } @Nonnull @@ -50,13 +58,13 @@ public String getName() { return name; } - @Nonnull + @Nullable @Override public String getTimeName() { return timeName; } - @Nonnull + @Nullable @Override public CalendarDateUnit getTimeUnit() { return timeUnit; @@ -74,6 +82,12 @@ public String getAltUnits() { return altUnits; } + @Nonnull + @Override + public List getCoordinateVariables() { + return this.coordVars; + } + @Nonnull public List getExtraVariables() { return (extras == null) ? new ArrayList<>() : extras; diff --git a/cdm/core/src/main/java/ucar/nc2/ft/point/PointCollectionImpl.java b/cdm/core/src/main/java/ucar/nc2/ft/point/PointCollectionImpl.java index 8209544f8d..cd39985819 100644 --- a/cdm/core/src/main/java/ucar/nc2/ft/point/PointCollectionImpl.java +++ b/cdm/core/src/main/java/ucar/nc2/ft/point/PointCollectionImpl.java @@ -6,8 +6,10 @@ import java.io.IOException; import java.util.Iterator; +import java.util.List; import javax.annotation.Nonnull; import ucar.nc2.constants.FeatureType; +import ucar.nc2.dataset.CoordinateAxis; import ucar.nc2.ft.PointFeature; import ucar.nc2.ft.PointFeatureCollection; import ucar.nc2.ft.PointFeatureIterator; @@ -28,9 +30,8 @@ protected PointCollectionImpl(String name, CalendarDateUnit timeUnit, String alt super(name, timeUnit, altUnits); } - protected PointCollectionImpl(String name, String timeName, CalendarDateUnit timeUnit, String altName, - String altUnits) { - super(name, timeName, timeUnit, altName, altUnits); + protected PointCollectionImpl(String name, List coordVars) { + super(name, coordVars); } @Nonnull @@ -61,7 +62,7 @@ protected static class PointCollectionSubset extends PointCollectionImpl { protected CalendarDateRange filter_date; public PointCollectionSubset(PointCollectionImpl from, LatLonRect filter_bb, CalendarDateRange filter_date) { - super(from.name, from.getTimeName(), from.getTimeUnit(), from.getAltName(), from.getAltUnits()); + super(from.name, from.timeUnit, from.altUnits); this.from = from; this.filter_bb = filter_bb; this.filter_date = filter_date; diff --git a/cdm/core/src/main/java/ucar/nc2/ft/point/PointFeatureCCCImpl.java b/cdm/core/src/main/java/ucar/nc2/ft/point/PointFeatureCCCImpl.java index e0df6ab101..1b39b36375 100644 --- a/cdm/core/src/main/java/ucar/nc2/ft/point/PointFeatureCCCImpl.java +++ b/cdm/core/src/main/java/ucar/nc2/ft/point/PointFeatureCCCImpl.java @@ -4,10 +4,12 @@ */ package ucar.nc2.ft.point; +import ucar.nc2.dataset.CoordinateAxis; import ucar.nc2.ft.*; import ucar.nc2.time.CalendarDateUnit; import ucar.nc2.constants.FeatureType; import javax.annotation.Nonnull; +import java.util.List; /** * Abstract superclass for multiply nested NestedPointFeatureCollection @@ -25,9 +27,8 @@ protected PointFeatureCCCImpl(String name, CalendarDateUnit timeUnit, String alt this.collectionFeatureType = collectionFeatureType; } - protected PointFeatureCCCImpl(String name, String timeName, CalendarDateUnit timeUnit, String altName, - String altUnits, FeatureType collectionFeatureType) { - super(name, timeName, timeUnit, altName, altUnits); + protected PointFeatureCCCImpl(String name, List coords, FeatureType collectionFeatureType) { + super(name, coords); this.collectionFeatureType = collectionFeatureType; } diff --git a/cdm/core/src/main/java/ucar/nc2/ft/point/PointFeatureCCImpl.java b/cdm/core/src/main/java/ucar/nc2/ft/point/PointFeatureCCImpl.java index ff5411002d..142dfc0077 100644 --- a/cdm/core/src/main/java/ucar/nc2/ft/point/PointFeatureCCImpl.java +++ b/cdm/core/src/main/java/ucar/nc2/ft/point/PointFeatureCCImpl.java @@ -5,8 +5,10 @@ package ucar.nc2.ft.point; import java.io.IOException; +import java.util.List; import javax.annotation.Nonnull; import ucar.nc2.constants.FeatureType; +import ucar.nc2.dataset.CoordinateAxis; import ucar.nc2.ft.PointFeatureCC; import ucar.nc2.ft.PointFeatureIterator; import ucar.nc2.time.CalendarDateRange; @@ -29,9 +31,9 @@ protected PointFeatureCCImpl(String name, CalendarDateUnit timeUnit, String altU this.collectionFeatureType = collectionFeatureType; } - protected PointFeatureCCImpl(String name, String timeName, CalendarDateUnit timeUnit, String altName, String altUnits, - FeatureType collectionFeatureType) { - super(name, timeName, timeUnit, altName, altUnits); + + protected PointFeatureCCImpl(String name, List coords, FeatureType collectionFeatureType) { + super(name, coords); this.collectionFeatureType = collectionFeatureType; } diff --git a/cdm/core/src/main/java/ucar/nc2/ft/point/ProfileFeatureImpl.java b/cdm/core/src/main/java/ucar/nc2/ft/point/ProfileFeatureImpl.java index 363c846877..a8602df5a9 100644 --- a/cdm/core/src/main/java/ucar/nc2/ft/point/ProfileFeatureImpl.java +++ b/cdm/core/src/main/java/ucar/nc2/ft/point/ProfileFeatureImpl.java @@ -6,10 +6,13 @@ import javax.annotation.Nonnull; import ucar.nc2.constants.FeatureType; +import ucar.nc2.dataset.CoordinateAxis; import ucar.nc2.ft.ProfileFeature; import ucar.nc2.time.CalendarDateUnit; import ucar.unidata.geoloc.LatLonPoint; +import java.util.List; + /** * Abstract superclass for implementations of ProfileFeature. * @@ -31,9 +34,9 @@ public ProfileFeatureImpl(String name, CalendarDateUnit timeUnit, String altUnit } } - public ProfileFeatureImpl(String name, String timeName, CalendarDateUnit timeUnit, String altName, String altUnits, - double lat, double lon, double time, int nfeatures) { - super(name, timeName, timeUnit, altName, altUnits); + public ProfileFeatureImpl(String name, List coords, double lat, double lon, double time, + int nfeatures) { + super(name, coords); this.latlonPoint = LatLonPoint.create(lat, lon); this.time = time; if (nfeatures >= 0) { diff --git a/cdm/core/src/main/java/ucar/nc2/ft/point/SectionCollectionImpl.java b/cdm/core/src/main/java/ucar/nc2/ft/point/SectionCollectionImpl.java index edc4f2c2bd..eaf396eb8a 100644 --- a/cdm/core/src/main/java/ucar/nc2/ft/point/SectionCollectionImpl.java +++ b/cdm/core/src/main/java/ucar/nc2/ft/point/SectionCollectionImpl.java @@ -5,7 +5,10 @@ package ucar.nc2.ft.point; import java.io.IOException; +import java.util.List; + import ucar.nc2.constants.FeatureType; +import ucar.nc2.dataset.CoordinateAxis; import ucar.nc2.ft.PointFeatureCCIterator; import ucar.nc2.ft.TrajectoryProfileFeature; import ucar.nc2.ft.TrajectoryProfileFeatureCollection; @@ -21,9 +24,12 @@ public abstract class SectionCollectionImpl extends PointFeatureCCCImpl implements TrajectoryProfileFeatureCollection { - protected SectionCollectionImpl(String name, String timeName, CalendarDateUnit timeUnit, String altName, - String altUnits) { - super(name, timeName, timeUnit, altName, altUnits, FeatureType.TRAJECTORY_PROFILE); + protected SectionCollectionImpl(String name, CalendarDateUnit timeUnit, String altUnits) { + super(name, timeUnit, altUnits, FeatureType.TRAJECTORY_PROFILE); + } + + protected SectionCollectionImpl(String name, List coords) { + super(name, coords, FeatureType.TRAJECTORY_PROFILE); } ///////////////////////////////////////////////////////////////////////////////////// diff --git a/cdm/core/src/main/java/ucar/nc2/ft/point/SectionFeatureImpl.java b/cdm/core/src/main/java/ucar/nc2/ft/point/SectionFeatureImpl.java index 0522606176..404f659aac 100644 --- a/cdm/core/src/main/java/ucar/nc2/ft/point/SectionFeatureImpl.java +++ b/cdm/core/src/main/java/ucar/nc2/ft/point/SectionFeatureImpl.java @@ -23,9 +23,9 @@ public abstract class SectionFeatureImpl extends PointFeatureCCImpl implements TrajectoryProfileFeature { - protected SectionFeatureImpl(String name, String timeName, CalendarDateUnit timeUnit, String altName, - String altUnits) { - super(name, timeName, timeUnit, altName, altUnits, FeatureType.TRAJECTORY_PROFILE); + + protected SectionFeatureImpl(String name, CalendarDateUnit timeUnit, String altUnits) { + super(name, timeUnit, altUnits, FeatureType.TRAJECTORY_PROFILE); } ///////////////////////////////////////////////////////////////////////////////////// diff --git a/cdm/core/src/main/java/ucar/nc2/ft/point/StationProfileCollectionImpl.java b/cdm/core/src/main/java/ucar/nc2/ft/point/StationProfileCollectionImpl.java index 1835602840..3ebb9b5637 100644 --- a/cdm/core/src/main/java/ucar/nc2/ft/point/StationProfileCollectionImpl.java +++ b/cdm/core/src/main/java/ucar/nc2/ft/point/StationProfileCollectionImpl.java @@ -9,6 +9,7 @@ import java.util.Iterator; import java.util.List; import ucar.nc2.constants.FeatureType; +import ucar.nc2.dataset.CoordinateAxis; import ucar.nc2.ft.PointFeatureCC; import ucar.nc2.ft.PointFeatureCCIterator; import ucar.nc2.ft.StationProfileFeature; @@ -34,9 +35,8 @@ public StationProfileCollectionImpl(String name, CalendarDateUnit timeUnit, Stri super(name, timeUnit, altUnits, FeatureType.STATION_PROFILE); } - public StationProfileCollectionImpl(String name, String timeName, CalendarDateUnit timeUnit, String altName, - String altUnits) { - super(name, timeName, timeUnit, altName, altUnits, FeatureType.STATION_PROFILE); + public StationProfileCollectionImpl(String name, List coordVars) { + super(name, coordVars, FeatureType.STATION_PROFILE); } // Double-check idiom for lazy initialization of instance fields. See Effective Java 2nd Ed, p. 283. @@ -135,7 +135,7 @@ private static class StationProfileFeatureCollectionSubset extends StationProfil private final List stations; StationProfileFeatureCollectionSubset(StationProfileCollectionImpl from, List stations) { - super(from.getName(), from.getTimeName(), from.getTimeUnit(), from.getAltName(), from.getAltUnits()); + super(from.getName(), from.getTimeUnit(), from.getAltUnits()); this.from = from; this.stations = stations; } diff --git a/cdm/core/src/main/java/ucar/nc2/ft/point/StationProfileFeatureImpl.java b/cdm/core/src/main/java/ucar/nc2/ft/point/StationProfileFeatureImpl.java index 9d356f94ba..1c8bcabc2c 100644 --- a/cdm/core/src/main/java/ucar/nc2/ft/point/StationProfileFeatureImpl.java +++ b/cdm/core/src/main/java/ucar/nc2/ft/point/StationProfileFeatureImpl.java @@ -11,6 +11,7 @@ import javax.annotation.Nonnull; import ucar.ma2.StructureData; import ucar.nc2.constants.FeatureType; +import ucar.nc2.dataset.CoordinateAxis; import ucar.nc2.ft.PointFeatureCollection; import ucar.nc2.ft.PointFeatureCollectionIterator; import ucar.nc2.ft.ProfileFeature; @@ -43,22 +44,14 @@ public StationProfileFeatureImpl(String name, String desc, String wmoId, double this.timeSeriesNpts = npts; } - public StationProfileFeatureImpl(String name, String desc, String wmoId, double lat, double lon, double alt, - String timeName, CalendarDateUnit timeUnit, String altName, String altUnits, int npts) { - super(name, timeName, timeUnit, altName, altUnits, FeatureType.STATION_PROFILE); - station = new StationImpl(name, desc, wmoId, lat, lon, alt, npts); - this.timeSeriesNpts = npts; - } - - public StationProfileFeatureImpl(Station s, String timeName, CalendarDateUnit timeUnit, String altName, - String altUnits, int npts) { - super(s.getName(), timeName, timeUnit, altName, altUnits, FeatureType.STATION_PROFILE); + public StationProfileFeatureImpl(Station s, CalendarDateUnit timeUnit, String altUnits, int npts) { + super(s.getName(), timeUnit, altUnits, FeatureType.STATION_PROFILE); this.station = s; this.timeSeriesNpts = npts; } - public StationProfileFeatureImpl(Station s, CalendarDateUnit timeUnit, String altUnits, int npts) { - super(s.getName(), timeUnit, altUnits, FeatureType.STATION_PROFILE); + public StationProfileFeatureImpl(Station s, List coords, int npts) { + super(s.getName(), coords, FeatureType.STATION_PROFILE); this.station = s; this.timeSeriesNpts = npts; } @@ -152,7 +145,7 @@ public static class StationProfileFeatureSubset extends StationProfileFeatureImp private final CalendarDateRange dateRange; public StationProfileFeatureSubset(StationProfileFeatureImpl from, CalendarDateRange filter_date) { - super(from.station, from.getTimeName(), from.getTimeUnit(), from.getAltName(), from.getAltUnits(), -1); + super(from.station, from.getTimeUnit(), from.getAltUnits(), -1); this.from = from; this.dateRange = filter_date; } diff --git a/cdm/core/src/main/java/ucar/nc2/ft/point/StationTimeSeriesCollectionFlattened.java b/cdm/core/src/main/java/ucar/nc2/ft/point/StationTimeSeriesCollectionFlattened.java index 037e43807e..32ac793992 100644 --- a/cdm/core/src/main/java/ucar/nc2/ft/point/StationTimeSeriesCollectionFlattened.java +++ b/cdm/core/src/main/java/ucar/nc2/ft/point/StationTimeSeriesCollectionFlattened.java @@ -19,7 +19,7 @@ public class StationTimeSeriesCollectionFlattened extends PointCollectionImpl { protected StationTimeSeriesCollectionImpl from; public StationTimeSeriesCollectionFlattened(StationTimeSeriesCollectionImpl from, CalendarDateRange dateRange) { - super(from.getName(), from.getTimeName(), from.getTimeUnit(), from.getAltName(), from.getAltUnits()); + super(from.getName(), from.getTimeUnit(), from.getAltUnits()); this.from = from; if (dateRange != null) { getInfo(); diff --git a/cdm/core/src/main/java/ucar/nc2/ft/point/StationTimeSeriesCollectionImpl.java b/cdm/core/src/main/java/ucar/nc2/ft/point/StationTimeSeriesCollectionImpl.java index f6fe7ee815..1e6cfb1031 100644 --- a/cdm/core/src/main/java/ucar/nc2/ft/point/StationTimeSeriesCollectionImpl.java +++ b/cdm/core/src/main/java/ucar/nc2/ft/point/StationTimeSeriesCollectionImpl.java @@ -10,6 +10,7 @@ import java.util.List; import ucar.nc2.VariableSimpleIF; import ucar.nc2.constants.FeatureType; +import ucar.nc2.dataset.CoordinateAxis; import ucar.nc2.ft.PointFeature; import ucar.nc2.ft.PointFeatureCollection; import ucar.nc2.ft.PointFeatureCollectionIterator; @@ -35,9 +36,8 @@ public StationTimeSeriesCollectionImpl(String name, CalendarDateUnit timeUnit, S super(name, timeUnit, altUnits, FeatureType.STATION); } - public StationTimeSeriesCollectionImpl(String name, String timeName, CalendarDateUnit timeUnit, String altName, - String altUnits) { - super(name, timeName, timeUnit, altName, altUnits, FeatureType.STATION); + public StationTimeSeriesCollectionImpl(String name, List coordVars) { + super(name, coordVars, FeatureType.STATION); } // Double-check idiom for lazy initialization of instance fields. See Effective Java 2nd Ed, p. 283. @@ -135,7 +135,7 @@ private static class StationSubset extends StationTimeSeriesCollectionImpl { private final List stations; StationSubset(StationTimeSeriesCollectionImpl from, List stations) { - super(from.getName(), from.getTimeName(), from.getTimeUnit(), from.getAltName(), from.getAltUnits()); + super(from.getName(), from.getTimeUnit(), from.getAltUnits()); this.stations = stations; } diff --git a/cdm/core/src/main/java/ucar/nc2/ft/point/StationTimeSeriesFeatureImpl.java b/cdm/core/src/main/java/ucar/nc2/ft/point/StationTimeSeriesFeatureImpl.java index d96053dc56..2b7b76641f 100644 --- a/cdm/core/src/main/java/ucar/nc2/ft/point/StationTimeSeriesFeatureImpl.java +++ b/cdm/core/src/main/java/ucar/nc2/ft/point/StationTimeSeriesFeatureImpl.java @@ -5,9 +5,11 @@ package ucar.nc2.ft.point; import java.io.IOException; +import java.util.List; import javax.annotation.Nonnull; import ucar.ma2.StructureData; import ucar.nc2.constants.FeatureType; +import ucar.nc2.dataset.CoordinateAxis; import ucar.nc2.ft.PointFeatureIterator; import ucar.nc2.ft.StationTimeSeriesFeature; import ucar.nc2.time.CalendarDateRange; @@ -32,8 +34,8 @@ public StationTimeSeriesFeatureImpl(String name, String desc, String wmoId, doub } public StationTimeSeriesFeatureImpl(String name, String desc, String wmoId, double lat, double lon, double alt, - String timeName, CalendarDateUnit timeUnit, String altName, String altUnits, int npts, StructureData sdata) { - super(name, timeName, timeUnit, altName, altUnits); + List coords, int npts, StructureData sdata) { + super(name, coords); s = new StationFeatureImpl(name, desc, wmoId, lat, lon, alt, npts, sdata); } @@ -46,9 +48,8 @@ public StationTimeSeriesFeatureImpl(StationFeature s, CalendarDateUnit timeUnit, } } - public StationTimeSeriesFeatureImpl(StationFeature s, String timeName, CalendarDateUnit timeUnit, String altName, - String altUnits, int nfeatures) { - super(s.getName(), timeName, timeUnit, altName, altUnits); + public StationTimeSeriesFeatureImpl(StationFeature s, List coords, int nfeatures) { + super(s.getName(), coords); this.s = s; if (nfeatures >= 0) { getInfo(); // create the object diff --git a/cdm/core/src/main/java/ucar/nc2/ft/point/TrajectoryFeatureImpl.java b/cdm/core/src/main/java/ucar/nc2/ft/point/TrajectoryFeatureImpl.java index 4138148869..32f56f4eab 100644 --- a/cdm/core/src/main/java/ucar/nc2/ft/point/TrajectoryFeatureImpl.java +++ b/cdm/core/src/main/java/ucar/nc2/ft/point/TrajectoryFeatureImpl.java @@ -4,10 +4,12 @@ */ package ucar.nc2.ft.point; +import ucar.nc2.dataset.CoordinateAxis; import ucar.nc2.ft.TrajectoryFeature; import ucar.nc2.constants.FeatureType; import ucar.nc2.time.CalendarDateUnit; import javax.annotation.Nonnull; +import java.util.List; /** * Implementation of TrajectoryFeature @@ -17,17 +19,16 @@ */ public abstract class TrajectoryFeatureImpl extends PointCollectionImpl implements TrajectoryFeature { - public TrajectoryFeatureImpl(String name, String timeName, CalendarDateUnit timeUnit, String altName, String altUnits, - int nfeatures) { - super(name, timeName, timeUnit, altName, altUnits); + public TrajectoryFeatureImpl(String name, CalendarDateUnit timeUnit, String altUnits, int nfeatures) { + super(name, timeUnit, altUnits); if (nfeatures >= 0) { getInfo(); // create the object info.nfeatures = nfeatures; } } - public TrajectoryFeatureImpl(String name, CalendarDateUnit timeUnit, String altUnits, int nfeatures) { - super(name, timeUnit, altUnits); + public TrajectoryFeatureImpl(String name, List coords, int nfeatures) { + super(name, coords); if (nfeatures >= 0) { getInfo(); // create the object info.nfeatures = nfeatures; diff --git a/cdm/core/src/main/java/ucar/nc2/ft/point/remote/StationCollectionStream.java b/cdm/core/src/main/java/ucar/nc2/ft/point/remote/StationCollectionStream.java index 9eeba1de47..004e127952 100644 --- a/cdm/core/src/main/java/ucar/nc2/ft/point/remote/StationCollectionStream.java +++ b/cdm/core/src/main/java/ucar/nc2/ft/point/remote/StationCollectionStream.java @@ -161,8 +161,7 @@ private class StationFeatureStream extends StationTimeSeriesFeatureImpl { PointIteratorStream riter; StationFeatureStream(StationTimeSeriesFeature s, CalendarDateRange dateRange) { - super(s, s.getTimeName(), StationCollectionStream.this.getTimeUnit(), s.getAltName(), - StationCollectionStream.this.getAltUnits(), -1); + super(s, s.getCoordinateVariables(), -1); this.stnFeature = s; if (dateRange != null) { getInfo(); diff --git a/cdm/core/src/main/java/ucar/nc2/ft/point/standard/PointDatasetStandardFactory.java b/cdm/core/src/main/java/ucar/nc2/ft/point/standard/PointDatasetStandardFactory.java index 8871bf3e3f..b8bcf57a2e 100644 --- a/cdm/core/src/main/java/ucar/nc2/ft/point/standard/PointDatasetStandardFactory.java +++ b/cdm/core/src/main/java/ucar/nc2/ft/point/standard/PointDatasetStandardFactory.java @@ -141,6 +141,10 @@ static class PointDatasetStandard extends PointDatasetImpl { // create member variables dataVariables = new ArrayList<>(flatTable.getDataVariables()); + // TODO: implement flatTable.getCoordinateVariables, use in FeatureCollection constructors + // once this is implemented, feature collections will have a full set of coordinate axes + // to use in the CFPointWriter implementations in place of default axis info + featureType = flatTable.getFeatureType(); // hope they're all the same if (flatTable.getFeatureType() == FeatureType.POINT) featureCollections.add(new StandardPointCollectionImpl(flatTable, timeUnit, altUnits)); diff --git a/cdm/core/src/main/java/ucar/nc2/ft/point/standard/StandardPointCollectionImpl.java b/cdm/core/src/main/java/ucar/nc2/ft/point/standard/StandardPointCollectionImpl.java index 7f60fd9c4c..5dd248632e 100644 --- a/cdm/core/src/main/java/ucar/nc2/ft/point/standard/StandardPointCollectionImpl.java +++ b/cdm/core/src/main/java/ucar/nc2/ft/point/standard/StandardPointCollectionImpl.java @@ -6,6 +6,9 @@ package ucar.nc2.ft.point.standard; import java.io.IOException; +import java.util.List; + +import ucar.nc2.dataset.CoordinateAxis; import ucar.nc2.ft.PointFeatureIterator; import ucar.nc2.ft.point.PointCollectionImpl; import ucar.nc2.time.CalendarDateUnit; @@ -20,7 +23,13 @@ public class StandardPointCollectionImpl extends PointCollectionImpl { private NestedTable ft; StandardPointCollectionImpl(NestedTable ft, CalendarDateUnit timeUnit, String altUnits) { - super(ft.getName(), ft.getTimeName(), timeUnit, ft.getAltName(), altUnits); + super(ft.getName(), timeUnit, altUnits); + this.ft = ft; + this.extras = ft.getExtras(); + } + + StandardPointCollectionImpl(NestedTable ft, List coordVars) { + super(ft.getName(), coordVars); this.ft = ft; this.extras = ft.getExtras(); } diff --git a/cdm/core/src/main/java/ucar/nc2/ft/point/standard/StandardProfileCollectionImpl.java b/cdm/core/src/main/java/ucar/nc2/ft/point/standard/StandardProfileCollectionImpl.java index ec7b650c6c..fcbdbfe043 100644 --- a/cdm/core/src/main/java/ucar/nc2/ft/point/standard/StandardProfileCollectionImpl.java +++ b/cdm/core/src/main/java/ucar/nc2/ft/point/standard/StandardProfileCollectionImpl.java @@ -7,10 +7,12 @@ import java.io.IOException; import java.util.Iterator; +import java.util.List; import javax.annotation.Nonnull; import ucar.ma2.StructureData; import ucar.ma2.StructureDataIterator; import ucar.nc2.constants.FeatureType; +import ucar.nc2.dataset.CoordinateAxis; import ucar.nc2.ft.PointFeature; import ucar.nc2.ft.PointFeatureCollection; import ucar.nc2.ft.PointFeatureCollectionIterator; @@ -37,13 +39,23 @@ public class StandardProfileCollectionImpl extends PointFeatureCCImpl implements ProfileFeatureCollection { private NestedTable ft; - protected StandardProfileCollectionImpl(String name, String timeName, CalendarDateUnit timeUnit, String altName, - String altUnits) { - super(name, timeName, timeUnit, altName, altUnits, FeatureType.PROFILE); + protected StandardProfileCollectionImpl(String name, CalendarDateUnit timeUnit, String altUnits) { + super(name, timeUnit, altUnits, FeatureType.PROFILE); + } + + + StandardProfileCollectionImpl(String name, List coordVars) { + super(name, coordVars, FeatureType.PROFILE); } StandardProfileCollectionImpl(NestedTable ft, CalendarDateUnit timeUnit, String altUnits) { - super(ft.getName(), ft.getTimeName(), timeUnit, ft.getAltName(), altUnits, FeatureType.PROFILE); + super(ft.getName(), timeUnit, altUnits, FeatureType.PROFILE); + this.ft = ft; + this.extras = ft.getExtras(); + } + + StandardProfileCollectionImpl(NestedTable ft, List coordVars) { + super(ft.getName(), coordVars, FeatureType.PROFILE); this.ft = ft; this.extras = ft.getExtras(); } @@ -63,9 +75,8 @@ private class StandardProfileFeature extends ProfileFeatureImpl { StructureData profileData; StandardProfileFeature(Cursor cursor, double time, StructureData profileData) { - super(ft.getFeatureName(cursor), ft.getTimeName(), StandardProfileCollectionImpl.this.getTimeUnit(), - ft.getAltName(), StandardProfileCollectionImpl.this.getAltUnits(), ft.getLatitude(cursor), - ft.getLongitude(cursor), time, -1); + super(ft.getFeatureName(cursor), StandardProfileCollectionImpl.this.getTimeUnit(), + StandardProfileCollectionImpl.this.getAltUnits(), ft.getLatitude(cursor), ft.getLongitude(cursor), time, -1); this.cursor = cursor; this.profileData = profileData; @@ -135,7 +146,7 @@ private static class StandardProfileCollectionSubset extends StandardProfileColl LatLonRect boundingBox; StandardProfileCollectionSubset(StandardProfileCollectionImpl from, LatLonRect boundingBox) { - super(from.getName() + "-subset", from.getTimeName(), from.getTimeUnit(), from.getAltName(), from.getAltUnits()); + super(from.getName() + "-subset", from.getTimeUnit(), from.getAltUnits()); this.from = from; this.boundingBox = boundingBox; } diff --git a/cdm/core/src/main/java/ucar/nc2/ft/point/standard/StandardSectionCollectionImpl.java b/cdm/core/src/main/java/ucar/nc2/ft/point/standard/StandardSectionCollectionImpl.java index 62fe72283b..38cbcc2ba5 100644 --- a/cdm/core/src/main/java/ucar/nc2/ft/point/standard/StandardSectionCollectionImpl.java +++ b/cdm/core/src/main/java/ucar/nc2/ft/point/standard/StandardSectionCollectionImpl.java @@ -7,9 +7,11 @@ import java.io.IOException; import java.util.Iterator; +import java.util.List; import javax.annotation.Nonnull; import ucar.ma2.StructureData; import ucar.ma2.StructureDataIterator; +import ucar.nc2.dataset.CoordinateAxis; import ucar.nc2.ft.PointFeature; import ucar.nc2.ft.PointFeatureCC; import ucar.nc2.ft.PointFeatureCCIterator; @@ -40,7 +42,13 @@ public class StandardSectionCollectionImpl extends SectionCollectionImpl { private NestedTable ft; StandardSectionCollectionImpl(NestedTable ft, CalendarDateUnit timeUnit, String altUnits) { - super(ft.getName(), ft.getTimeName(), timeUnit, ft.getAltName(), altUnits); + super(ft.getName(), timeUnit, altUnits); + this.ft = ft; + this.extras = ft.getExtras(); + } + + StandardSectionCollectionImpl(NestedTable ft, List coords) { + super(ft.getName(), coords); this.ft = ft; this.extras = ft.getExtras(); } @@ -122,8 +130,8 @@ private class StandardSectionFeature extends SectionFeatureImpl { StructureData sectionData; StandardSectionFeature(Cursor cursor, StructureData sectionData) { - super(ft.getFeatureName(cursor), ft.getTimeName(), StandardSectionCollectionImpl.this.getTimeUnit(), - ft.getAltName(), StandardSectionCollectionImpl.this.getAltUnits()); + super(ft.getFeatureName(cursor), StandardSectionCollectionImpl.this.getTimeUnit(), + StandardSectionCollectionImpl.this.getAltUnits()); this.cursor = cursor; this.sectionData = sectionData; } @@ -201,8 +209,8 @@ private class StandardSectionProfileFeature extends ProfileFeatureImpl { StructureData profileData; StandardSectionProfileFeature(Cursor cursor, double time, StructureData profileData) { - super(ft.getFeatureName(cursor), ft.getTimeName(), ft.getTimeUnit(), ft.getAltName(), ft.getAltUnits(), - ft.getLatitude(cursor), ft.getLongitude(cursor), time, -1); + super(ft.getFeatureName(cursor), ft.getTimeUnit(), ft.getAltUnits(), ft.getLatitude(cursor), + ft.getLongitude(cursor), time, -1); this.cursor = cursor; this.profileData = profileData; diff --git a/cdm/core/src/main/java/ucar/nc2/ft/point/standard/StandardStationCollectionImpl.java b/cdm/core/src/main/java/ucar/nc2/ft/point/standard/StandardStationCollectionImpl.java index 44bfe10505..4603b1b82c 100644 --- a/cdm/core/src/main/java/ucar/nc2/ft/point/standard/StandardStationCollectionImpl.java +++ b/cdm/core/src/main/java/ucar/nc2/ft/point/standard/StandardStationCollectionImpl.java @@ -6,9 +6,11 @@ package ucar.nc2.ft.point.standard; import java.io.IOException; +import java.util.List; import javax.annotation.Nonnull; import ucar.ma2.StructureData; import ucar.ma2.StructureDataIterator; +import ucar.nc2.dataset.CoordinateAxis; import ucar.nc2.ft.PointFeatureIterator; import ucar.nc2.ft.StationTimeSeriesFeature; import ucar.nc2.ft.point.StationFeature; @@ -32,7 +34,13 @@ public class StandardStationCollectionImpl extends StationTimeSeriesCollectionIm private NestedTable ft; StandardStationCollectionImpl(NestedTable ft, CalendarDateUnit timeUnit, String altUnits) { - super(ft.getName(), ft.getTimeName(), timeUnit, ft.getAltName(), altUnits); + super(ft.getName(), timeUnit, altUnits); + this.ft = ft; + this.extras = ft.getExtras(); + } + + StandardStationCollectionImpl(NestedTable ft, List coordVars) { + super(ft.getName(), coordVars); this.ft = ft; this.extras = ft.getExtras(); } @@ -73,7 +81,7 @@ private class StandardStationFeatureImpl extends StationTimeSeriesFeatureImpl { StructureData stationData; StandardStationFeatureImpl(StationFeature s, CalendarDateUnit dateUnit, StructureData stationData, int recnum) { - super(s, ft.getTimeName(), dateUnit, ft.getAltName(), ft.getAltUnits(), -1); + super(s, dateUnit, ft.getAltUnits(), -1); this.recnum = recnum; this.stationData = stationData; } diff --git a/cdm/core/src/main/java/ucar/nc2/ft/point/standard/StandardStationProfileCollectionImpl.java b/cdm/core/src/main/java/ucar/nc2/ft/point/standard/StandardStationProfileCollectionImpl.java index ef33238784..ed1560b4e0 100644 --- a/cdm/core/src/main/java/ucar/nc2/ft/point/standard/StandardStationProfileCollectionImpl.java +++ b/cdm/core/src/main/java/ucar/nc2/ft/point/standard/StandardStationProfileCollectionImpl.java @@ -11,6 +11,7 @@ import javax.annotation.Nonnull; import ucar.ma2.StructureData; import ucar.ma2.StructureDataIterator; +import ucar.nc2.dataset.CoordinateAxis; import ucar.nc2.ft.PointFeature; import ucar.nc2.ft.PointFeatureCC; import ucar.nc2.ft.PointFeatureCCIterator; @@ -47,7 +48,13 @@ public class StandardStationProfileCollectionImpl extends StationProfileCollecti private NestedTable ft; StandardStationProfileCollectionImpl(NestedTable ft, CalendarDateUnit timeUnit, String altUnits) { - super(ft.getName(), ft.getTimeName(), timeUnit, ft.getAltName(), altUnits); + super(ft.getName(), timeUnit, altUnits); + this.ft = ft; + } + + + StandardStationProfileCollectionImpl(NestedTable ft, List coordVars) { + super(ft.getName(), coordVars); this.ft = ft; } @@ -135,9 +142,7 @@ private class StandardStationProfileFeature extends StationProfileFeatureImpl { Cursor cursor; StandardStationProfileFeature(Station s, Cursor cursor, StructureData stationProfileData, int recnum) { - super(s, StandardStationProfileCollectionImpl.this.getTimeName(), - StandardStationProfileCollectionImpl.this.getTimeUnit(), - StandardStationProfileCollectionImpl.this.getAltName(), + super(s, StandardStationProfileCollectionImpl.this.getTimeUnit(), StandardStationProfileCollectionImpl.this.getAltUnits(), -1); this.cursor = cursor; // this.recnum = recnum; @@ -249,8 +254,8 @@ private class StandardProfileFeature extends ProfileFeatureImpl { StandardProfileFeature(Station s, String timeName, CalendarDateUnit timeUnit, String altName, String altUnits, double time, Cursor cursor, StructureData profileData) { - super(timeUnit.makeCalendarDate(time).toString(), timeName, timeUnit, altName, altUnits, s.getLatitude(), - s.getLongitude(), time, -1); + super(timeUnit.makeCalendarDate(time).toString(), timeUnit, altUnits, s.getLatitude(), s.getLongitude(), time, + -1); this.cursor = cursor; this.profileData = profileData; diff --git a/cdm/core/src/main/java/ucar/nc2/ft/point/standard/StandardTrajectoryCollectionImpl.java b/cdm/core/src/main/java/ucar/nc2/ft/point/standard/StandardTrajectoryCollectionImpl.java index 1431df38cb..a1ed418036 100644 --- a/cdm/core/src/main/java/ucar/nc2/ft/point/standard/StandardTrajectoryCollectionImpl.java +++ b/cdm/core/src/main/java/ucar/nc2/ft/point/standard/StandardTrajectoryCollectionImpl.java @@ -7,10 +7,12 @@ import java.io.IOException; import java.util.Iterator; +import java.util.List; import javax.annotation.Nonnull; import ucar.ma2.StructureData; import ucar.ma2.StructureDataIterator; import ucar.nc2.constants.FeatureType; +import ucar.nc2.dataset.CoordinateAxis; import ucar.nc2.ft.PointFeatureCollection; import ucar.nc2.ft.PointFeatureCollectionIterator; import ucar.nc2.ft.PointFeatureIterator; @@ -39,8 +41,18 @@ protected StandardTrajectoryCollectionImpl(String name, CalendarDateUnit timeUni super(name, timeUnit, altUnits, FeatureType.TRAJECTORY); } + protected StandardTrajectoryCollectionImpl(String name, List coords) { + super(name, coords, FeatureType.TRAJECTORY); + } + StandardTrajectoryCollectionImpl(NestedTable ft, CalendarDateUnit timeUnit, String altUnits) { - super(ft.getName(), ft.getTimeName(), timeUnit, ft.getAltName(), altUnits, FeatureType.TRAJECTORY); + super(ft.getName(), timeUnit, altUnits, FeatureType.TRAJECTORY); + this.ft = ft; + this.extras = ft.getExtras(); + } + + StandardTrajectoryCollectionImpl(NestedTable ft, List coords) { + super(ft.getName(), coords, FeatureType.TRAJECTORY); this.ft = ft; this.extras = ft.getExtras(); } @@ -57,8 +69,8 @@ private class StandardTrajectoryFeature extends TrajectoryFeatureImpl { StructureData trajData; StandardTrajectoryFeature(Cursor cursor, StructureData trajData) { - super(ft.getFeatureName(cursor), ft.getTimeName(), StandardTrajectoryCollectionImpl.this.getTimeUnit(), - ft.getAltName(), StandardTrajectoryCollectionImpl.this.getAltUnits(), -1); + super(ft.getFeatureName(cursor), StandardTrajectoryCollectionImpl.this.getTimeUnit(), + StandardTrajectoryCollectionImpl.this.getAltUnits(), -1); this.cursor = cursor; this.trajData = trajData; } diff --git a/cdm/core/src/main/java/ucar/nc2/ft/point/writer/CFPointWriter.java b/cdm/core/src/main/java/ucar/nc2/ft/point/writer/CFPointWriter.java index 2f3988e626..d4dcc3bc0f 100644 --- a/cdm/core/src/main/java/ucar/nc2/ft/point/writer/CFPointWriter.java +++ b/cdm/core/src/main/java/ucar/nc2/ft/point/writer/CFPointWriter.java @@ -34,16 +34,15 @@ import java.util.*; /** - * Write Point Feature Collections into netcdf3/4 files in CF 1.6 point obs conventions. + * Write Point Feature Collections into netcdf3/4 files in CF 1.9 point obs conventions. *
    *
  • netcdf3: use indexed ragged array representation
  • *
- * - * @deprecated use writer2 */ @Deprecated public abstract class CFPointWriter implements Closeable { private static final Logger logger = LoggerFactory.getLogger(CFPointWriter.class); + private static final String CF_VERSION = "CF-1.9"; public static final String recordName = "obs"; public static final String recordDimName = "obs"; @@ -82,7 +81,7 @@ public static int writeFeatureCollection(FeatureDatasetPoint fdpoint, String fil * Write a FeatureDatasetPoint to a netcd3/4 file. * * @param fdpoint the FeatureDatasetPoint; do first FeatureCollection contained within. - * @param fileOut write to the is file + * @param fileOut write to this file * @param config configuration * @return count of number of pointFeatures written. */ @@ -119,6 +118,7 @@ public static int writeFeatureCollection(FeatureDatasetPoint fdpoint, String fil private static int writePointFeatureCollection(FeatureDatasetPoint fdpoint, PointFeatureCollection pfc, String fileOut, CFPointWriterConfig config) throws IOException { + // TODO: change to use pfc.getCoordinateVariables() try (WriterCFPointCollection pointWriter = new WriterCFPointCollection(fileOut, fdpoint.getGlobalAttributes(), fdpoint.getDataVariables(), pfc.getTimeUnit(), pfc.getAltUnits(), config)) { @@ -144,6 +144,7 @@ private static int writeStationFeatureCollection(FeatureDatasetPoint dataset, St String fileOut, CFPointWriterConfig config) throws IOException { int count = 0; + // TODO: change to use fc.getCoordinateVariables() try (WriterCFStationCollection cfWriter = new WriterCFStationCollection(fileOut, dataset.getGlobalAttributes(), dataset.getDataVariables(), fc.getTimeUnit(), fc.getAltUnits(), config)) { @@ -179,6 +180,7 @@ private static int writeStationFeatureCollection(FeatureDatasetPoint dataset, St private static int writeProfileFeatureCollection(FeatureDatasetPoint fdpoint, ProfileFeatureCollection fc, String fileOut, CFPointWriterConfig config) throws IOException { + // TODO: change to use fdPoint.getCoordinateVariables() try (WriterCFProfileCollection cfWriter = new WriterCFProfileCollection(fileOut, fdpoint.getGlobalAttributes(), fdpoint.getDataVariables(), fc.getTimeUnit(), fc.getAltUnits(), config)) { List extraVariables = new ArrayList<>(); @@ -220,6 +222,7 @@ private static int writeProfileFeatureCollection(FeatureDatasetPoint fdpoint, Pr private static int writeTrajectoryFeatureCollection(FeatureDatasetPoint fdpoint, TrajectoryFeatureCollection fc, String fileOut, CFPointWriterConfig config) throws IOException { + // TODO: change to use fdpoint.getCoordinateVariables() try (WriterCFTrajectoryCollection cfWriter = new WriterCFTrajectoryCollection(fileOut, fdpoint.getGlobalAttributes(), fdpoint.getDataVariables(), fc.getTimeUnit(), fc.getAltUnits(), config)) { List extraVariables = new ArrayList<>(); @@ -258,6 +261,7 @@ private static int writeTrajectoryFeatureCollection(FeatureDatasetPoint fdpoint, private static int writeStationProfileFeatureCollection(FeatureDatasetPoint dataset, StationProfileFeatureCollection fc, String fileOut, CFPointWriterConfig config) throws IOException { + // TODO: change to use fc.getCoordinateVariables() try (WriterCFStationProfileCollection cfWriter = new WriterCFStationProfileCollection(fileOut, dataset.getGlobalAttributes(), dataset.getDataVariables(), fc.getTimeUnit(), fc.getAltUnits(), config)) { @@ -300,6 +304,7 @@ private static int writeStationProfileFeatureCollection(FeatureDatasetPoint data private static int writeTrajectoryProfileFeatureCollection(FeatureDatasetPoint dataset, TrajectoryProfileFeatureCollection fc, String fileOut, CFPointWriterConfig config) throws IOException { + // TODO: change to use fc.getCoordinateVariables() try (WriterCFTrajectoryProfileCollection cfWriter = new WriterCFTrajectoryProfileCollection(fileOut, dataset.getGlobalAttributes(), dataset.getDataVariables(), fc.getTimeUnit(), fc.getAltUnits(), config)) { List extraVariables = new ArrayList<>(); @@ -369,8 +374,6 @@ private static int writeTrajectoryProfileFeatureCollection(FeatureDatasetPoint d protected String altUnits; protected String altitudeCoordinateName = altName; - protected final boolean noTimeCoverage; - protected final boolean noUnlimitedDimension; // experimental , netcdf-3 protected final boolean isExtendedModel; protected boolean useAlt = true; protected int nfeatures, id_strlen; @@ -380,6 +383,7 @@ private static int writeTrajectoryProfileFeatureCollection(FeatureDatasetPoint d protected Dimension recordDim; protected Map dataMap = new HashMap<>(); protected List dataVars; + protected List coordVars; private Map extraMap; // added as variables just as they are protected List extra = new ArrayList<>(); @@ -407,15 +411,25 @@ protected CFPointWriter(String fileOut, List atts, List= 0; // LOOK NOT USED this.isExtendedModel = writer.getVersion().isExtendedModel(); addGlobalAtts(atts); - addNetcdf3UnknownAtts(noTimeCoverage); + addNetcdf3UnknownAtts(); } + protected CFPointWriter(String fileOut, List atts, List dataVars, + CFPointWriterConfig config, List coords) throws IOException { + createWriter(fileOut, config); + this.dataVars = dataVars; + this.config = config; + this.isExtendedModel = writer.getVersion().isExtendedModel(); + + this.coordVars = new ArrayList<>(coords); + this.coordVars.sort(new CoordinateAxis.AxisComparator()); + + addGlobalAtts(atts); + addNetcdf3UnknownAtts(); + } public void setFeatureAuxInfo(int nfeatures, int id_strlen) { this.nfeatures = nfeatures; @@ -435,7 +449,7 @@ private void createWriter(String fileOut, CFPointWriterConfig config) throws IOE } private void addGlobalAtts(List atts) { - writer.addGroupAttribute(null, new Attribute(CDM.CONVENTIONS, isExtendedModel ? CDM.CF_EXTENDED : "CF-1.6")); + writer.addGroupAttribute(null, new Attribute(CDM.CONVENTIONS, isExtendedModel ? CDM.CF_EXTENDED : CF_VERSION)); writer.addGroupAttribute(null, new Attribute(CDM.HISTORY, "Written by CFPointWriter")); for (Attribute att : atts) { if (!reservedGlobalAtts.contains(att.getShortName())) @@ -445,13 +459,11 @@ private void addGlobalAtts(List atts) { // netcdf3 has to add attributes up front, but we dont know values until the end. // so we have this updateAttribute hack; values set in finish() - private void addNetcdf3UnknownAtts(boolean noTimeCoverage) { + private void addNetcdf3UnknownAtts() { // dummy values, update in finish() - if (!noTimeCoverage) { - CalendarDate now = CalendarDate.of(new Date()); - writer.addGroupAttribute(null, new Attribute(ACDD.TIME_START, CalendarDateFormatter.toDateTimeStringISO(now))); - writer.addGroupAttribute(null, new Attribute(ACDD.TIME_END, CalendarDateFormatter.toDateTimeStringISO(now))); - } + CalendarDate now = CalendarDate.of(new Date()); + writer.addGroupAttribute(null, new Attribute(ACDD.TIME_START, CalendarDateFormatter.toDateTimeStringISO(now))); + writer.addGroupAttribute(null, new Attribute(ACDD.TIME_END, CalendarDateFormatter.toDateTimeStringISO(now))); writer.addGroupAttribute(null, new Attribute(ACDD.LAT_MIN, 0.0)); writer.addGroupAttribute(null, new Attribute(ACDD.LAT_MAX, 0.0)); writer.addGroupAttribute(null, new Attribute(ACDD.LON_MIN, 0.0)); @@ -850,15 +862,6 @@ public void finish() throws IOException { writer.updateAttribute(null, new Attribute(ACDD.LON_MAX, llbb.getUpperRightPoint().getLongitude())); } - if (!noTimeCoverage) { - if (minDate == null) - minDate = CalendarDate.present(); - if (maxDate == null) - maxDate = CalendarDate.present(); - writer.updateAttribute(null, new Attribute(ACDD.TIME_START, CalendarDateFormatter.toDateTimeStringISO(minDate))); - writer.updateAttribute(null, new Attribute(ACDD.TIME_END, CalendarDateFormatter.toDateTimeStringISO(maxDate))); - } - writer.close(); } diff --git a/cdm/core/src/main/java/ucar/nc2/ft/point/writer/CFPointWriterConfig.java b/cdm/core/src/main/java/ucar/nc2/ft/point/writer/CFPointWriterConfig.java index dcc04aeef3..7dae8017f4 100644 --- a/cdm/core/src/main/java/ucar/nc2/ft/point/writer/CFPointWriterConfig.java +++ b/cdm/core/src/main/java/ucar/nc2/ft/point/writer/CFPointWriterConfig.java @@ -18,9 +18,6 @@ public class CFPointWriterConfig { public NetcdfFileWriter.Version version; // netcdf file version public Nc4Chunking chunking; // for netcdf-4 - public boolean noTimeCoverage; // does not have a time dimension - public int recDimensionLength = -1; // do use unlimited dimension (for netcdf3), use fixed dimension of this length - // NOT USED public CFPointWriterConfig(NetcdfFileWriter.Version version) { this(version, new Nc4ChunkingDefault()); // The default chunker used in Nc4Iosp. @@ -30,9 +27,4 @@ public CFPointWriterConfig(NetcdfFileWriter.Version version, Nc4Chunking chunkin this.version = version; this.chunking = chunking; } - - public CFPointWriterConfig setNoTimeCoverage(boolean noTimeCoverage) { - this.noTimeCoverage = noTimeCoverage; - return this; - } } diff --git a/cdm/core/src/main/java/ucar/nc2/ft/point/writer/WriterCFPointCollection.java b/cdm/core/src/main/java/ucar/nc2/ft/point/writer/WriterCFPointCollection.java index 8447a34fef..4d37a7e1a6 100644 --- a/cdm/core/src/main/java/ucar/nc2/ft/point/writer/WriterCFPointCollection.java +++ b/cdm/core/src/main/java/ucar/nc2/ft/point/writer/WriterCFPointCollection.java @@ -8,6 +8,7 @@ import com.google.common.collect.ImmutableList; import ucar.nc2.constants.CDM; import ucar.nc2.constants.CF; +import ucar.nc2.dataset.CoordinateAxis; import ucar.nc2.dataset.conv.CF1Convention; import ucar.nc2.time.CalendarDate; import ucar.nc2.time.CalendarDateUnit; @@ -32,11 +33,15 @@ * @since Nov 23, 2010 */ public class WriterCFPointCollection extends CFPointWriter { - // private Map varMap = new HashMap<>(); public WriterCFPointCollection(String fileOut, List globalAtts, List dataVars, CalendarDateUnit timeUnit, String altUnits, CFPointWriterConfig config) throws IOException { super(fileOut, globalAtts, dataVars, timeUnit, altUnits, config); + } + + public WriterCFPointCollection(String fileOut, List globalAtts, List dataVars, + List coordVars, CFPointWriterConfig config) throws IOException { + super(fileOut, globalAtts, dataVars, config, coordVars); writer.addGroupAttribute(null, new Attribute(CF.FEATURE_TYPE, CF.FeatureType.point.name())); writer.addGroupAttribute(null, new Attribute(CF.DSG_REPRESENTATION, "Point Data, H.1")); } diff --git a/cdm/core/src/main/java/ucar/nc2/ft/point/writer/WriterCFProfileCollection.java b/cdm/core/src/main/java/ucar/nc2/ft/point/writer/WriterCFProfileCollection.java index 41294ebe9e..7ed84d3e62 100644 --- a/cdm/core/src/main/java/ucar/nc2/ft/point/writer/WriterCFProfileCollection.java +++ b/cdm/core/src/main/java/ucar/nc2/ft/point/writer/WriterCFProfileCollection.java @@ -12,6 +12,7 @@ import ucar.nc2.*; import ucar.nc2.constants.CDM; import ucar.nc2.constants.CF; +import ucar.nc2.dataset.CoordinateAxis; import ucar.nc2.dataset.conv.CF1Convention; import ucar.nc2.ft.PointFeature; import ucar.nc2.ft.ProfileFeature; @@ -48,6 +49,14 @@ public WriterCFProfileCollection(String fileOut, List globalAtts, Lis writer.addGroupAttribute(null, new Attribute(CF.FEATURE_TYPE, CF.FeatureType.profile.name())); } + public WriterCFProfileCollection(String fileOut, List globalAtts, List dataVars, + List coordVars, CFPointWriterConfig config) throws IOException { + super(fileOut, globalAtts, dataVars, config, coordVars); + writer.addGroupAttribute(null, + new Attribute(CF.DSG_REPRESENTATION, "Contiguous ragged array representation of profiles, H.3.4")); + writer.addGroupAttribute(null, new Attribute(CF.FEATURE_TYPE, CF.FeatureType.profile.name())); + } + public int writeProfile(ProfileFeature profile) throws IOException { if (id_strlen == 0) id_strlen = profile.getName().length() * 2; diff --git a/cdm/core/src/main/java/ucar/nc2/ft/point/writer/WriterCFStationCollection.java b/cdm/core/src/main/java/ucar/nc2/ft/point/writer/WriterCFStationCollection.java index caad99e813..09d3baccdd 100644 --- a/cdm/core/src/main/java/ucar/nc2/ft/point/writer/WriterCFStationCollection.java +++ b/cdm/core/src/main/java/ucar/nc2/ft/point/writer/WriterCFStationCollection.java @@ -10,6 +10,7 @@ import ucar.nc2.*; import ucar.nc2.constants.CDM; import ucar.nc2.constants.CF; +import ucar.nc2.dataset.CoordinateAxis; import ucar.nc2.ft.*; import ucar.nc2.ft.point.StationFeature; import ucar.nc2.ft.point.StationPointFeature; @@ -53,9 +54,17 @@ public class WriterCFStationCollection extends CFPointWriter { private int desc_strlen = 1, wmo_strlen = 1; private Map featureVarMap = new HashMap<>(); - public WriterCFStationCollection(String fileOut, List atts, List dataVars, + public WriterCFStationCollection(String fileOut, List globalAtts, List dataVars, CalendarDateUnit timeUnit, String altUnits, CFPointWriterConfig config) throws IOException { - super(fileOut, atts, dataVars, timeUnit, altUnits, config); + super(fileOut, globalAtts, dataVars, timeUnit, altUnits, config); + writer.addGroupAttribute(null, new Attribute(CF.FEATURE_TYPE, CF.FeatureType.timeSeries.name())); + writer.addGroupAttribute(null, new Attribute(CF.DSG_REPRESENTATION, + "Timeseries of station data in the indexed ragged array representation, H.2.5")); + } + + public WriterCFStationCollection(String fileOut, List globalAtts, List dataVars, + List coordVars, CFPointWriterConfig config) throws IOException { + super(fileOut, globalAtts, dataVars, config, coordVars); writer.addGroupAttribute(null, new Attribute(CF.FEATURE_TYPE, CF.FeatureType.timeSeries.name())); writer.addGroupAttribute(null, new Attribute(CF.DSG_REPRESENTATION, "Timeseries of station data in the indexed ragged array representation, H.2.5")); diff --git a/cdm/core/src/main/java/ucar/nc2/ft/point/writer/WriterCFStationProfileCollection.java b/cdm/core/src/main/java/ucar/nc2/ft/point/writer/WriterCFStationProfileCollection.java index e010e32f91..a3bb473ec9 100644 --- a/cdm/core/src/main/java/ucar/nc2/ft/point/writer/WriterCFStationProfileCollection.java +++ b/cdm/core/src/main/java/ucar/nc2/ft/point/writer/WriterCFStationProfileCollection.java @@ -13,6 +13,7 @@ import ucar.nc2.*; import ucar.nc2.constants.CDM; import ucar.nc2.constants.CF; +import ucar.nc2.dataset.CoordinateAxis; import ucar.nc2.dataset.conv.CF1Convention; import ucar.nc2.ft.*; import ucar.nc2.ft.point.StationFeature; @@ -57,6 +58,14 @@ public WriterCFStationProfileCollection(String fileOut, List globalAt new Attribute(CF.DSG_REPRESENTATION, "Ragged array representation of time series profiles, H.5.3")); } + public WriterCFStationProfileCollection(String fileOut, List globalAtts, List dataVars, + List coordVars, CFPointWriterConfig config) throws IOException { + super(fileOut, globalAtts, dataVars, config, coordVars); + writer.addGroupAttribute(null, new Attribute(CF.FEATURE_TYPE, CF.FeatureType.timeSeriesProfile.name())); + writer.addGroupAttribute(null, + new Attribute(CF.DSG_REPRESENTATION, "Ragged array representation of time series profiles, H.5.3")); + } + public void setStations(List stns) { this.stnList = stns.stream().distinct().collect(Collectors.toList()); diff --git a/cdm/core/src/main/java/ucar/nc2/ft/point/writer/WriterCFTrajectoryCollection.java b/cdm/core/src/main/java/ucar/nc2/ft/point/writer/WriterCFTrajectoryCollection.java index cc5f2fe90c..2e202ab18f 100644 --- a/cdm/core/src/main/java/ucar/nc2/ft/point/writer/WriterCFTrajectoryCollection.java +++ b/cdm/core/src/main/java/ucar/nc2/ft/point/writer/WriterCFTrajectoryCollection.java @@ -10,6 +10,7 @@ import ucar.nc2.*; import ucar.nc2.constants.CDM; import ucar.nc2.constants.CF; +import ucar.nc2.dataset.CoordinateAxis; import ucar.nc2.dataset.conv.CF1Convention; import ucar.nc2.ft.*; import ucar.nc2.time.CalendarDateUnit; @@ -38,6 +39,14 @@ public WriterCFTrajectoryCollection(String fileOut, List globalAtts, new Attribute(CF.DSG_REPRESENTATION, "Contiguous ragged array representation of trajectories, H.4.3")); } + public WriterCFTrajectoryCollection(String fileOut, List globalAtts, List dataVars, + List coordVars, CFPointWriterConfig config) throws IOException { + super(fileOut, globalAtts, dataVars, config, coordVars); + writer.addGroupAttribute(null, new Attribute(CF.FEATURE_TYPE, CF.FeatureType.trajectory.name())); + writer.addGroupAttribute(null, + new Attribute(CF.DSG_REPRESENTATION, "Contiguous ragged array representation of trajectories, H.4.3")); + } + public int writeTrajectory(TrajectoryFeature traj) throws IOException { int count = 0; for (PointFeature pf : traj) { diff --git a/cdm/core/src/main/java/ucar/nc2/ft/point/writer/WriterCFTrajectoryProfileCollection.java b/cdm/core/src/main/java/ucar/nc2/ft/point/writer/WriterCFTrajectoryProfileCollection.java index 767b9fa125..1ddfac6927 100644 --- a/cdm/core/src/main/java/ucar/nc2/ft/point/writer/WriterCFTrajectoryProfileCollection.java +++ b/cdm/core/src/main/java/ucar/nc2/ft/point/writer/WriterCFTrajectoryProfileCollection.java @@ -10,6 +10,7 @@ import ucar.nc2.*; import ucar.nc2.constants.CDM; import ucar.nc2.constants.CF; +import ucar.nc2.dataset.CoordinateAxis; import ucar.nc2.dataset.conv.CF1Convention; import ucar.nc2.ft.*; import ucar.nc2.time.CalendarDateUnit; @@ -47,6 +48,15 @@ public WriterCFTrajectoryProfileCollection(String fileOut, List globa new Attribute(CF.DSG_REPRESENTATION, "Contiguous ragged array representation of trajectory profile, H.6.3")); } + public WriterCFTrajectoryProfileCollection(String fileOut, List globalAtts, + List dataVars, List coordVars, CFPointWriterConfig config) throws IOException { + super(fileOut, globalAtts, dataVars, config, coordVars); + writer.addGroupAttribute(null, new Attribute(CF.FEATURE_TYPE, CF.FeatureType.trajectoryProfile.name())); + writer.addGroupAttribute(null, + new Attribute(CF.DSG_REPRESENTATION, "Contiguous ragged array representation of trajectory profile, H.6.3")); + } + + public void setFeatureAuxInfo2(int ntraj, int traj_strlen) { this.ntraj = ntraj; this.traj_strlen = traj_strlen; diff --git a/cdm/core/src/main/java/ucar/nc2/ft2/coverage/writer/CoverageAsPoint.java b/cdm/core/src/main/java/ucar/nc2/ft2/coverage/writer/CoverageAsPoint.java index 46439ee9d0..33111d775b 100644 --- a/cdm/core/src/main/java/ucar/nc2/ft2/coverage/writer/CoverageAsPoint.java +++ b/cdm/core/src/main/java/ucar/nc2/ft2/coverage/writer/CoverageAsPoint.java @@ -189,8 +189,7 @@ protected StationHelper createStationHelper() throws IOException { private StationFeature createStationFeature(String name) { double stationZ = varGroup.zAxis != null ? varGroup.zAxis.getCoordEdgeFirst() : 0.0; return new CoverageAsStationProfile(name, name, null, nearestLatLonPoint.getLatitude(), - nearestLatLonPoint.getLongitude(), stationZ, this.timeName, this.timeUnit, this.altName, this.altUnits, -1, - varGroup); + nearestLatLonPoint.getLongitude(), stationZ, this.timeUnit, this.altUnits, -1, varGroup); } } @@ -220,8 +219,7 @@ protected StationHelper createStationHelper() { private StationFeature createStationFeature(String name) { double stationZ = varGroup.zAxis != null ? varGroup.zAxis.getCoordMidpoint(0) : 0.0; return new CoverageAsStationFeature(name, name, null, nearestLatLonPoint.getLatitude(), - nearestLatLonPoint.getLongitude(), stationZ, this.timeName, this.timeUnit, this.altName, this.altUnits, -1, - varGroup); + nearestLatLonPoint.getLongitude(), stationZ, this.timeUnit, this.altUnits, -1, varGroup); } } @@ -232,8 +230,8 @@ private class CoverageAsStationProfile extends StationProfileFeatureImpl { private VarGroup varGroup; private CoverageAsStationProfile(String name, String desc, String wmoId, double lat, double lon, double alt, - String timeName, CalendarDateUnit timeUnit, String altName, String altUnits, int npts, VarGroup varGroup) { - super(name, desc, wmoId, lat, lon, alt, timeName, timeUnit, altName, altUnits, npts); + CalendarDateUnit timeUnit, String altUnits, int npts, VarGroup varGroup) { + super(name, desc, wmoId, lat, lon, alt, timeUnit, altUnits, npts); this.varGroup = varGroup; } @@ -309,10 +307,9 @@ public boolean hasNext() throws IOException { @Override public PointFeatureCollection next() throws IOException { double obsTime = this.timeAxis != null ? this.timeAxis.getCoordMidpoint(curr) : 0.0; - String timeName = this.timeAxis != null ? this.timeAxis.getName() : "time"; curr++; - return new CoverageAsProfileFeature(obsTime, timeName, varGroup.dateUnit, varGroup.zAxis.getName(), - varGroup.zUnit, getLatitude(), getLongitude(), this.varIters); + return new CoverageAsProfileFeature(obsTime, varGroup.dateUnit, varGroup.zUnit, getLatitude(), getLongitude(), + this.varIters); } } @@ -320,9 +317,9 @@ private class CoverageAsProfileFeature extends ProfileFeatureImpl { List varIters; - CoverageAsProfileFeature(double obsTime, String timeName, CalendarDateUnit timeUnit, String altName, - String altUnits, double lat, double lon, List varIters) { - super("", timeName, timeUnit, altName, altUnits, lat, lon, obsTime, -1); + CoverageAsProfileFeature(double obsTime, CalendarDateUnit timeUnit, String altUnits, double lat, double lon, + List varIters) { + super("", timeUnit, altUnits, lat, lon, obsTime, -1); this.varIters = varIters; } @@ -466,8 +463,8 @@ private class CoverageAsStationFeature extends StationTimeSeriesFeatureImpl { private VarGroup varGroup; private CoverageAsStationFeature(String name, String desc, String wmoId, double lat, double lon, double alt, - String timeName, CalendarDateUnit timeUnit, String altName, String altUnits, int npts, VarGroup varGroup) { - super(name, desc, wmoId, lat, lon, alt, timeName, timeUnit, altName, altUnits, npts, StructureData.EMPTY); + CalendarDateUnit timeUnit, String altUnits, int npts, VarGroup varGroup) { + super(name, desc, wmoId, lat, lon, alt, timeUnit, altUnits, npts, StructureData.EMPTY); this.varGroup = varGroup; } diff --git a/cdm/core/src/test/java/ucar/nc2/ft2/coverage/writer/TestCoverageAsPoint.java b/cdm/core/src/test/java/ucar/nc2/ft2/coverage/writer/TestCoverageAsPoint.java index a98cc3c804..e9c5f85777 100644 --- a/cdm/core/src/test/java/ucar/nc2/ft2/coverage/writer/TestCoverageAsPoint.java +++ b/cdm/core/src/test/java/ucar/nc2/ft2/coverage/writer/TestCoverageAsPoint.java @@ -252,7 +252,7 @@ private void readCoverageAsPoint(List varNames, SubsetParams params, dou private void readCoverageAsProfile(List varNames, SubsetParams params, double[] alt, double[] time, double[] expected) throws IOException { - readCoverageAsProfile(varNames, params, alt, time, expected, 0, "time", "z"); + readCoverageAsProfile(varNames, params, alt, time, expected, 0, "time", "altitude"); } private void readCoverageAsProfile(List varNames, SubsetParams params, double[] alt, double[] time,