Skip to content

Commit 6c9b910

Browse files
committed
AER-4271 Added support for using max speed with NON_URBAN ROADS
With new road emissions for NON_URBAN_ROAD speed will be relevant. Therefore speed will be read. Because with new data speed determines the emission and not only the road type code, the road type code has been generalized to NON_URBAN_ROAD in the GML. The road type code NON_URBAN_ROAD_NATIONAL and NON_URBAN_ROAD_GENERAL could be used on both SRM1 and SRM2 soruces. But these with the new data they become explicitly for use with a specific SRM version. NON_URBAN_ROAD_NATIONAL is for SRM2 roads, and NON_URBAN_ROAD_GENERAL for SRM1 roads. This was somewhat implicit, as in Calculator UI only NON_URBAN_ROAD_NATIONAL was used, and only SRM2 can be modified in Calculator. But it would be possible to manually use NON_URBAN_ROAD_GENERAL in an SRM2 source. Both NON_URBAN_ROAD_NATIONAL and NON_URBAN_ROAD_GENERAL are still supported to be used in GML, also for backward compatibility.
1 parent a6b3e76 commit 6c9b910

30 files changed

Lines changed: 689 additions & 367 deletions

source/imaer-gml/src/main/java/nl/overheid/aerius/gml/base/source/road/GML2ADMSRoad.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,11 @@ protected ADMSRoadEmissionSource construct() {
4646
return new ADMSRoadEmissionSource();
4747
}
4848

