From 37b38a68f54a0bcd905be15ca1f9a4c59bad74ac Mon Sep 17 00:00:00 2001 From: Jakob Rehmann Date: Mon, 25 Nov 2024 10:19:11 +0100 Subject: [PATCH] added autofrei scenario for datascience course --- .../matsim/run/OpenBerlinCarfreeScenario.java | 73 +++++++++++++++++++ .../org/matsim/run/RunOpenBerlinScenario.java | 2 +- 2 files changed, 74 insertions(+), 1 deletion(-) create mode 100644 src/main/java/org/matsim/run/OpenBerlinCarfreeScenario.java diff --git a/src/main/java/org/matsim/run/OpenBerlinCarfreeScenario.java b/src/main/java/org/matsim/run/OpenBerlinCarfreeScenario.java new file mode 100644 index 000000000..bf44a5b90 --- /dev/null +++ b/src/main/java/org/matsim/run/OpenBerlinCarfreeScenario.java @@ -0,0 +1,73 @@ +package org.matsim.run; + +import org.geotools.api.feature.simple.SimpleFeature; + +import org.geotools.feature.simple.SimpleFeatureImpl; +import org.locationtech.jts.geom.Geometry; +import org.matsim.api.core.v01.Scenario; +import org.matsim.api.core.v01.TransportMode; +import org.matsim.api.core.v01.network.Link; +import org.matsim.api.core.v01.population.Leg; +import org.matsim.api.core.v01.population.Person; +import org.matsim.api.core.v01.population.Plan; +import org.matsim.application.MATSimApplication; +import org.matsim.core.network.algorithms.MultimodalNetworkCleaner; +import org.matsim.core.router.TripStructureUtils; +import org.matsim.core.utils.geometry.geotools.MGC; +import org.matsim.core.utils.gis.ShapeFileReader; +import picocli.CommandLine; + +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.Set; + +//run --1pct --config:controller.lastIteration 1 --config:controller.overwriteFiles deleteDirectoryIfExists +public class OpenBerlinCarfreeScenario extends OpenBerlinScenario { + + @CommandLine.Option(names = "--ban-area", + defaultValue = "input/v6.3/hundekopf-shp/hundekopf-carBanArea-25832.shp", + description = "Path to (single geom) shape file depicting the area where private cars are banned from. If you adjust, think about adjusting the drt area+stops file, as well!") + private static String SHAPE_FILE; + public OpenBerlinCarfreeScenario() { + super(); + } + + public static void main(String[] args) { + MATSimApplication.run(OpenBerlinCarfreeScenario.class, args); + } + @Override + protected void prepareScenario(Scenario scenario) { + super.prepareScenario(scenario); + ShapeFileReader shpReader = new ShapeFileReader(); + Collection features = shpReader.readFileAndInitialize(SHAPE_FILE); + Geometry consideredArea = (Geometry) ((SimpleFeatureImpl) ((ArrayList) features).get(0)).getDefaultGeometry(); + + // disallow car mode within ring (all links for which the from and to nodes are within the shape file). + for (Link link : scenario.getNetwork().getLinks().values()) { + if (!link.getAllowedModes().contains("pt") && MGC.coord2Point(link.getFromNode().getCoord()).within(consideredArea) && + MGC.coord2Point(link.getToNode().getCoord()).within(consideredArea)) { + HashSet allowedModes = new HashSet<>(link.getAllowedModes()); + allowedModes.remove(TransportMode.car); + link.setAllowedModes(allowedModes); + link.getAttributes().putAttribute("ring", true); + }else { + link.getAttributes().putAttribute("ring", false); + } + } + + for (Person person : scenario.getPopulation().getPersons().values()) { + for (Plan plan : person.getPlans()) { + for (Leg leg : TripStructureUtils.getLegs(plan)) { + if (leg.getMode().equals(TransportMode.car)) { + leg.setRoute(null); + } + } + } + } + + new MultimodalNetworkCleaner(scenario.getNetwork()).run(Set.of(TransportMode.car)); + + } + +} diff --git a/src/main/java/org/matsim/run/RunOpenBerlinScenario.java b/src/main/java/org/matsim/run/RunOpenBerlinScenario.java index adcbc3ab6..378fa9a3d 100644 --- a/src/main/java/org/matsim/run/RunOpenBerlinScenario.java +++ b/src/main/java/org/matsim/run/RunOpenBerlinScenario.java @@ -12,7 +12,7 @@ private RunOpenBerlinScenario() { } public static void main(String[] args) { - MATSimApplication.runWithDefaults(OpenBerlinScenario.class, args); + MATSimApplication.run(OpenBerlinCarfreeScenario.class, args); } }