Skip to content
Open
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
94 commits
Select commit Hold shift + click to select a range
6bb6984
Add ground temperature (1m) as option to weather data.
pierrepetersmeier Jun 18, 2025
0342ae2
Merge branch 'dev' into 1343-add-ground-temperature-1m-as-option-to-w…
pierrepetersmeier Jun 26, 2025
920be80
Address review feedback and align test suite
pierrepetersmeier Jul 2, 2025
e259bee
Merge branch 'dev' into pp/#1343-add-ground-temperature-1m-as-option-…
pierrepetersmeier Jul 2, 2025
1b8dd09
fixing the comments and tests.
pierrepetersmeier Jul 9, 2025
6a77ffc
fmt
pierrepetersmeier Jul 9, 2025
d46b0d1
Merge branch 'dev' into pp/#1343-add-ground-temperature-1m-as-option-…
pierrepetersmeier Jul 10, 2025
9f767ed
Meeting
pierrepetersmeier Jul 11, 2025
b015b66
Add GroundTemperatureValue and refactor WeatherValue, CosmoTimeBasedW…
pierrepetersmeier Jul 16, 2025
8e33409
Merge branch 'dev' into pp/#1343-add-ground-temperature-1m-as-option-…
pierrepetersmeier Jul 16, 2025
b0d87d9
Remove logger.warn
pierrepetersmeier Jul 28, 2025
0399aa3
fmt
pierrepetersmeier Aug 12, 2025
813cdbe
Merge branch 'dev' into pp/#1343-add-ground-temperature-1m-as-option-…
pierrepetersmeier Aug 12, 2025
88191d1
fmt
pierrepetersmeier Aug 12, 2025
47ac942
Merge branch 'dev' into pp/#1343-add-ground-temperature-1m-as-option-…
pierrepetersmeier Aug 18, 2025
41302fe
fmt
pierrepetersmeier Aug 25, 2025
3c153a3
Merge remote-tracking branch 'origin/pp/#1343-add-ground-temperature-…
pierrepetersmeier Aug 25, 2025
83b3736
Merge branch 'dev' into pp/#1343-add-ground-temperature-1m-as-option-…
pierrepetersmeier Sep 24, 2025
13f27ee
Merge remote-tracking branch 'origin/pp/#1343-add-ground-temperature-…
pierrepetersmeier Oct 1, 2025
55a7c15
Add GroundTemperatureValue 0cm and 80cm.
pierrepetersmeier Oct 17, 2025
cde88f0
Merge branch 'dev' into pp/#1343-add-ground-temperature-1m-as-option-…
pierrepetersmeier Oct 17, 2025
f0698b4
Fix SqlSinkTest
pierrepetersmeier Oct 19, 2025
1d9ff09
fmt
pierrepetersmeier Oct 19, 2025
4ec2c68
fmt
pierrepetersmeier Oct 19, 2025
f939e57
fmt
danielfeismann Oct 20, 2025
55bb4e1
Merge branch 'dev' into pp/#1343-add-ground-temperature-1m-as-option-…
danielfeismann Oct 20, 2025
71ab33a
Apply suggestion from @danielfeismann
pierrepetersmeier Oct 22, 2025
224aa30
Update src/test/resources/edu/ie3/datamodel/io/source/csv/_weather/co…
pierrepetersmeier Oct 22, 2025
6039cc2
Update src/test/resources/edu/ie3/datamodel/io/sink/_sql/time_series.sql
pierrepetersmeier Oct 22, 2025
46fb11f
remove unused function
pierrepetersmeier Oct 22, 2025
082451a
Merge branch 'dev' into pp/#1343-add-ground-temperature-1m-as-option-…
pierrepetersmeier Oct 22, 2025
3a0e1e9
remove unused function and refactoring tests
pierrepetersmeier Oct 31, 2025
57640e2
fmt
pierrepetersmeier Nov 2, 2025
7f11669
Merge branch 'dev' into pp/#1343-add-ground-temperature-1m-as-option-…
pierrepetersmeier Nov 2, 2025
1c5c4ba
InfluxDB
pierrepetersmeier Nov 2, 2025
3be844f
TestData
pierrepetersmeier Nov 2, 2025
3f04286
fmt
pierrepetersmeier Nov 2, 2025
c8f0d18
fmt
pierrepetersmeier Nov 2, 2025
c067c0b
fmt
pierrepetersmeier Nov 2, 2025
64c0172
fmt
pierrepetersmeier Nov 2, 2025
d691a2c
Update src/main/java/edu/ie3/datamodel/models/value/WeatherValue.java
pierrepetersmeier Nov 4, 2025
e80cb33
Merge branch 'dev' into pp/#1343-add-ground-temperature-1m-as-option-…
pierrepetersmeier Nov 4, 2025
42e8599
Optional
pierrepetersmeier Nov 4, 2025
ae9da09
FlatMap instead of Map. Optional in Tests.
pierrepetersmeier Nov 4, 2025
481ab12
enhancing TimeSeriesProcessor
danielfeismann Nov 4, 2025
5efc4d2
sonar
danielfeismann Nov 4, 2025
41d031e
optinal empty
danielfeismann Nov 4, 2025
a1967ea
Rename ground temperature columns in SQL schema
pierrepetersmeier Nov 6, 2025
aa481ca
Rename GroundTemperature variable
pierrepetersmeier Nov 6, 2025
ac127ec
Merge branch 'dev' into pp/#1343-add-ground-temperature-1m-as-option-…
pierrepetersmeier Nov 6, 2025
9d7215c
Fix tests
pierrepetersmeier Nov 6, 2025
2b6ed95
Re-add t_2m and add ground_temperature_level_1 and ground_temperature…
pierrepetersmeier Nov 7, 2025
fe531ab
Rename ground temperature constants for consistency
pierrepetersmeier Nov 7, 2025
47455fe
Rename tg_1 and tg_2 to tg1 and tg2
pierrepetersmeier Nov 7, 2025
6338599
Add t_g column to weather SQL schema
pierrepetersmeier Nov 7, 2025
b4ace56
Remove t_g
pierrepetersmeier Nov 9, 2025
2da8ced
Fix InfluxDbWeatherSourceIconIT.groovy
pierrepetersmeier Nov 9, 2025
f85cf9b
fmt
pierrepetersmeier Nov 9, 2025
9a6840c
fix InfluxDbConnector.java und weather.txt
pierrepetersmeier Nov 9, 2025
da1a8cf
Merge branch 'dev' into pp/#1343-add-ground-temperature-1m-as-option-…
pierrepetersmeier Nov 10, 2025
c5d924d
Update docs/readthedocs/models/input/additionaldata/weathersource.md
pierrepetersmeier Nov 11, 2025
2aba46d
Update CHANGELOG.md
pierrepetersmeier Nov 11, 2025
857989d
Merge branch 'dev' into pp/#1343-add-ground-temperature-1m-as-option-…
pierrepetersmeier Nov 13, 2025
93e2d73
Apply review feedback without #1470
pierrepetersmeier Nov 21, 2025
453b865
Merge branch 'dev' into pp/#1343-add-ground-temperature-1m-as-option-…
pierrepetersmeier Nov 21, 2025
526bd88
Equals instead of Operator in CosmoTimeBasedWeatherValueFactoryTest.g…
pierrepetersmeier Nov 24, 2025
418c1f9
Merge remote-tracking branch 'origin/pp/#1343-add-ground-temperature-…
pierrepetersmeier Nov 24, 2025
cca6cdc
Equals instead of Operator in CosmoTimeBasedWeatherValueFactoryTest.g…
pierrepetersmeier Nov 24, 2025
9d238dc
Merge branch 'dev' into pp/#1343-add-ground-temperature-1m-as-option-…
pierrepetersmeier Nov 24, 2025
53c78b7
Add failure exception test and smoke test to CosmoTimeBasedWeatherVal…
pierrepetersmeier Nov 25, 2025
059b0a0
Merge branch 'dev' into pp/#1343-add-ground-temperature-1m-as-option-…
danielfeismann Nov 26, 2025
b387d96
Merge branch 'dev' into pp/#1343-add-ground-temperature-1m-as-option-…
pierrepetersmeier Dec 3, 2025
7d215ee
Add assertions to weather source tests. fmt
pierrepetersmeier Dec 3, 2025
133061e
vary cosmo ground temperature values. Fix four cosmo tests.
pierrepetersmeier Dec 3, 2025
34619a2
Merge branch 'dev' into pp/#1343-add-ground-temperature-1m-as-option-…
danielfeismann Dec 3, 2025
0a02d69
fix after merging dev
danielfeismann Dec 3, 2025
b8ebe1d
Merge branch 'dev' into pp/#1343-add-ground-temperature-1m-as-option-…
pierrepetersmeier Dec 5, 2025
a848141
Refactor ground temperature handling in weather data classes and tests
pierrepetersmeier Dec 5, 2025
cfab07c
Replace Objects.equals with equalsIgnoreUUID in weather source integr…
pierrepetersmeier Dec 8, 2025
137d9cf
remove unneeded imports
danielfeismann Dec 8, 2025
bb3bc19
more unneeded imports
danielfeismann Dec 8, 2025
29c6e6d
fmt
danielfeismann Dec 8, 2025
d166641
Update ground temperature values in Cosmo weather tests for a test.
pierrepetersmeier Dec 8, 2025
a8b15b7
Fix ground temperature values in Cosmo weather tests and clean up cod…
pierrepetersmeier Dec 8, 2025
280d846
fmt
danielfeismann Dec 9, 2025
e9fe902
remove imports
danielfeismann Dec 9, 2025
e2d74d9
remove double test conditions
danielfeismann Dec 9, 2025
bbd46cf
fix tests by using different temperature values
danielfeismann Dec 9, 2025
91e616f
update WeatherSourceTestHelper for optional weather data
danielfeismann Dec 9, 2025
0cc3b2f
fix weather.txt for cosmo
danielfeismann Dec 9, 2025
9fd20c5
fix weather.json, weather.sql and csv for cosmo
danielfeismann Dec 9, 2025
6f8b8f3
Merge branch 'dev' into pp/#1343-add-ground-temperature-1m-as-option-…
pierrepetersmeier Dec 12, 2025
a882b03
Refactor ground temperature values as options in weather data files. …
pierrepetersmeier Dec 19, 2025
b14ecc0
Merge branch 'dev' into pp/#1343-add-ground-temperature-1m-as-option-…
pierrepetersmeier Dec 19, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,9 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0

