Skip to content

Commit 7734704

Browse files
authored
fix: external inlinks for LTZ policy (#295)
1 parent 350331e commit 7734704

File tree

3 files changed

+37
-3
lines changed

3 files changed

+37
-3
lines changed

ile_de_france/src/main/java/org/eqasim/ile_de_france/policies/city_tax/CityTaxPolicyFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ private Policy createPolicy(CityTaxConfigGroup enterConfig, PolicyPersonFilter p
5656
IdSet<Link> linkIds = PolicyLinkFinder
5757
.create(new File(
5858
ConfigGroup.getInputFileURL(config.getContext(), enterConfig.perimetersPath).getPath()))
59-
.findLinks(network, Predicate.Entering);
59+
.findLinks(network, Predicate.Entering, false);
6060

6161
logger.info(" Affected entering links: " + linkIds.size());
6262

ile_de_france/src/main/java/org/eqasim/ile_de_france/policies/limited_traffic_zone/LimitedTrafficZonePolicyFactory.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@ private Policy createPolicy(LimitedTrafficZoneConfigGroup ltzConfig, PolicyPerso
6767
linkIds = PolicyLinkFinder
6868
.create(new File(
6969
ConfigGroup.getInputFileURL(config.getContext(), ltzConfig.perimetersPath).getPath()))
70-
.findLinks(network, Predicate.Inside);
70+
.findLinks(network, Predicate.Inside, true);
7171

7272
logger.info(" Affected inside links: " + linkIds.size());
7373
} else if (!ltzConfig.linkListPath.isEmpty()) {

ile_de_france/src/main/java/org/eqasim/ile_de_france/policies/routing/PolicyLinkFinder.java

Lines changed: 35 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,11 @@
1414
import org.locationtech.jts.geom.GeometryFactory;
1515
import org.locationtech.jts.geom.Point;
1616
import org.matsim.api.core.v01.Coord;
17+
import org.matsim.api.core.v01.Id;
1718
import org.matsim.api.core.v01.IdSet;
1819
import org.matsim.api.core.v01.network.Link;
1920
import org.matsim.api.core.v01.network.Network;
21+
import org.matsim.api.core.v01.network.Node;
2022

2123
public class PolicyLinkFinder {
2224
private final static GeometryFactory geometryFactory = new GeometryFactory();
@@ -31,7 +33,7 @@ public enum Predicate {
3133
Entering, Exiting, Crossing, Inside
3234
}
3335

34-
public IdSet<Link> findLinks(Network network, Predicate predicate) {
36+
public IdSet<Link> findLinks(Network network, Predicate predicate, boolean includeConnecting) {
3537
IdSet<Link> linkIds = new IdSet<>(Link.class);
3638

3739
for (Link link : network.getLinks().values()) {
@@ -58,6 +60,38 @@ public IdSet<Link> findLinks(Network network, Predicate predicate) {
5860
}
5961
}
6062

63+
if (includeConnecting) {
64+
boolean continueNextRound = true;
65+
while (continueNextRound) {
66+
continueNextRound = false;
67+
68+
for (Link link : network.getLinks().values()) {
69+
if (linkIds.contains(link.getId())) {
70+
continue; // skip tagged links
71+
}
72+
73+
Node toNode = link.getToNode();
74+
75+
boolean allConnectionsTagged = true;
76+
for (Id<Link> outlinkId : toNode.getOutLinks().keySet()) {
77+
if (outlinkId.equals(link.getId())) {
78+
continue; // skip self loops
79+
}
80+
81+
if (!linkIds.contains(outlinkId)) {
82+
allConnectionsTagged = false;
83+
break;
84+
}
85+
}
86+
87+
if (allConnectionsTagged) {
88+
continueNextRound = true;
89+
linkIds.add(link.getId());
90+
}
91+
}
92+
}
93+
}
94+
6195
return linkIds;
6296
}
6397

0 commit comments

Comments
 (0)