Skip to content

Commit c2bc9a4

Browse files
authored
feat: Control car departure access (#154)
* Only allow access to/from car on viable links * Update tag
1 parent 71b8e47 commit c2bc9a4

File tree

2 files changed

+56
-6
lines changed

2 files changed

+56
-6
lines changed

core/src/main/java/org/eqasim/core/scenario/preparation/FacilityPlacement.java

Lines changed: 53 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,24 +3,28 @@
33
import java.util.Iterator;
44
import java.util.LinkedList;
55
import java.util.List;
6+
import java.util.stream.Collectors;
67

78
import org.eqasim.core.misc.ParallelProgress;
89
import org.eqasim.core.scenario.cutter.network.RoadNetwork;
910
import org.matsim.api.core.v01.network.Link;
10-
import org.matsim.core.network.NetworkUtils;
11+
import org.matsim.core.utils.collections.QuadTree;
12+
import org.matsim.core.utils.collections.QuadTrees;
1113
import org.matsim.facilities.ActivityFacilities;
1214
import org.matsim.facilities.ActivityFacility;
1315
import org.matsim.facilities.ActivityFacilityImpl;
1416

1517
public class FacilityPlacement {
1618
private final int numberOfThreads;
1719
private final int batchSize;
18-
private final RoadNetwork network;
20+
private final QuadTree<Link> spatialIndex;
1921

20-
public FacilityPlacement(int numberOfThreads, int batchSize, RoadNetwork network) {
21-
this.network = network;
22+
public FacilityPlacement(int numberOfThreads, int batchSize, RoadNetwork network, FacilityPlacementVoter voter) {
2223
this.numberOfThreads = numberOfThreads;
2324
this.batchSize = batchSize;
25+
26+
this.spatialIndex = QuadTrees.createQuadTree(
27+
network.getLinks().values().stream().filter(voter::canPlaceFacility).collect(Collectors.toList()));
2428
}
2529

2630
public void run(ActivityFacilities facilities) throws InterruptedException {
@@ -69,12 +73,56 @@ public void run() {
6973
}
7074

7175
for (ActivityFacility facility : localTasks) {
72-
Link link = NetworkUtils.getNearestLink(network, facility.getCoord());
76+
Link link = spatialIndex.getClosest(facility.getCoord().getX(), facility.getCoord().getY());
7377
((ActivityFacilityImpl) facility).setLinkId(link.getId());
7478
}
7579

7680
progress.update(localTasks.size());
7781
} while (localTasks.size() > 0);
7882
}
7983
}
84+
85+
static public interface FacilityPlacementVoter {
86+
boolean canPlaceFacility(Link link);
87+
}
88+
89+
static public class OSMFacilityPlacementVoter implements FacilityPlacementVoter {
90+
private final static String HIGHWAY_TAG = "osm:way:highway";
91+
92+
public OSMFacilityPlacementVoter(RoadNetwork network) {
93+
boolean foundAttribute = false;
94+
95+
for (Link link : network.getLinks().values()) {
96+
if (link.getAttributes().getAttribute(HIGHWAY_TAG) != null) {
97+
foundAttribute = true;
98+
break;
99+
}
100+
}
101+
102+
if (!foundAttribute) {
103+
throw new IllegalStateException("Did not find osm:highway attribute in network");
104+
}
105+
}
106+
107+
@Override
108+
public boolean canPlaceFacility(Link link) {
109+
String highway = (String) link.getAttributes().getAttribute(HIGHWAY_TAG);
110+
111+
if (highway != null) {
112+
if (highway.contains("motorway")) {
113+
return false;
114+
}
115+
116+
if (highway.contains("trunk")) {
117+
return false;
118+
}
119+
120+
if (highway.contains("_link")) {
121+
return false;
122+
}
123+
}
124+
125+
return true;
126+
}
127+
}
80128
}

core/src/main/java/org/eqasim/core/scenario/preparation/RunPreparation.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package org.eqasim.core.scenario.preparation;
22

33
import org.eqasim.core.scenario.cutter.network.RoadNetwork;
4+
import org.eqasim.core.scenario.preparation.FacilityPlacement.OSMFacilityPlacementVoter;
45
import org.matsim.api.core.v01.Scenario;
56
import org.matsim.core.config.CommandLine;
67
import org.matsim.core.config.CommandLine.ConfigurationException;
@@ -33,7 +34,8 @@ static public void main(String[] args) throws ConfigurationException, Interrupte
3334
int batchSize = cmd.getOption("batch-size").map(Integer::parseInt).orElse(10);
3435

3536
RoadNetwork roadNetwork = new RoadNetwork(scenario.getNetwork());
36-
FacilityPlacement facilityPlacement = new FacilityPlacement(numberOfThreads, batchSize, roadNetwork);
37+
OSMFacilityPlacementVoter voter = new OSMFacilityPlacementVoter(roadNetwork);
38+
FacilityPlacement facilityPlacement = new FacilityPlacement(numberOfThreads, batchSize, roadNetwork, voter);
3739
facilityPlacement.run(scenario.getActivityFacilities());
3840

3941
// Fix freight activities (TODO: should go to the pipeline)

0 commit comments

Comments
 (0)