added a first speed/direction-based GRIB wind field implementation

Change-Id: I6e179752b58bf903449b6d3e7f83e88d572892d9
This commit is contained in:
Axel Uhl
2017-01-20 18:30:05 +01:00
parent a37ff48e94
commit 13e0a4096f
3 changed files with 58 additions and 20 deletions
@@ -21,6 +21,7 @@ import ucar.ma2.Array;
import ucar.nc2.Attribute;
import ucar.nc2.Dimension;
import ucar.nc2.VariableSimpleIF;
import ucar.nc2.dataset.VariableDS;
import ucar.nc2.dt.GridCoordSystem;
import ucar.nc2.dt.GridDatatype;
import ucar.nc2.dt.grid.GridDataset;
@@ -194,4 +195,15 @@ public abstract class AbstractGribWindFieldImpl implements GribWindField {
return new Triple<Double, TimePoint, Position>((double) arrayForTimePointBefore.getFloat(0), responseTimePoint, responsePosition);
}
protected Optional<String> getUnit(VariableDS variable) {
final Optional<String> result;
final ucar.nc2.Attribute attribute = variable.findAttribute("units");
if (attribute != null) {
result = Optional.of(attribute.getStringValue());
} else {
result = Optional.empty();
}
return result;
}
}
@@ -1,21 +1,60 @@
package com.sap.sailing.grib.impl;
import com.sap.sailing.domain.common.Position;
import com.sap.sailing.domain.tracking.WindWithConfidence;
import com.sap.sse.common.TimePoint;
import java.io.IOException;
import com.sap.sailing.domain.common.Position;
import com.sap.sailing.domain.common.Wind;
import com.sap.sailing.domain.common.impl.DegreeBearingImpl;
import com.sap.sailing.domain.common.impl.MeterPerSecondSpeedWithDegreeBearingImpl;
import com.sap.sailing.domain.common.impl.RadianBearingImpl;
import com.sap.sailing.domain.common.impl.WindImpl;
import com.sap.sailing.domain.tracking.WindWithConfidence;
import com.sap.sailing.domain.tracking.impl.WindWithConfidenceImpl;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.Util.Triple;
import ucar.nc2.dt.GridDatatype;
import ucar.nc2.dt.grid.GridDataset;
import ucar.nc2.ft.FeatureDataset;
public class SpeedAndDirectionWindField extends AbstractGribWindFieldImpl {
private static final int WIND_DIRECTION_PARAMETER_ID = 31;
private static final int WIND_SPEED_PARAMETER_ID = 32;
public SpeedAndDirectionWindField(FeatureDataset dataSet) {
super(dataSet, /* baseConfidence */ 0.5);
}
@Override
public WindWithConfidence<TimePoint> getWind(TimePoint timePoint, Position position) {
// TODO Auto-generated method stub
return null;
public WindWithConfidence<TimePoint> getWind(TimePoint timePoint, Position position) throws IOException {
FeatureDataset dataSet = getDataSet();
final Wind wind;
final double confidence;
if (dataSet instanceof GridDataset) {
Triple<Double, TimePoint, Position> directionComponentInDegreesTrue = null;
Triple<Double, TimePoint, Position> speedComponentInMetersPerSecond = null;
for (final GridDatatype grid : ((GridDataset) dataSet).getGrids()) {
final Integer variableId = getVariableId(grid.getVariable()).orElse(-1);
if (variableId == WIND_DIRECTION_PARAMETER_ID) {
assert getUnit(grid.getVariable()).get().equals("m/s");
directionComponentInDegreesTrue = getValue(grid, timePoint, position);
} else if (variableId == WIND_SPEED_PARAMETER_ID) {
assert getUnit(grid.getVariable()).get().equals("m/s");
speedComponentInMetersPerSecond = getValue(grid, timePoint, position);
}
if (directionComponentInDegreesTrue != null && speedComponentInMetersPerSecond != null) {
break;
}
}
confidence = getTimeConfidence(timePoint, directionComponentInDegreesTrue.getB());
wind = new WindImpl(directionComponentInDegreesTrue.getC(), directionComponentInDegreesTrue.getB(),
new MeterPerSecondSpeedWithDegreeBearingImpl(speedComponentInMetersPerSecond.getA(),
new DegreeBearingImpl(directionComponentInDegreesTrue.getA())));
} else {
wind = null;
confidence = 0;
}
return new WindWithConfidenceImpl<TimePoint>(wind, confidence*getBaseConfidence(), timePoint, /* useSpeed */ true);
}
/**
@@ -23,7 +62,7 @@ public class SpeedAndDirectionWindField extends AbstractGribWindFieldImpl {
* (GRIB parameter #31).
*/
public static boolean handles(FeatureDataset dataSet) {
return hasVariable(dataSet, 31) && hasVariable(dataSet, 32);
return hasVariable(dataSet, WIND_DIRECTION_PARAMETER_ID) && hasVariable(dataSet, WIND_SPEED_PARAMETER_ID);
}
}
@@ -1,7 +1,6 @@
package com.sap.sailing.grib.impl;
import java.io.IOException;
import java.util.Optional;
import com.sap.sailing.domain.common.Position;
import com.sap.sailing.domain.common.Wind;
@@ -13,7 +12,6 @@ import com.sap.sailing.domain.tracking.impl.WindWithConfidenceImpl;
import com.sap.sse.common.TimePoint;
import com.sap.sse.common.Util.Triple;
import ucar.nc2.dataset.VariableDS;
import ucar.nc2.dt.GridDatatype;
import ucar.nc2.dt.grid.GridDataset;
import ucar.nc2.ft.FeatureDataset;
@@ -60,17 +58,6 @@ public class UVWindField extends AbstractGribWindFieldImpl {
return new WindWithConfidenceImpl<TimePoint>(wind, confidence*getBaseConfidence(), timePoint, /* useSpeed */ true);
}
private Optional<String> getUnit(VariableDS variable) {
final Optional<String> result;
final ucar.nc2.Attribute attribute = variable.findAttribute("units");
if (attribute != null) {
result = Optional.of(attribute.getStringValue());
} else {
result = Optional.empty();
}
return result;
}
/**
* Checks whether the data set has a u-component of wind (GRIB parameter #33) and a v-component of wind
* (GRIB parameter #34).