49+
@Override
50+
protected String convertRoadTypeCode(final String roadTypeCode) {
51+
return roadTypeCode;
52+
}
53+
4954
@Override
5055
protected void setSpecificVariables(final T source, final ADMSRoadEmissionSource emissionSource) {
5156
emissionSource.setWidth(source.getWidth());

source/imaer-gml/src/main/java/nl/overheid/aerius/gml/base/source/road/GML2Road.java

Lines changed: 44 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -48,13 +48,15 @@ protected GML2Road(final GMLConversionData conversionData) {
4848
public S convert(final T source) throws AeriusException {
4949
final S emissionSource = construct();
5050
final List<StandardVehicles> mergingStandardVehicles = new ArrayList<>();
51+
final String roadTypeCode = convertRoadTypeCode(source.getRoadTypeCode());
52+
5153
for (final IsGmlProperty<IsGmlVehicle> vp : source.getVehicles()) {
52-
addVehicleEmissions(emissionSource.getSubSources(), source, vp, mergingStandardVehicles);
54+
addVehicleEmissions(source.getRoadTypeCode(), emissionSource.getSubSources(), source, vp, mergingStandardVehicles);
5355
}
5456
emissionSource.setTrafficDirection(source.getTrafficDirection());
5557
emissionSource.setRoadManager(source.getRoadManager());
5658
emissionSource.setRoadAreaCode(source.getRoadAreaCode());
57-
emissionSource.setRoadTypeCode(source.getRoadTypeCode());
59+
emissionSource.setRoadTypeCode(roadTypeCode);
5860

5961
setSpecificVariables(source, emissionSource);
6062

@@ -65,29 +67,39 @@ public S convert(final T source) throws AeriusException {
6567

6668
protected abstract S construct();
6769

70+
/**
71+
* Returns the internal representative road type code given the road type in the GML.
72+
*
73+
* @param roadTypeCode road type in the GML
74+
* @return internally to be used road type code
75+
*/
76+
protected abstract String convertRoadTypeCode(String roadTypeCode);
77+
6878
protected abstract void setSpecificVariables(T source, S emissionSource);
6979

7080
protected abstract void setOptionalVariables(T source, S emissionSource) throws AeriusException;
7181

72-
protected void addVehicleEmissions(final List<Vehicles> addToVehicles, final T source, final IsGmlProperty<IsGmlVehicle> vp,
82+
protected void addVehicleEmissions(final String gmlRoadTypeCode, final List<Vehicles> addToVehicles, final T source,
83+
final IsGmlProperty<IsGmlVehicle> vp,
7384
final List<StandardVehicles> mergingStandardVehicles) {
7485
final IsGmlVehicle av = vp.getProperty();
75-
if (av instanceof final IsGmlStandardVehicle standardVehicle) {
76-
addEmissionValues(addToVehicles, source, standardVehicle, mergingStandardVehicles);
77-
} else if (av instanceof final IsGmlSpecificVehicle specificVehicle) {
86+
87+
switch (av) {
88+
case final IsGmlStandardVehicle standardVehicle ->
89+
addEmissionValues(gmlRoadTypeCode, addToVehicles, source, standardVehicle, mergingStandardVehicles);
90+
case final IsGmlSpecificVehicle specificVehicle ->
7891
addToVehicles.add(GML2VehicleUtil.convertEmissionValuesSpecific(source, specificVehicle, getConversionData()));
79-
} else if (av instanceof final IsGmlCustomVehicle customVehicle) {
80-
addToVehicles.add(GML2VehicleUtil.convertEmissionValuesCustom(customVehicle));
81-
} else {
82-
throw new IllegalArgumentException("Instance not supported:" + av.getClass().getCanonicalName());
92+
case final IsGmlCustomVehicle customVehicle -> addToVehicles.add(GML2VehicleUtil.convertEmissionValuesCustom(customVehicle));
93+
default -> throw new IllegalArgumentException("Instance not supported:" + av.getClass().getCanonicalName());
8394
}
8495
}
8596
86-
private void addEmissionValues(final List<Vehicles> addToVehicles, final T source, final IsGmlStandardVehicle sv,
97+
private void addEmissionValues(final String gmlRoadTypeCode, final List<Vehicles> addToVehicles, final T source, final IsGmlStandardVehicle sv,
8798
final List<StandardVehicles> mergingStandardVehicles) {
8899
final StandardVehicles standardVehicle = findExistingMatch(sv, mergingStandardVehicles).orElseGet(() -> {
89100
final StandardVehicles vse = new StandardVehicles();
90-
vse.setMaximumSpeed(sv.getMaximumSpeed());
101+
102+
vse.setMaximumSpeed(getMaximumSpeed(gmlRoadTypeCode, sv.getMaximumSpeed()));
91103
vse.setStrictEnforcement(sv.isStrictEnforcement());
92104
vse.setTimeUnit(TimeUnit.valueOf(sv.getTimeUnit().name()));
93105
mergingStandardVehicles.add(vse);
@@ -100,6 +112,26 @@ private void addEmissionValues(final List<Vehicles> addToVehicles, final T sourc
100112
standardVehicle.getValuesPerVehicleTypes().put(sv.getVehicleType(), valuesPerVehicleType);
101113
}
102114
115+
/**
116+
* Get the maximum speed value. For NON_URBAN_ROAD_NATIONAL and NON_URBAN_ROAD_GENERAL fill in the speed in case of missing speed.
117+
* These two codes are used in older versions of IMAER. In those cases speed was not set for NON_URBAN_ROAD. NATIONAL is representative for roads
118+
* with speed >= 80 km/h. Therefore 80 is set. GENERAL represented roads with average speed of 60 km/h. Therefore 60 is set.
119+
*
120+
* @param gmlRoadTypeCode the road type code as set in the GML
121+
* @param maximumSpeed optional max speed set in the GML
122+
* @return the maximum speed to use.
123+
*/
124+
private static Integer getMaximumSpeed(final String gmlRoadTypeCode, final Integer maximumSpeed) {
125+
if (maximumSpeed != null && maximumSpeed != 0) {
126+
return maximumSpeed;
127+
}
128+
return switch (gmlRoadTypeCode) {
129+
case "NON_URBAN_ROAD_NATIONAL" -> Integer.valueOf(80);
130+
case "NON_URBAN_ROAD_GENERAL" -> Integer.valueOf(60);
131+
default -> maximumSpeed;
132+
};
133+
}
134+
103135
private Optional<StandardVehicles> findExistingMatch(final IsGmlStandardVehicle sv, final List<StandardVehicles> mergingStandardVehicles) {
104136
return mergingStandardVehicles.stream()
105137
.filter(x -> Objects.equals(x.getMaximumSpeed(), sv.getMaximumSpeed()))

source/imaer-gml/src/main/java/nl/overheid/aerius/gml/base/source/road/GML2SRM1Road.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import nl.overheid.aerius.gml.base.GMLConversionData;
2323
import nl.overheid.aerius.gml.base.IsGmlProperty;
2424
import nl.overheid.aerius.shared.domain.v2.source.SRM1RoadEmissionSource;
25+
import nl.overheid.aerius.shared.domain.v2.source.road.RoadType;
2526
import nl.overheid.aerius.shared.domain.v2.source.road.SRM1LinearReference;
2627
import nl.overheid.aerius.shared.exception.AeriusException;
2728
import nl.overheid.aerius.shared.exception.ImaerExceptionReason;
@@ -44,6 +45,17 @@ protected SRM1RoadEmissionSource construct() {
4445
return new SRM1RoadEmissionSource();
4546
}
4647

48+
/**
49+
* Returns the converted road type code set in the GML to the internal road type to use.
50+
* In case of SRM1 roads and NON_URBAN_ROADS. It should always use NON_URBAN_ROAD_GENERAL.
51+
*/
52+
@Override
53+
protected String convertRoadTypeCode(final String roadTypeCode) {
54+
return roadTypeCode != null && roadTypeCode.startsWith(RoadType.NON_URBAN_ROAD.name())
55+
? "NON_URBAN_ROAD_GENERAL"
56+
: roadTypeCode;
57+
}
58+
4759
@Override
4860
protected void setSpecificVariables(final IsGmlSRM1Road source, final SRM1RoadEmissionSource emissionSource) {
4961
// NO-OP for SRM1

source/imaer-gml/src/main/java/nl/overheid/aerius/gml/base/source/road/GML2SRM2Road.java

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import nl.overheid.aerius.gml.base.GMLConversionData;
2323
import nl.overheid.aerius.gml.base.IsGmlProperty;
2424
import nl.overheid.aerius.shared.domain.v2.source.SRM2RoadEmissionSource;
25+
import nl.overheid.aerius.shared.domain.v2.source.road.RoadType;
2526
import nl.overheid.aerius.shared.domain.v2.source.road.SRM2LinearReference;
2627
import nl.overheid.aerius.shared.domain.v2.source.road.SRM2RoadSideBarrier;
2728
import nl.overheid.aerius.shared.exception.AeriusException;
@@ -45,6 +46,17 @@ protected SRM2RoadEmissionSource construct() {
4546
return new SRM2RoadEmissionSource();
4647
}
4748

49+
/**
50+
* Returns the converted road type code set in the GML to the internal road type to use.
51+
* In case of SRM2 roads and NON_URBAN_ROADS. It should always use NON_URBAN_ROAD_NATIONAL.
52+
*/
53+
@Override
54+
protected String convertRoadTypeCode(final String roadTypeCode) {
55+
return roadTypeCode != null && roadTypeCode.startsWith(RoadType.NON_URBAN_ROAD.name())
56+
? "NON_URBAN_ROAD_NATIONAL"
57+
: roadTypeCode;
58+
}
59+
4860
@Override
4961
protected void setSpecificVariables(final T source, final SRM2RoadEmissionSource emissionSource) {
5062
// NO-OP

source/imaer-gml/src/main/java/nl/overheid/aerius/gml/base/source/road/v10/GML2SRM2RoadV10.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import nl.overheid.aerius.gml.base.source.road.v11.GML2SRM2RoadV11;
2424
import nl.overheid.aerius.gml.base.source.road.v40.IsGmlStandardVehicle;
2525
import nl.overheid.aerius.shared.domain.v2.base.TimeUnit;
26+
import nl.overheid.aerius.shared.domain.v2.source.road.RoadType;
2627
import nl.overheid.aerius.shared.domain.v2.source.road.StandardVehicles;
2728
import nl.overheid.aerius.shared.domain.v2.source.road.ValuesPerVehicleType;
2829
import nl.overheid.aerius.shared.domain.v2.source.road.Vehicles;
@@ -42,11 +43,12 @@ public GML2SRM2RoadV10(final GMLConversionData conversionData) {
4243
}
4344

4445
@Override
45-
protected void addEmissionValues(final List<Vehicles> addToVehicles, final T source, final IsGmlStandardVehicle sv,
46+
protected void addEmissionValues(final RoadType roadType, final List<Vehicles> addToVehicles, final T source, final IsGmlStandardVehicle sv,
4647
final List<StandardVehicles> mergingStandardVehicles) {
4748
final StandardVehicles standardVehicle = findExistingMatch(sv, mergingStandardVehicles).orElseGet(() -> {
4849
final StandardVehicles vse = new StandardVehicles();
49-
vse.setMaximumSpeed(source.getMaximumSpeed());
50+
51+
vse.setMaximumSpeed(getMaximumSpeed(roadType, source.getMaximumSpeed()));
5052
vse.setStrictEnforcement(source.isStrictEnforcement());
5153
vse.setTimeUnit(TimeUnit.valueOf(sv.getTimeUnit().name()));
5254
mergingStandardVehicles.add(vse);

source/imaer-gml/src/main/java/nl/overheid/aerius/gml/base/source/road/v40/GML2SRM1Road.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
import nl.overheid.aerius.gml.base.GMLConversionData;
2323
import nl.overheid.aerius.gml.base.IsGmlProperty;
2424
import nl.overheid.aerius.shared.domain.v2.source.SRM1RoadEmissionSource;
25+
import nl.overheid.aerius.shared.domain.v2.source.road.RoadType;
2526
import nl.overheid.aerius.shared.domain.v2.source.road.SRM1LinearReference;
2627
import nl.overheid.aerius.shared.exception.AeriusException;
2728
import nl.overheid.aerius.shared.exception.ImaerExceptionReason;
@@ -44,6 +45,16 @@ protected SRM1RoadEmissionSource construct() {
4445
return new SRM1RoadEmissionSource();
4546
}
4647

48+
@Override
49+
protected String convertRoadTypeCode(final RoadType roadType) {
50+
return roadType == RoadType.NON_URBAN_ROAD ? "NON_URBAN_ROAD_GENERAL" : roadType.getRoadTypeCode();
51+
}
52+
53+
@Override
54+
protected Integer getMaximumSpeed(final RoadType roadType, final Integer maximumSpeed) {
55+
return (maximumSpeed == null || maximumSpeed == 0) && roadType == RoadType.NON_URBAN_ROAD ? Integer.valueOf(60) : maximumSpeed;
56+
}
57+
4758
@Override
4859
protected void setSpecificVariables(final IsGmlSRM1Road source, final SRM1RoadEmissionSource emissionSource) {
4960
// Overwrite the road type based on sector with the one based on speed profile

source/imaer-gml/src/main/java/nl/overheid/aerius/gml/base/source/road/v40/GML2SRM2Road.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import nl.overheid.aerius.gml.base.source.road.IsGmlRoadSideBarrier;
2525
import nl.overheid.aerius.gml.base.source.road.IsGmlSRM2RoadLinearReference;
2626
import nl.overheid.aerius.shared.domain.v2.source.SRM2RoadEmissionSource;
27+
import nl.overheid.aerius.shared.domain.v2.source.road.RoadType;
2728
import nl.overheid.aerius.shared.domain.v2.source.road.SRM2LinearReference;
2829
import nl.overheid.aerius.shared.domain.v2.source.road.SRM2RoadSideBarrier;
2930
import nl.overheid.aerius.shared.exception.AeriusException;
@@ -47,6 +48,16 @@ protected SRM2RoadEmissionSource construct() {
4748
return new SRM2RoadEmissionSource();
4849
}
4950

51+
@Override
52+
protected String convertRoadTypeCode(final RoadType roadType) {
53+
return roadType == null ? null : roadType.getRoadTypeCode();
54+
}
55+
56+
@Override
57+
protected Integer getMaximumSpeed(final RoadType roadType, final Integer maximumSpeed) {
58+
return (maximumSpeed == null || maximumSpeed == 0) && roadType == RoadType.NON_URBAN_ROAD ? Integer.valueOf(80) : maximumSpeed;
59+
}
60+
5061
@Override
5162
protected void setSpecificVariables(final T source, final SRM2RoadEmissionSource emissionSource) {
5263
// NO-OP

source/imaer-gml/src/main/java/nl/overheid/aerius/gml/base/source/road/v40/GML2SRMRoad.java

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -57,15 +57,16 @@ protected GML2SRMRoad(final GMLConversionData conversionData) {
5757
public S convert(final T source) throws AeriusException {
5858
final S emissionSource = construct();
5959
final List<StandardVehicles> mergingStandardVehicles = new ArrayList<>();
60+
final RoadType roadType = RoadType.valueFromSectorId(source.getSectorId());
61+
62+
emissionSource.setRoadTypeCode(convertRoadTypeCode(roadType));
6063
for (final IsGmlProperty<IsGmlVehicle> vp : source.getVehicles()) {
61-
addVehicleEmissions(emissionSource.getSubSources(), source, vp, mergingStandardVehicles);
64+
addVehicleEmissions(roadType, emissionSource.getSubSources(), source, vp, mergingStandardVehicles);
6265
}
6366
emissionSource.setTrafficDirection(source.getTrafficDirection());
6467
emissionSource.setRoadManager(source.getRoadManager());
6568
emissionSource.setRoadAreaCode("NL");
6669
// Ensure road type get set before specific, as it's overwritten by SRM1
67-
final RoadType roadType = RoadType.valueFromSectorId(source.getSectorId());
68-
emissionSource.setRoadTypeCode(roadType == null ? null : roadType.getRoadTypeCode());
6970

7071
setSpecificVariables(source, emissionSource);
7172

@@ -76,15 +77,19 @@ public S convert(final T source) throws AeriusException {
7677

7778
protected abstract S construct();
7879

80+
protected abstract String convertRoadTypeCode(RoadType roadType);
81+
82+
protected abstract Integer getMaximumSpeed(final RoadType roadType, final Integer maximumSpeed);
83+
7984
protected abstract void setSpecificVariables(T source, S emissionSource);
8085

8186
protected abstract void setOptionalVariables(T source, S emissionSource) throws AeriusException;
8287

83-
protected void addVehicleEmissions(final List<Vehicles> addToVehicles, final T source, final IsGmlProperty<IsGmlVehicle> vp,
84-
final List<StandardVehicles> mergingStandardVehicles) {
88+
protected void addVehicleEmissions(final RoadType roadType, final List<Vehicles> addToVehicles, final T source,
89+
final IsGmlProperty<IsGmlVehicle> vp, final List<StandardVehicles> mergingStandardVehicles) {
8590
final IsGmlVehicle av = vp.getProperty();
8691
if (av instanceof IsGmlStandardVehicle) {
87-
addEmissionValues(addToVehicles, source, (IsGmlStandardVehicle) av, mergingStandardVehicles);
92+
addEmissionValues(roadType, addToVehicles, source, (IsGmlStandardVehicle) av, mergingStandardVehicles);
8893
} else if (av instanceof IsGmlSpecificVehicle) {
8994
addEmissionValues(addToVehicles, source, (IsGmlSpecificVehicle) av);
9095
} else if (av instanceof IsGmlCustomVehicle) {
@@ -95,11 +100,12 @@ protected void addVehicleEmissions(final List<Vehicles> addToVehicles, final T s
95100

96101
}
97102

98-
protected void addEmissionValues(final List<Vehicles> addToVehicles, final T source, final IsGmlStandardVehicle sv,
103+
protected void addEmissionValues(final RoadType roadType, final List<Vehicles> addToVehicles, final T source, final IsGmlStandardVehicle sv,
99104
final List<StandardVehicles> mergingStandardVehicles) {
100105
final StandardVehicles standardVehicle = findExistingMatch(sv, mergingStandardVehicles).orElseGet(() -> {
101106
final StandardVehicles vse = new StandardVehicles();
102-
vse.setMaximumSpeed(sv.getMaximumSpeed());
107+
108+
vse.setMaximumSpeed(getMaximumSpeed(roadType, sv.getMaximumSpeed()));
103109
vse.setStrictEnforcement(sv.isStrictEnforcement());
104110
vse.setTimeUnit(TimeUnit.valueOf(sv.getTimeUnit().name()));
105111
mergingStandardVehicles.add(vse);
@@ -112,6 +118,7 @@ protected void addEmissionValues(final List<Vehicles> addToVehicles, final T sou
112118
standardVehicle.getValuesPerVehicleTypes().put(sv.getVehicleType().getStandardVehicleCode(), valuesPerVehicleType);
113119
}
114120

121+
115122
protected Optional<StandardVehicles> findExistingMatch(final IsGmlStandardVehicle sv, final List<StandardVehicles> mergingStandardVehicles) {
116123
return mergingStandardVehicles.stream()
117124
.filter(x -> Objects.equals(x.getMaximumSpeed(), sv.getMaximumSpeed()))

0 commit comments

Comments
 (0)