## [Unreleased/Snapshot]

### Added
- Add ground temperature (1m) as option to weather data. [#1343](https://github.com/ie3-institute/PowerSystemDataModel/issues/1343)

### Fixed
- Fixed handling of `CongestionResult.InputModelType` in `EntityProcessor` [#1325](https://github.com/ie3-institute/PowerSystemDataModel/issues/1325)
- -Fixed em fields in input models [#1331](https://github.com/ie3-institute/PowerSystemDataModel/issues/1331)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,21 +1,19 @@
/*
* © 2021. TU Dortmund University,
* © 2020. TU Dortmund University,
* Institute of Energy Systems, Energy Efficiency and Energy Economics,
* Research group Distribution grid planning and operation
*/
package edu.ie3.datamodel.io.factory.timeseries;

import edu.ie3.datamodel.exceptions.FactoryException;
import edu.ie3.datamodel.models.StandardUnits;
import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue;
import edu.ie3.datamodel.models.value.SolarIrradianceValue;
import edu.ie3.datamodel.models.value.TemperatureValue;
import edu.ie3.datamodel.models.value.WeatherValue;
import edu.ie3.datamodel.models.value.WindValue;
import edu.ie3.util.TimeUtil;
import edu.ie3.util.quantities.PowerSystemUnits;
import edu.ie3.util.quantities.interfaces.Irradiance;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import javax.measure.quantity.Angle;
import javax.measure.quantity.Length;
Expand All @@ -24,85 +22,75 @@
import org.locationtech.jts.geom.Point;
import tech.units.indriya.ComparableQuantity;
import tech.units.indriya.quantity.Quantities;
import tech.units.indriya.unit.Units;

/**
* Factory implementation of {@link TimeBasedWeatherValueFactory}, that is able to handle field to
* value mapping in the typical PowerSystemDataModel (PSDM) column scheme
*/
public class CosmoTimeBasedWeatherValueFactory extends TimeBasedWeatherValueFactory {
private static final String TIME = "time";
private static final String COORDINATE_ID = "coordinateId";
private static final String DIFFUSE_IRRADIANCE = "diffuseIrradiance";
private static final String DIRECT_IRRADIANCE = "directIrradiance";
private static final String TEMPERATURE = "temperature";
private static final String WIND_DIRECTION = "windDirection";
private static final String WIND_VELOCITY = "windVelocity";

private static final String GROUND_TEMPERATURE_SURFACE = "groundTemperatureSurface";
private static final String GROUND_TEMPERATURE_1M = "groundTemperature1m";

public CosmoTimeBasedWeatherValueFactory(TimeUtil timeUtil) {
super(timeUtil);
}

public CosmoTimeBasedWeatherValueFactory(DateTimeFormatter dateTimeFormatter) {
super(dateTimeFormatter);
}

public CosmoTimeBasedWeatherValueFactory() {
super();
}

@Override
protected List<Set<String>> getFields(Class<?> entityClass) {
Set<String> minConstructorParams =
newSet(
COORDINATE_ID,
DIFFUSE_IRRADIANCE,
DIRECT_IRRADIANCE,
TEMPERATURE,
WIND_DIRECTION,
WIND_VELOCITY);
new HashSet<>(
Set.of(
COORDINATE_ID,
TIME,
DIFFUSE_IRRADIANCE,
DIRECT_IRRADIANCE,
TEMPERATURE,
WIND_DIRECTION,
WIND_VELOCITY));

Set<String> allParameters =
expandSet(minConstructorParams, GROUND_TEMPERATURE_SURFACE, GROUND_TEMPERATURE_1M);
minConstructorParams.remove(COORDINATE_ID);
allParameters.remove(COORDINATE_ID);
return Collections.singletonList(minConstructorParams);
Set<String> withGroundTemps = new HashSet<>(minConstructorParams);
withGroundTemps.add(GROUND_TEMPERATURE_SURFACE);
withGroundTemps.add(GROUND_TEMPERATURE_1M);

return List.of(minConstructorParams, withGroundTemps);
}

@Override
protected TimeBasedValue<WeatherValue> buildModel(TimeBasedWeatherValueData data) {
Point coordinate = data.getCoordinate();
ZonedDateTime time = timeUtil.toZonedDateTime(data.getField(TIME));
SolarIrradianceValue solarIrradiance = new SolarIrradianceValue(
data.getQuantity(DIRECT_IRRADIANCE, PowerSystemUnits.WATT_PER_SQUAREMETRE),
data.getQuantity(DIFFUSE_IRRADIANCE, PowerSystemUnits.WATT_PER_SQUAREMETRE)
);
TemperatureValue temperature = new TemperatureValue(
data.getQuantity(TEMPERATURE, StandardUnits.TEMPERATURE)
);
WindValue wind = new WindValue(
data.getQuantity(WIND_DIRECTION, StandardUnits.WIND_DIRECTION),
data.getQuantity(WIND_VELOCITY, StandardUnits.WIND_VELOCITY)
);

Map<ComparableQuantity<Length>, TemperatureValue> groundTemperatures = new HashMap<>();
ComparableQuantity<Irradiance> directIrradiance =
data.getQuantity(DIRECT_IRRADIANCE, PowerSystemUnits.WATT_PER_SQUAREMETRE);
ComparableQuantity<Irradiance> diffuseIrradiance =
data.getQuantity(DIFFUSE_IRRADIANCE, PowerSystemUnits.WATT_PER_SQUAREMETRE);
ComparableQuantity<Temperature> temperature =
data.getQuantity(TEMPERATURE, StandardUnits.TEMPERATURE);
ComparableQuantity<Angle> windDirection =
data.getQuantity(WIND_DIRECTION, StandardUnits.WIND_DIRECTION);
ComparableQuantity<Speed> windVelocity =
data.getQuantity(WIND_VELOCITY, StandardUnits.WIND_VELOCITY);

Map<ComparableQuantity<Length>, TemperatureValue> groundTemperatures = new HashMap<>();

data.getField(GROUND_TEMPERATURE_SURFACE).ifPresent(value -> {
ComparableQuantity<Length> depth = Quantities.getQuantity(0, StandardUnits.DEPTH);
TemperatureValue tempValue = new TemperatureValue(
data.getQuantity(GROUND_TEMPERATURE_SURFACE, StandardUnits.TEMPERATURE)
);
groundTemperatures.put(depth, tempValue);
});
try {
TemperatureValue tempValue =
new TemperatureValue(
data.getQuantity(GROUND_TEMPERATURE_SURFACE, StandardUnits.TEMPERATURE));
groundTemperatures.put(Quantities.getQuantity(0, Units.METRE), tempValue);
} catch (FactoryException ignored) {
}

data.getField(GROUND_TEMPERATURE_1M).ifPresent(value -> {
ComparableQuantity<Length> depth = Quantities.getQuantity(1, StandardUnits.DEPTH);
TemperatureValue tempValue = new TemperatureValue(
data.getQuantity(GROUND_TEMPERATURE_1M, StandardUnits.TEMPERATURE)
);
groundTemperatures.put(depth, tempValue);
});
try {
TemperatureValue tempValue =
new TemperatureValue(data.getQuantity(GROUND_TEMPERATURE_1M, StandardUnits.TEMPERATURE));
groundTemperatures.put(Quantities.getQuantity(1, Units.METRE), tempValue);
} catch (FactoryException ignored) {
}

WeatherValue weatherValue =
new WeatherValue(
Expand All @@ -112,7 +100,8 @@ protected TimeBasedValue<WeatherValue> buildModel(TimeBasedWeatherValueData data
temperature,
windDirection,
windVelocity,
groundTemperatures);
groundTemperatures);

return new TimeBasedValue<>(time, weatherValue);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -5,38 +5,32 @@
*/
package edu.ie3.datamodel.io.factory.timeseries;

import edu.ie3.datamodel.exceptions.FactoryException;
import edu.ie3.datamodel.models.StandardUnits;
import edu.ie3.datamodel.models.timeseries.individual.TimeBasedValue;
import edu.ie3.datamodel.models.value.TemperatureValue;
import edu.ie3.datamodel.models.value.WeatherValue;
import edu.ie3.util.quantities.PowerSystemUnits;
import edu.ie3.util.quantities.interfaces.Irradiance;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.util.*;
import javax.measure.quantity.Angle;
import javax.measure.quantity.Length;
import javax.measure.quantity.Speed;
import javax.measure.quantity.Temperature;
import org.locationtech.jts.geom.Point;
import tech.units.indriya.ComparableQuantity;
import tech.units.indriya.quantity.Quantities;
import tech.units.indriya.unit.Units;

/**
* Factory implementation of {@link TimeBasedWeatherValueFactory}, that is able to handle field to
* value mapping in the column scheme, ie<sup>3</sup> uses to store its data from German Federal
* Weather Service's ICON-EU model
*/
public class IconTimeBasedWeatherValueFactory extends TimeBasedWeatherValueFactory {
/* Redefine the column names to meet the icon specifications */
private static final String DIFFUSE_IRRADIANCE = "aswdifdS";
private static final String DIRECT_IRRADIANCE = "aswdirS";
private static final String TEMPERATURE = "t2m";
private static final String WIND_VELOCITY_U = "u131m";
private static final String WIND_VELOCITY_V = "v131m";

/** Ground-/Skin-Temperature at surface (0m) */
private static final String GROUND_TEMP_SURFACE = "tG";
/** Soil-Temperature at 100cm depth (example parameter name) */
private static final String SOIL_TEMP_100CM = "tso100cm";

public IconTimeBasedWeatherValueFactory() {
Expand All @@ -52,13 +46,19 @@ protected List<Set<String>> getFields(Class<?> entityClass) {
Set<String> minParameters =
newSet(
DIFFUSE_IRRADIANCE, DIRECT_IRRADIANCE, TEMPERATURE, WIND_VELOCITY_U, WIND_VELOCITY_V);

Set<String> minParametersWithGroundTemp = new HashSet<>(minParameters);
minParametersWithGroundTemp.add(GROUND_TEMP_SURFACE);
minParametersWithGroundTemp.add(SOIL_TEMP_100CM);

Set<String> allParameters =
expandSet(
minParameters,
"albrad",
"asobs",
"aswdifuS",
"tG",
GROUND_TEMP_SURFACE,
SOIL_TEMP_100CM,
"u10m",
"u20m",
"u216m",
Expand All @@ -78,7 +78,7 @@ protected List<Set<String>> getFields(Class<?> entityClass) {
"sobsrad",
"t131m");

return Arrays.asList(minParameters, allParameters);
return Arrays.asList(minParameters, minParametersWithGroundTemp, allParameters);
}

@Override
Expand All @@ -93,56 +93,48 @@ protected TimeBasedValue<WeatherValue> buildModel(TimeBasedWeatherValueData data
data.getQuantity(TEMPERATURE, Units.KELVIN).to(StandardUnits.TEMPERATURE);
ComparableQuantity<Angle> windDirection = getWindDirection(data);
ComparableQuantity<Speed> windVelocity = getWindVelocity(data);

Map<ComparableQuantity<Length>, TemperatureValue> groundTemperatures = new HashMap<>();

try {
TemperatureValue tempValue =
new TemperatureValue(
data.getQuantity(GROUND_TEMP_SURFACE, Units.KELVIN).to(StandardUnits.TEMPERATURE));
groundTemperatures.put(Quantities.getQuantity(0, Units.METRE), tempValue);
} catch (FactoryException ignored) {
}

try {
TemperatureValue tempValue =
new TemperatureValue(
data.getQuantity(SOIL_TEMP_100CM, Units.KELVIN).to(StandardUnits.TEMPERATURE));
groundTemperatures.put(Quantities.getQuantity(1, Units.METRE), tempValue);
} catch (FactoryException ignored) {
}

WeatherValue weatherValue =
new WeatherValue(
coordinate,
directIrradiance,
diffuseIrradiance,
temperature,
windDirection,
windVelocity);
windVelocity,
groundTemperatures);

return new TimeBasedValue<>(time, weatherValue);
}

/**
* Determines the wind direction. In ICON the wind velocity is given in three dimensional
* Cartesian coordinates. Here, the upward component is neglected. 0° or 0 rad are defined to
* point northwards. The angle increases clockwise. Please note, that the wind direction is the
* direction, the wind <b>comes</b> from and not goes to. We choose to use the wind velocity
* calculations at 131 m above ground, as this is a height that pretty good matches the common hub
* height of today's onshore wind generators, that are commonly connected to the voltage levels of
* interest.
*
* @param data Collective information to convert
* @return A {@link ComparableQuantity} of type {@link Speed}, that is converted to {@link
* StandardUnits#WIND_VELOCITY}
*/
private static ComparableQuantity<Angle> getWindDirection(TimeBasedWeatherValueData data) {
/* Get the three dimensional parts of the wind velocity vector in cartesian coordinates */
double u =
data.getDouble(WIND_VELOCITY_U); // Wind component from west to east (parallel to latitudes)
double v =
data.getDouble(
WIND_VELOCITY_V); // Wind component from south to north (parallel to longitudes)
double u = data.getDouble(WIND_VELOCITY_U);
double v = data.getDouble(WIND_VELOCITY_V);

double angle = Math.toDegrees(Math.atan2(-u, -v));
return Quantities.getQuantity(angle < 0 ? angle + 360d : angle, PowerSystemUnits.DEGREE_GEOM)
.to(StandardUnits.WIND_DIRECTION);
}

/**
* Determines the wind velocity. In ICON the wind velocity is given in three dimensional Cartesian
* coordinates. Here, the upward component is neglected. We choose to use the wind velocity
* calculations at 131 m above ground, as this is a height that pretty good matches the common hub
* height of today's onshore wind generators, that are commonly connected to the voltage levels of
* interest.
*
* @param data Collective information to convert
* @return A {@link ComparableQuantity} of type {@link Speed}, that is converted to {@link
* StandardUnits#WIND_VELOCITY}
*/
private static ComparableQuantity<Speed> getWindVelocity(TimeBasedWeatherValueData data) {
/* Get the three dimensional parts of the wind velocity vector in cartesian coordinates */
double u = data.getDouble(WIND_VELOCITY_U);
double v = data.getDouble(WIND_VELOCITY_V);

Expand Down
Loading
Loading