Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
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
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,11 @@ protected ADMSRoadEmissionSource construct() {
return new ADMSRoadEmissionSource();
}

@Override
protected String convertRoadTypeCode(final String roadTypeCode) {
return roadTypeCode;
}

@Override
protected void setSpecificVariables(final T source, final ADMSRoadEmissionSource emissionSource) {
emissionSource.setWidth(source.getWidth());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -48,13 +48,15 @@ protected GML2Road(final GMLConversionData conversionData) {
public S convert(final T source) throws AeriusException {
final S emissionSource = construct();
final List<StandardVehicles> mergingStandardVehicles = new ArrayList<>();
final String roadTypeCode = convertRoadTypeCode(source.getRoadTypeCode());

for (final IsGmlProperty<IsGmlVehicle> vp : source.getVehicles()) {
addVehicleEmissions(emissionSource.getSubSources(), source, vp, mergingStandardVehicles);
addVehicleEmissions(source.getRoadTypeCode(), emissionSource.getSubSources(), source, vp, mergingStandardVehicles);
Comment thread
Hilbrand marked this conversation as resolved.
Outdated
}
emissionSource.setTrafficDirection(source.getTrafficDirection());
emissionSource.setRoadManager(source.getRoadManager());
emissionSource.setRoadAreaCode(source.getRoadAreaCode());
emissionSource.setRoadTypeCode(source.getRoadTypeCode());
emissionSource.setRoadTypeCode(roadTypeCode);

setSpecificVariables(source, emissionSource);

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

protected abstract S construct();

/**
* Returns the internal representative road type code given the road type in the GML.
*
* @param roadTypeCode road type in the GML
* @return internally to be used road type code
*/
protected abstract String convertRoadTypeCode(String roadTypeCode);

protected abstract void setSpecificVariables(T source, S emissionSource);

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

protected void addVehicleEmissions(final List<Vehicles> addToVehicles, final T source, final IsGmlProperty<IsGmlVehicle> vp,
protected void addVehicleEmissions(final String gmlRoadTypeCode, final List<Vehicles> addToVehicles, final T source,
final IsGmlProperty<IsGmlVehicle> vp,
final List<StandardVehicles> mergingStandardVehicles) {
final IsGmlVehicle av = vp.getProperty();
if (av instanceof final IsGmlStandardVehicle standardVehicle) {
addEmissionValues(addToVehicles, source, standardVehicle, mergingStandardVehicles);
} else if (av instanceof final IsGmlSpecificVehicle specificVehicle) {

switch (av) {
case final IsGmlStandardVehicle standardVehicle ->
addEmissionValues(gmlRoadTypeCode, addToVehicles, source, standardVehicle, mergingStandardVehicles);
case final IsGmlSpecificVehicle specificVehicle ->
addToVehicles.add(GML2VehicleUtil.convertEmissionValuesSpecific(source, specificVehicle, getConversionData()));
} else if (av instanceof final IsGmlCustomVehicle customVehicle) {
addToVehicles.add(GML2VehicleUtil.convertEmissionValuesCustom(customVehicle));
} else {
throw new IllegalArgumentException("Instance not supported:" + av.getClass().getCanonicalName());
case final IsGmlCustomVehicle customVehicle -> addToVehicles.add(GML2VehicleUtil.convertEmissionValuesCustom(customVehicle));
default -> throw new IllegalArgumentException("Instance not supported:" + av.getClass().getCanonicalName());
}
}

private void addEmissionValues(final List<Vehicles> addToVehicles, final T source, final IsGmlStandardVehicle sv,
private void addEmissionValues(final String gmlRoadTypeCode, final List<Vehicles> addToVehicles, final T source, final IsGmlStandardVehicle sv,
final List<StandardVehicles> mergingStandardVehicles) {
final StandardVehicles standardVehicle = findExistingMatch(sv, mergingStandardVehicles).orElseGet(() -> {
final StandardVehicles vse = new StandardVehicles();
vse.setMaximumSpeed(sv.getMaximumSpeed());

vse.setMaximumSpeed(getMaximumSpeed(gmlRoadTypeCode, sv.getMaximumSpeed()));
vse.setStrictEnforcement(sv.isStrictEnforcement());
vse.setTimeUnit(TimeUnit.valueOf(sv.getTimeUnit().name()));
mergingStandardVehicles.add(vse);
Expand All @@ -100,6 +112,26 @@ private void addEmissionValues(final List<Vehicles> addToVehicles, final T sourc
standardVehicle.getValuesPerVehicleTypes().put(sv.getVehicleType(), valuesPerVehicleType);
}

/**
* Get the maximum speed value. For NON_URBAN_ROAD_NATIONAL and NON_URBAN_ROAD_GENERAL fill in the speed in case of missing speed.
* 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
* with speed >= 80 km/h. Therefore 80 is set. GENERAL represented roads with average speed of 60 km/h. Therefore 60 is set.
*
* @param gmlRoadTypeCode the road type code as set in the GML
* @param maximumSpeed optional max speed set in the GML
* @return the maximum speed to use.
*/
private static Integer getMaximumSpeed(final String gmlRoadTypeCode, final Integer maximumSpeed) {
if (maximumSpeed != null && maximumSpeed != 0) {
return maximumSpeed;
}
return switch (gmlRoadTypeCode) {
case "NON_URBAN_ROAD_NATIONAL" -> Integer.valueOf(80);
case "NON_URBAN_ROAD_GENERAL" -> Integer.valueOf(60);
default -> maximumSpeed;
};
}

private Optional<StandardVehicles> findExistingMatch(final IsGmlStandardVehicle sv, final List<StandardVehicles> mergingStandardVehicles) {
return mergingStandardVehicles.stream()
.filter(x -> Objects.equals(x.getMaximumSpeed(), sv.getMaximumSpeed()))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import nl.overheid.aerius.gml.base.GMLConversionData;
import nl.overheid.aerius.gml.base.IsGmlProperty;
import nl.overheid.aerius.shared.domain.v2.source.SRM1RoadEmissionSource;
import nl.overheid.aerius.shared.domain.v2.source.road.RoadType;
import nl.overheid.aerius.shared.domain.v2.source.road.SRM1LinearReference;
import nl.overheid.aerius.shared.exception.AeriusException;
import nl.overheid.aerius.shared.exception.ImaerExceptionReason;
Expand All @@ -44,6 +45,17 @@ protected SRM1RoadEmissionSource construct() {
return new SRM1RoadEmissionSource();
}

/**
* Returns the converted road type code set in the GML to the internal road type to use.
* In case of SRM1 roads and NON_URBAN_ROADS. It should always use NON_URBAN_ROAD_GENERAL.
*/
@Override
protected String convertRoadTypeCode(final String roadTypeCode) {
return roadTypeCode != null && roadTypeCode.startsWith(RoadType.NON_URBAN_ROAD.name())
? "NON_URBAN_ROAD_GENERAL"
: roadTypeCode;
}

@Override
protected void setSpecificVariables(final IsGmlSRM1Road source, final SRM1RoadEmissionSource emissionSource) {
// NO-OP for SRM1
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import nl.overheid.aerius.gml.base.GMLConversionData;
import nl.overheid.aerius.gml.base.IsGmlProperty;
import nl.overheid.aerius.shared.domain.v2.source.SRM2RoadEmissionSource;
import nl.overheid.aerius.shared.domain.v2.source.road.RoadType;
import nl.overheid.aerius.shared.domain.v2.source.road.SRM2LinearReference;
import nl.overheid.aerius.shared.domain.v2.source.road.SRM2RoadSideBarrier;
import nl.overheid.aerius.shared.exception.AeriusException;
Expand All @@ -45,6 +46,17 @@ protected SRM2RoadEmissionSource construct() {
return new SRM2RoadEmissionSource();
}

/**
* Returns the converted road type code set in the GML to the internal road type to use.
* In case of SRM2 roads and NON_URBAN_ROADS. It should always use NON_URBAN_ROAD_NATIONAL.
*/
@Override
protected String convertRoadTypeCode(final String roadTypeCode) {
return roadTypeCode != null && roadTypeCode.startsWith(RoadType.NON_URBAN_ROAD.name())
? "NON_URBAN_ROAD_NATIONAL"
: roadTypeCode;
}

@Override
protected void setSpecificVariables(final T source, final SRM2RoadEmissionSource emissionSource) {
// NO-OP
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
import nl.overheid.aerius.gml.base.source.road.v11.GML2SRM2RoadV11;
import nl.overheid.aerius.gml.base.source.road.v40.IsGmlStandardVehicle;
import nl.overheid.aerius.shared.domain.v2.base.TimeUnit;
import nl.overheid.aerius.shared.domain.v2.source.road.RoadType;
import nl.overheid.aerius.shared.domain.v2.source.road.StandardVehicles;
import nl.overheid.aerius.shared.domain.v2.source.road.ValuesPerVehicleType;
import nl.overheid.aerius.shared.domain.v2.source.road.Vehicles;
Expand All @@ -42,11 +43,12 @@ public GML2SRM2RoadV10(final GMLConversionData conversionData) {
}

@Override
protected void addEmissionValues(final List<Vehicles> addToVehicles, final T source, final IsGmlStandardVehicle sv,
protected void addEmissionValues(final RoadType roadType, final List<Vehicles> addToVehicles, final T source, final IsGmlStandardVehicle sv,
final List<StandardVehicles> mergingStandardVehicles) {
final StandardVehicles standardVehicle = findExistingMatch(sv, mergingStandardVehicles).orElseGet(() -> {
final StandardVehicles vse = new StandardVehicles();
vse.setMaximumSpeed(source.getMaximumSpeed());

vse.setMaximumSpeed(getMaximumSpeed(roadType, source.getMaximumSpeed()));
vse.setStrictEnforcement(source.isStrictEnforcement());
vse.setTimeUnit(TimeUnit.valueOf(sv.getTimeUnit().name()));
mergingStandardVehicles.add(vse);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import nl.overheid.aerius.gml.base.GMLConversionData;
import nl.overheid.aerius.gml.base.IsGmlProperty;
import nl.overheid.aerius.shared.domain.v2.source.SRM1RoadEmissionSource;
import nl.overheid.aerius.shared.domain.v2.source.road.RoadType;
import nl.overheid.aerius.shared.domain.v2.source.road.SRM1LinearReference;
import nl.overheid.aerius.shared.exception.AeriusException;
import nl.overheid.aerius.shared.exception.ImaerExceptionReason;
Expand All @@ -44,6 +45,16 @@ protected SRM1RoadEmissionSource construct() {
return new SRM1RoadEmissionSource();
}

@Override
protected String convertRoadTypeCode(final RoadType roadType) {
return roadType == RoadType.NON_URBAN_ROAD ? "NON_URBAN_ROAD_GENERAL" : roadType.getRoadTypeCode();
}

@Override
protected Integer getMaximumSpeed(final RoadType roadType, final Integer maximumSpeed) {
return (maximumSpeed == null || maximumSpeed == 0) && roadType == RoadType.NON_URBAN_ROAD ? Integer.valueOf(60) : maximumSpeed;
}

@Override
protected void setSpecificVariables(final IsGmlSRM1Road source, final SRM1RoadEmissionSource emissionSource) {
// Overwrite the road type based on sector with the one based on speed profile
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,7 @@
import nl.overheid.aerius.gml.base.source.road.IsGmlRoadSideBarrier;
import nl.overheid.aerius.gml.base.source.road.IsGmlSRM2RoadLinearReference;
import nl.overheid.aerius.shared.domain.v2.source.SRM2RoadEmissionSource;
import nl.overheid.aerius.shared.domain.v2.source.road.RoadType;
import nl.overheid.aerius.shared.domain.v2.source.road.SRM2LinearReference;
import nl.overheid.aerius.shared.domain.v2.source.road.SRM2RoadSideBarrier;
import nl.overheid.aerius.shared.exception.AeriusException;
Expand All @@ -47,6 +48,16 @@ protected SRM2RoadEmissionSource construct() {
return new SRM2RoadEmissionSource();
}

@Override
protected String convertRoadTypeCode(final RoadType roadType) {
return roadType == null ? null : roadType.getRoadTypeCode();
}

@Override
protected Integer getMaximumSpeed(final RoadType roadType, final Integer maximumSpeed) {
return (maximumSpeed == null || maximumSpeed == 0) && roadType == RoadType.NON_URBAN_ROAD ? Integer.valueOf(80) : maximumSpeed;
}

@Override
protected void setSpecificVariables(final T source, final SRM2RoadEmissionSource emissionSource) {
// NO-OP
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,15 +57,16 @@ protected GML2SRMRoad(final GMLConversionData conversionData) {
public S convert(final T source) throws AeriusException {
final S emissionSource = construct();
final List<StandardVehicles> mergingStandardVehicles = new ArrayList<>();
final RoadType roadType = RoadType.valueFromSectorId(source.getSectorId());

emissionSource.setRoadTypeCode(convertRoadTypeCode(roadType));
for (final IsGmlProperty<IsGmlVehicle> vp : source.getVehicles()) {
addVehicleEmissions(emissionSource.getSubSources(), source, vp, mergingStandardVehicles);
addVehicleEmissions(roadType, emissionSource.getSubSources(), source, vp, mergingStandardVehicles);
}
emissionSource.setTrafficDirection(source.getTrafficDirection());
emissionSource.setRoadManager(source.getRoadManager());
emissionSource.setRoadAreaCode("NL");
// Ensure road type get set before specific, as it's overwritten by SRM1
Comment thread
Hilbrand marked this conversation as resolved.
Outdated
final RoadType roadType = RoadType.valueFromSectorId(source.getSectorId());
emissionSource.setRoadTypeCode(roadType == null ? null : roadType.getRoadTypeCode());

setSpecificVariables(source, emissionSource);

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

protected abstract S construct();

protected abstract String convertRoadTypeCode(RoadType roadType);

protected abstract Integer getMaximumSpeed(final RoadType roadType, final Integer maximumSpeed);

protected abstract void setSpecificVariables(T source, S emissionSource);

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

protected void addVehicleEmissions(final List<Vehicles> addToVehicles, final T source, final IsGmlProperty<IsGmlVehicle> vp,
final List<StandardVehicles> mergingStandardVehicles) {
protected void addVehicleEmissions(final RoadType roadType, final List<Vehicles> addToVehicles, final T source,
final IsGmlProperty<IsGmlVehicle> vp, final List<StandardVehicles> mergingStandardVehicles) {
final IsGmlVehicle av = vp.getProperty();
if (av instanceof IsGmlStandardVehicle) {
addEmissionValues(addToVehicles, source, (IsGmlStandardVehicle) av, mergingStandardVehicles);
addEmissionValues(roadType, addToVehicles, source, (IsGmlStandardVehicle) av, mergingStandardVehicles);
} else if (av instanceof IsGmlSpecificVehicle) {
addEmissionValues(addToVehicles, source, (IsGmlSpecificVehicle) av);
} else if (av instanceof IsGmlCustomVehicle) {
Expand All @@ -95,11 +100,12 @@ protected void addVehicleEmissions(final List<Vehicles> addToVehicles, final T s

}

protected void addEmissionValues(final List<Vehicles> addToVehicles, final T source, final IsGmlStandardVehicle sv,
protected void addEmissionValues(final RoadType roadType, final List<Vehicles> addToVehicles, final T source, final IsGmlStandardVehicle sv,
final List<StandardVehicles> mergingStandardVehicles) {
final StandardVehicles standardVehicle = findExistingMatch(sv, mergingStandardVehicles).orElseGet(() -> {
final StandardVehicles vse = new StandardVehicles();
vse.setMaximumSpeed(sv.getMaximumSpeed());

vse.setMaximumSpeed(getMaximumSpeed(roadType, sv.getMaximumSpeed()));
vse.setStrictEnforcement(sv.isStrictEnforcement());
vse.setTimeUnit(TimeUnit.valueOf(sv.getTimeUnit().name()));
mergingStandardVehicles.add(vse);
Expand All @@ -112,6 +118,7 @@ protected void addEmissionValues(final List<Vehicles> addToVehicles, final T sou
standardVehicle.getValuesPerVehicleTypes().put(sv.getVehicleType().getStandardVehicleCode(), valuesPerVehicleType);
}


Comment thread
Hilbrand marked this conversation as resolved.
Outdated
protected Optional<StandardVehicles> findExistingMatch(final IsGmlStandardVehicle sv, final List<StandardVehicles> mergingStandardVehicles) {
return mergingStandardVehicles.stream()
.filter(x -> Objects.equals(x.getMaximumSpeed(), sv.getMaximumSpeed()))
Expand Down
Loading
Loading