mirror of
https://github.com/eclipse-sailing-analytics/sailing-analytics.git
synced 2026-09-20 04:35:32 +00:00
added a first speed/direction-based GRIB wind field implementation
Change-Id: I6e179752b58bf903449b6d3e7f83e88d572892d9
This commit is contained in:
+12
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
+46
-7
@@ -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).
|
||||
|
||||
Reference in New Issue
Block a user