diff --git a/src/main/java/org/tub/vsp/bvwp/RunCsvWriting.java b/src/main/java/org/tub/vsp/bvwp/RunCsvWriting.java index 080d45c..82a6ede 100644 --- a/src/main/java/org/tub/vsp/bvwp/RunCsvWriting.java +++ b/src/main/java/org/tub/vsp/bvwp/RunCsvWriting.java @@ -5,18 +5,16 @@ import org.tub.vsp.bvwp.scraping.StreetScraper; import java.util.List; -import java.util.Map; public class RunCsvWriting { public static void main(String[] args) { String filePath = "../../shared-svn/"; - Map constructionCostsByProject = BvwpUtils.getConstructionCostsFromTudFile(filePath ); +// Map constructionCostsByProject = BvwpUtils.getConstructionCostsFromTudFile(filePath ); List allStreetBaseData = new StreetScraper().extractAllLocalBaseData("./data/street/all", "A", ".*", "") .stream() - .map(s -> new StreetAnalysisDataContainer(s, - constructionCostsByProject.get(s.getProjectInformation().getProjectNumber()))) + .map(s -> new StreetAnalysisDataContainer(s, 0)) .toList(); StreetCsvWriter csvWriter = new StreetCsvWriter("output/street_data.csv"); diff --git a/src/main/java/org/tub/vsp/bvwp/data/Headers.java b/src/main/java/org/tub/vsp/bvwp/data/Headers.java index 74ac110..bc7a819 100644 --- a/src/main/java/org/tub/vsp/bvwp/data/Headers.java +++ b/src/main/java/org/tub/vsp/bvwp/data/Headers.java @@ -135,6 +135,10 @@ public final class Headers{ public static final String NKV_ELTTIME_CARBON700TPR0_INVCOSTTUD = "NKV_elTtime_carbon700tpr0_invcostTud"; public static final String NKV_ELTTIME_CARBON2000_INVCOSTTUD = "NKV_elTtime_carbon2000_invcostTud"; + public static final String DAUER_PLANUNG = "Planungsdauer_jahre"; + public static final String DAUER_BAU = "Baudauer_jahre"; + public static final String DAUER_BETRIEB = "Betriebsdauer_jahre"; + public static String capped5Of( String str ) { int cap=5; return cappedOf( cap, str ); diff --git a/src/main/java/org/tub/vsp/bvwp/data/container/base/street/StreetCostBenefitAnalysisDataContainer.java b/src/main/java/org/tub/vsp/bvwp/data/container/base/street/StreetCostBenefitAnalysisDataContainer.java index db9e186..e56cdb7 100644 --- a/src/main/java/org/tub/vsp/bvwp/data/container/base/street/StreetCostBenefitAnalysisDataContainer.java +++ b/src/main/java/org/tub/vsp/bvwp/data/container/base/street/StreetCostBenefitAnalysisDataContainer.java @@ -4,6 +4,7 @@ import org.apache.logging.log4j.Logger; import org.tub.vsp.bvwp.data.type.Benefit; import org.tub.vsp.bvwp.data.type.Cost; +import org.tub.vsp.bvwp.data.type.Durations; import org.tub.vsp.bvwp.data.type.Emission; import java.util.Map; @@ -30,6 +31,8 @@ public class StreetCostBenefitAnalysisDataContainer { private Benefit overallBenefit; private Cost cost; + private Durations durations; + public Benefit getNb() { return nb; } @@ -115,6 +118,11 @@ public Map getNa() { return na; } + public StreetCostBenefitAnalysisDataContainer setNa(Map na) { + this.na = na; + return this; + } + public Benefit getNaCumulated() { if (na == null) { return new Benefit(); @@ -125,11 +133,6 @@ public Benefit getNaCumulated() { .reduce(new Benefit(0., 0.), Benefit::add); } - public StreetCostBenefitAnalysisDataContainer setNa(Map na) { - this.na = na; - return this; - } - public Benefit getNt() { return nt; } @@ -192,68 +195,13 @@ public Benefit getCo2EquivalentBenefit() { return emissions.add(lifecycle); } - @Override - public boolean equals(Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - - StreetCostBenefitAnalysisDataContainer that = (StreetCostBenefitAnalysisDataContainer) o; - - if (!Objects.equals(nb, that.nb)) { - return false; - } - if (!Objects.equals(nw, that.nw)) { - return false; - } - if (!Objects.equals(ns, that.ns)) { - return false; - } - if (!Objects.equals(nrz, that.nrz)) { - return false; - } - if (!Objects.equals(ntz, that.ntz)) { - return false; - } - if (!Objects.equals(ni, that.ni)) { - return false; - } - if (!Objects.equals(nl, that.nl)) { - return false; - } - if (!Objects.equals(ng, that.ng)) { - return false; - } - if (!Objects.equals(na, that.na)) { - return false; - } - if (!Objects.equals(nt, that.nt)) { - return false; - } - if (!Objects.equals(nz, that.nz)) { - return false; - } - return Objects.equals(cost, that.cost); + public Durations getDurations() { + return durations; } - @Override - public int hashCode() { - int result = nb != null ? nb.hashCode() : 0; - result = 31 * result + (nw != null ? nw.hashCode() : 0); - result = 31 * result + (ns != null ? ns.hashCode() : 0); - result = 31 * result + (nrz != null ? nrz.hashCode() : 0); - result = 31 * result + (ntz != null ? ntz.hashCode() : 0); - result = 31 * result + (ni != null ? ni.hashCode() : 0); - result = 31 * result + (nl != null ? nl.hashCode() : 0); - result = 31 * result + (ng != null ? ng.hashCode() : 0); - result = 31 * result + (na != null ? na.hashCode() : 0); - result = 31 * result + (nt != null ? nt.hashCode() : 0); - result = 31 * result + (nz != null ? nz.hashCode() : 0); - result = 31 * result + (cost != null ? cost.hashCode() : 0); - return result; + public StreetCostBenefitAnalysisDataContainer setDurations(Durations durations) { + this.durations = durations; + return this; } public Benefit getNbPersonnel() { @@ -273,4 +221,39 @@ public StreetCostBenefitAnalysisDataContainer setNbVehicle(Benefit nbVehicle) { this.nbVehicle = nbVehicle; return this; } + + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + if (o == null || getClass() != o.getClass()) { + return false; + } + + StreetCostBenefitAnalysisDataContainer that = (StreetCostBenefitAnalysisDataContainer) o; + return Objects.equals(nb, that.nb) && Objects.equals(nbOperations, that.nbOperations) && Objects.equals(nbPersonnel, that.nbPersonnel) && Objects.equals(nbVehicle, that.nbVehicle) && Objects.equals(nw, that.nw) && Objects.equals(ns, that.ns) && Objects.equals(nrz, that.nrz) && Objects.equals(ntz, that.ntz) && Objects.equals(ni, that.ni) && Objects.equals(nl, that.nl) && Objects.equals(ng, that.ng) && Objects.equals(na, that.na) && Objects.equals(nt, that.nt) && Objects.equals(nz, that.nz) && Objects.equals(overallBenefit, that.overallBenefit) && Objects.equals(cost, that.cost) && Objects.equals(durations, that.durations); + } + + @Override + public int hashCode() { + int result = Objects.hashCode(nb); + result = 31 * result + Objects.hashCode(nbOperations); + result = 31 * result + Objects.hashCode(nbPersonnel); + result = 31 * result + Objects.hashCode(nbVehicle); + result = 31 * result + Objects.hashCode(nw); + result = 31 * result + Objects.hashCode(ns); + result = 31 * result + Objects.hashCode(nrz); + result = 31 * result + Objects.hashCode(ntz); + result = 31 * result + Objects.hashCode(ni); + result = 31 * result + Objects.hashCode(nl); + result = 31 * result + Objects.hashCode(ng); + result = 31 * result + Objects.hashCode(na); + result = 31 * result + Objects.hashCode(nt); + result = 31 * result + Objects.hashCode(nz); + result = 31 * result + Objects.hashCode(overallBenefit); + result = 31 * result + Objects.hashCode(cost); + result = 31 * result + Objects.hashCode(durations); + return result; + } } diff --git a/src/main/java/org/tub/vsp/bvwp/data/mapper/costBenefit/CostBenefitMapperUtils.java b/src/main/java/org/tub/vsp/bvwp/data/mapper/costBenefit/CostBenefitMapperUtils.java index 87b2614..14850c4 100644 --- a/src/main/java/org/tub/vsp/bvwp/data/mapper/costBenefit/CostBenefitMapperUtils.java +++ b/src/main/java/org/tub/vsp/bvwp/data/mapper/costBenefit/CostBenefitMapperUtils.java @@ -6,6 +6,7 @@ import org.tub.vsp.bvwp.JSoupUtils; import org.tub.vsp.bvwp.data.type.Benefit; import org.tub.vsp.bvwp.data.type.Cost; +import org.tub.vsp.bvwp.data.type.Durations; import java.text.ParseException; import java.util.Optional; @@ -43,4 +44,25 @@ public static Cost extractCosts(Element table) { return new Cost(costs, overallCosts); } + + public static Durations extractDurations(Element table) { + double planning; + double construction; + double maintenance; + try { + planning = parseNumberWithSuffix(JSoupUtils.getTextFromRowAndCol(table, 1, 1), "Monate") / 12.; + construction = parseNumberWithSuffix(JSoupUtils.getTextFromRowAndCol(table, 2, 1), "Monate") / 12.; + maintenance = parseNumberWithSuffix(JSoupUtils.getTextFromRowAndCol(table, 3, 1), "Jahre"); + } catch (ParseException e) { + logger.warn("Could not parse duration value from {}", table); + return null; + } + + return new Durations(planning, construction, maintenance); + } + + private static Double parseNumberWithSuffix(String content, String suffix) throws ParseException { + assert content.endsWith(suffix); + return JSoupUtils.parseDouble(content.split(" ")[0]); + } } diff --git a/src/main/java/org/tub/vsp/bvwp/data/mapper/costBenefit/StreetCostBenefitMapper.java b/src/main/java/org/tub/vsp/bvwp/data/mapper/costBenefit/StreetCostBenefitMapper.java index 8e1693e..88685c7 100644 --- a/src/main/java/org/tub/vsp/bvwp/data/mapper/costBenefit/StreetCostBenefitMapper.java +++ b/src/main/java/org/tub/vsp/bvwp/data/mapper/costBenefit/StreetCostBenefitMapper.java @@ -23,14 +23,14 @@ public static StreetCostBenefitAnalysisDataContainer mapDocument(Document docume StreetCostBenefitMapper::isBenefitTable); Optional costTable = JSoupUtils.getTableByCssKeyAndPredicate(document, "table.table_kosten", StreetCostBenefitMapper::isCostTable); + Optional durationsTable = JSoupUtils.getTableByCssKeyAndPredicate(document, "table.table_kosten2", + StreetCostBenefitMapper::isDurationsTable); //We only scrape the cumulated values benefit.ifPresent(element -> result.setNb(extractSimpleBenefit(element, "NB")) .setNbVehicle(extractSimpleBenefit(element, "Fahrzeugvorhaltekosten", 0)) - .setNbPersonnel(extractSimpleBenefit(element, "Betriebsführungskosten " + - "(Personal)", 0)) - .setNbOperations(extractSimpleBenefit(element, "Betriebsführungskosten " + - "(Betrieb)", 0)) + .setNbPersonnel(extractSimpleBenefit(element, "Betriebsführungskosten (Personal)", 0)) + .setNbOperations(extractSimpleBenefit(element, "Betriebsführungskosten (Betrieb)", 0)) .setNw(extractSimpleBenefit(element, "NW")) .setNs(extractSimpleBenefit(element, "NS")) .setNrz(extractSimpleBenefit(element, "NRZ")) @@ -46,6 +46,8 @@ public static StreetCostBenefitAnalysisDataContainer mapDocument(Document docume costTable.ifPresent(element -> result.setCost(CostBenefitMapperUtils.extractCosts(element))); + durationsTable.ifPresent(element -> result.setDurations(CostBenefitMapperUtils.extractDurations(element))); + return result; } @@ -69,6 +71,13 @@ private static boolean isCostTable(Element element) { .contains("Summe bewertungsrelevanter Investitionskosten"); } + private static boolean isDurationsTable(Element element) { + return element.select("tr") + .get(0) + .text() + .contains("Grundlagen der Barwertermittlung"); + } + private static Benefit extractSimpleBenefit(Element table, String key) { return extractSimpleBenefit(table, key, 1); } diff --git a/src/main/java/org/tub/vsp/bvwp/data/type/Durations.java b/src/main/java/org/tub/vsp/bvwp/data/type/Durations.java new file mode 100644 index 0000000..42a0571 --- /dev/null +++ b/src/main/java/org/tub/vsp/bvwp/data/type/Durations.java @@ -0,0 +1,4 @@ +package org.tub.vsp.bvwp.data.type; + +public record Durations(double planning, double construction, double operation) { +} diff --git a/src/main/java/org/tub/vsp/bvwp/io/StreetCsvWriter.java b/src/main/java/org/tub/vsp/bvwp/io/StreetCsvWriter.java index 2780657..d1aa71b 100644 --- a/src/main/java/org/tub/vsp/bvwp/io/StreetCsvWriter.java +++ b/src/main/java/org/tub/vsp/bvwp/io/StreetCsvWriter.java @@ -164,6 +164,10 @@ private static List getCsvRecord(StreetAnalysisDataContainer analysisDat record.add(Headers.LENGTH, baseDataContainer.getProjectInformation().getLength()); + record.add(Headers.DAUER_PLANUNG, baseDataContainer.getCostBenefitAnalysis().getDurations().planning()); + record.add(Headers.DAUER_BAU, baseDataContainer.getCostBenefitAnalysis().getDurations().construction()); + record.add(Headers.DAUER_BETRIEB, baseDataContainer.getCostBenefitAnalysis().getDurations().operation()); + record.add(Headers.ADDTL_PKWKM_ORIG, baseDataContainer.getPhysicalEffect().getVehicleKilometers().overall()); record.add(Headers.ADDTL_PKWKM_INDUZ_ORIG, Optional.ofNullable(baseDataContainer.getPhysicalEffect().getVehicleKilometers().induced() ).orElse(0. ) ); @@ -246,6 +250,10 @@ private static List getHeaders(List analysi headers.addStringColumn(Headers.BAUTYP); headers.addDoubleColumn(Headers.LENGTH); + headers.addDoubleColumn(Headers.DAUER_PLANUNG); + headers.addDoubleColumn(Headers.DAUER_BAU); + headers.addDoubleColumn(Headers.DAUER_BETRIEB); + headers.addDoubleColumn( Headers.ADDTL_PKWKM_ORIG ); headers.addDoubleColumn(Headers.ADDTL_PKWKM_INDUZ_ORIG ); // headers.addDoubleColumn( Headers.PKWKM_INDUZ_NEU ); // added by automagic diff --git a/src/test/java/org/tub/vsp/bvwp/data/mapper/costBenefit/StreetCostBenefitMapperTest.java b/src/test/java/org/tub/vsp/bvwp/data/mapper/costBenefit/StreetCostBenefitMapperTest.java index 82af327..092c703 100644 --- a/src/test/java/org/tub/vsp/bvwp/data/mapper/costBenefit/StreetCostBenefitMapperTest.java +++ b/src/test/java/org/tub/vsp/bvwp/data/mapper/costBenefit/StreetCostBenefitMapperTest.java @@ -6,6 +6,7 @@ import org.tub.vsp.bvwp.data.container.base.street.StreetCostBenefitAnalysisDataContainer; import org.tub.vsp.bvwp.data.type.Benefit; import org.tub.vsp.bvwp.data.type.Cost; +import org.tub.vsp.bvwp.data.type.Durations; import org.tub.vsp.bvwp.data.type.Emission; import java.io.IOException; @@ -13,9 +14,7 @@ class StreetCostBenefitMapperTest { @Test void testMapper() throws IOException { - StreetCostBenefitMapper costBenefitMapper = new StreetCostBenefitMapper(); - StreetCostBenefitAnalysisDataContainer result = - costBenefitMapper.mapDocument(LocalFileAccessor.getLocalDocument("a20.html")); + StreetCostBenefitAnalysisDataContainer result = StreetCostBenefitMapper.mapDocument(LocalFileAccessor.getLocalDocument("a20.html")); Assertions.assertEquals(new Benefit(40.55, 1005.26), result.getNb()); Assertions.assertEquals(new Benefit(-31.675, -785.233), result.getNbOperations()); @@ -29,13 +28,13 @@ void testMapper() throws IOException { Assertions.assertEquals(new Benefit(0.136, 3.363), result.getNt()); Assertions.assertEquals(new Benefit(29.997, 743.646), result.getNz()); Assertions.assertEquals(new Cost(3145.75, 2737.176), result.getCost()); + + Assertions.assertEquals(new Durations(120. / 12., 48. / 12., 42.), result.getDurations()); } @Test void testNulls() throws IOException { - StreetCostBenefitMapper costBenefitMapper = new StreetCostBenefitMapper(); - StreetCostBenefitAnalysisDataContainer result = - costBenefitMapper.mapDocument(LocalFileAccessor.getLocalDocument("a2.html")); + StreetCostBenefitAnalysisDataContainer result = StreetCostBenefitMapper.mapDocument(LocalFileAccessor.getLocalDocument("a2.html")); Assertions.assertNotNull(result.getNa()); Assertions.assertEquals(result.getNa().get(Emission.CO2), new Benefit(0.0, 0.0)); @@ -44,5 +43,7 @@ void testNulls() throws IOException { Assertions.assertEquals(result.getNa().get(Emission.HC), new Benefit(0.0, 0.0)); Assertions.assertEquals(result.getNa().get(Emission.SO2), new Benefit(0.0, 0.0)); Assertions.assertEquals(result.getNa().get(Emission.PM), new Benefit(0.0, 0.0)); + + Assertions.assertEquals(new Durations(90. / 12., 56. / 12., 31.), result.getDurations()); } } diff --git a/src/test/java/org/tub/vsp/bvwp/io/JsonIoTest.java b/src/test/java/org/tub/vsp/bvwp/io/JsonIoTest.java index 0e589c4..bd9befd 100644 --- a/src/test/java/org/tub/vsp/bvwp/io/JsonIoTest.java +++ b/src/test/java/org/tub/vsp/bvwp/io/JsonIoTest.java @@ -59,13 +59,13 @@ void testSerializeJson_street() throws IOException { @Test void testSerializeJson_rail() throws IOException { RailScraper railScraper = new RailScraper(); - RailBaseDataContainer streetBaseData = railScraper.extractBaseData(LocalFileAccessor.getLocalDocument("2-003-v01.html")) + RailBaseDataContainer railBaseData = railScraper.extractBaseData(LocalFileAccessor.getLocalDocument("2-003-v01.html")) .orElseThrow(); //write Json to file JsonIo jsonIo = new JsonIo(); String filePath = "src/test/resources/testData/referenceData/2-003-v01.json"; RailBaseDataContainer deserializedContainer = jsonIo.readJson(filePath, RailBaseDataContainer.class); - Assertions.assertEquals(streetBaseData, deserializedContainer); + Assertions.assertEquals(railBaseData, deserializedContainer); } } diff --git a/src/test/resources/testData/referenceData/2-003-v01.json b/src/test/resources/testData/referenceData/2-003-v01.json index 69c522f..d3ac0d8 100644 --- a/src/test/resources/testData/referenceData/2-003-v01.json +++ b/src/test/resources/testData/referenceData/2-003-v01.json @@ -3,19 +3,19 @@ "projectInformation": { "projectNumber": "2-003-v01", "title": "ABS/NBS Hamburg / Bremerhaven – Hannover (Y-Trasse)", - "priority": "UNDEFINED", + "priority": "KB", "bautyp": null, "length": 200.2 }, "physicalEffect": { "emissionsDataContainer": { "emissions": { - "CO2": -74699.0, + "HC": 6.0, "SO2": -9.0, "NOX": -65.0, - "HC": 6.0, + "CO": -69.0, "PM": -1.0, - "CO": -69.0 + "CO2": -74699.0 } } }, diff --git a/src/test/resources/testData/referenceData/a20.csv b/src/test/resources/testData/referenceData/a20.csv index f07954d..273a089 100644 --- a/src/test/resources/testData/referenceData/a20.csv +++ b/src/test/resources/testData/referenceData/a20.csv @@ -1,2 +1,2 @@ -project _name;URL;Einstufung;bautyp;length;addtl_pkwkm_orig;addtl_pkwkm_induz;b_fzkm_orig;co2_equivalents_emissions_orig;b_co2_equivalents_orig;b_overall_orig;investmentCost_orig;DTV_Planfall;addtl_lane_km;b_orig_per_km;NKV_orig;NKV_co2;BCR_co2_680;NKV_carbon700;BCR_co2_2000;NKV_el03;NKV_el03_carbon215_invcostTud;NKV_el03_carbon700tpr0_invcostTud;NKV_el03_carbon700tpr0;addtl_pkwkm_el03;cost_co2_orig;cost_co2_el03;investmentCost_tud;addtl_pkwkm_from_ttime;NKV_elTtime_carbon215_invcostTud;NKV_elTtime_carbon700tpr0_invcostTud;NKV_elTtime_carbon2000_invcostTud;remark_0;remark_1;remark_2;remark_3;remark_4 -A20-G10-NI-SH;;VB;NB4;161.0;131.53;143.95;-785.233;90786.067;-326.34;5305.683;2737.176;19000.0;644.0;32.954552795031056;1.9383784601355558;1.6896861769340954;1.6896861769340954;1.6896861769340954;1.0932250067607725;1.8621980025426863;0.040104418189946894;0.029984022872012638;1.3523906336608384;711.62;198.59881207206251;407.11813226428285;123456.789;648.0;0.039835779909582765;0.02910856208016608;3.740819618184369E-4 +project _name;URL;Einstufung;bautyp;length;Planungsdauer_jahre;Baudauer_jahre;Betriebsdauer_jahre;addtl_pkwkm_orig;addtl_pkwkm_induz;b_fzkm_orig;co2_equivalents_emissions_orig;b_co2_equivalents_orig;b_overall_orig;investmentCost_orig;DTV_Planfall;addtl_lane_km;b_orig_per_km;NKV_orig;NKV_co2;BCR_co2_700;NKV_carbon700;BCR_co2_2000;NKV_el03;NKV_el03_carbon215_invcostTud;NKV_el03_carbon700tpr0_invcostTud;NKV_el03_carbon700tpr0;addtl_pkwkm_el03;cost_co2_orig;cost_co2_el03;investmentCost_tud;addtl_pkwkm_from_ttime;NKV_elTtime_carbon215_invcostTud;NKV_elTtime_carbon700tpr0_invcostTud;NKV_elTtime_carbon2000_invcostTud;remark_0;remark_1;remark_2;remark_3;remark_4 +A20-G10-NI-SH;;VB;NB4;161.0;10.0;4.0;42.0;131.53;143.95;-785.233;90786.067;-326.34;5305.683;2737.176;19000.0;644.0;32.954552795031056;1.9383784601355558;3.197887096076323;3.197887096076323;3.197887096076323;1.0932250067607725;1.8621980025426863;0.040104418189946894;0.06342253518464086;2.860591552803066;711.62;198.59881207206251;407.11813226428285;123456.789;648.0;0.039835779909582765;0.06254707439279432;0.03381259427444669 diff --git a/src/test/resources/testData/referenceData/a20.json b/src/test/resources/testData/referenceData/a20.json index ba00dbc..e2213e0 100644 --- a/src/test/resources/testData/referenceData/a20.json +++ b/src/test/resources/testData/referenceData/a20.json @@ -4,40 +4,42 @@ "projectNumber": "A20-G10-NI-SH", "street": "A 20", "priority": "VB", - "bautyp": "4-streifiger Neubau" + "bautyp": "NB4", + "length": 161.0, + "verkehrsbelastung2030": 19000.0 }, "physicalEffect": { "emissionsDataContainer": { "emissions": { + "CO": { + "pkw": 1353.13, + "lkw": -47.28, + "kfz": 1305.85 + }, "CO2": { "pkw": 54773.28, "lkw": -6083.34, "kfz": 48689.94 }, + "SO2": { + "pkw": 0.66, + "lkw": -0.03, + "kfz": 0.63 + }, "PM": { "pkw": 3.0, "lkw": -0.13, "kfz": 2.86 }, - "CO": { - "pkw": 1353.13, - "lkw": -47.28, - "kfz": 1305.85 - }, - "HC": { - "pkw": 12.54, - "lkw": -1.46, - "kfz": 11.08 - }, "NOX": { "pkw": 103.65, "lkw": -36.81, "kfz": 66.85 }, - "SO2": { - "pkw": 0.66, - "lkw": -0.03, - "kfz": 0.63 + "HC": { + "pkw": 12.54, + "lkw": -1.46, + "kfz": 11.08 } }, "co2Overall": 90786.067 @@ -51,6 +53,11 @@ "overall": 131.53, "induced": 143.95, "shifted": 9.75 + }, + "vehicleHours": { + "overall": -12.96, + "induced": 1.46, + "shifted": 0.13 } }, "costBenefitAnalysis": { @@ -99,29 +106,29 @@ "overall": -398.107 }, "na": { + "CO": { + "annual": -0.081, + "overall": -2.007 + }, "CO2": { "annual": -7.06, "overall": -175.021 }, + "SO2": { + "annual": -0.008, + "overall": -0.205 + }, "PM": { "annual": -0.306, "overall": -7.581 }, - "CO": { - "annual": -0.081, - "overall": -2.007 - }, - "HC": { - "annual": -0.019, - "overall": -0.467 - }, "NOX": { "annual": -1.029, "overall": -25.52 }, - "SO2": { - "annual": -0.008, - "overall": -0.205 + "HC": { + "annual": -0.019, + "overall": -0.467 } }, "nt": { @@ -139,6 +146,11 @@ "cost": { "cost": 3145.75, "overallCosts": 2737.176 + }, + "durations": { + "planning": 10.0, + "construction": 4.0, + "operation": 42.0 } } } \ No newline at end of file