Skip to content

Commit 9e76449

Browse files
authored
feat: script to export link traversals (#238)
1 parent 80fa272 commit 9e76449

1 file changed

Lines changed: 162 additions & 0 deletions

File tree

Lines changed: 162 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,162 @@
1+
package org.eqasim.core.tools;
2+
3+
import java.io.BufferedWriter;
4+
import java.io.File;
5+
import java.io.IOException;
6+
import java.net.MalformedURLException;
7+
import java.util.Arrays;
8+
import java.util.Optional;
9+
10+
import org.eqasim.core.scenario.cutter.extent.ScenarioExtent;
11+
import org.eqasim.core.scenario.cutter.extent.ShapeScenarioExtent;
12+
import org.matsim.api.core.v01.Coord;
13+
import org.matsim.api.core.v01.Id;
14+
import org.matsim.api.core.v01.IdMap;
15+
import org.matsim.api.core.v01.events.LinkEnterEvent;
16+
import org.matsim.api.core.v01.events.LinkLeaveEvent;
17+
import org.matsim.api.core.v01.events.VehicleEntersTrafficEvent;
18+
import org.matsim.api.core.v01.events.VehicleLeavesTrafficEvent;
19+
import org.matsim.api.core.v01.events.handler.LinkEnterEventHandler;
20+
import org.matsim.api.core.v01.events.handler.LinkLeaveEventHandler;
21+
import org.matsim.api.core.v01.events.handler.VehicleEntersTrafficEventHandler;
22+
import org.matsim.api.core.v01.events.handler.VehicleLeavesTrafficEventHandler;
23+
import org.matsim.api.core.v01.network.Link;
24+
import org.matsim.api.core.v01.network.Network;
25+
import org.matsim.api.core.v01.population.Person;
26+
import org.matsim.core.api.experimental.events.EventsManager;
27+
import org.matsim.core.config.CommandLine;
28+
import org.matsim.core.config.CommandLine.ConfigurationException;
29+
import org.matsim.core.events.EventsUtils;
30+
import org.matsim.core.events.MatsimEventsReader;
31+
import org.matsim.core.network.NetworkUtils;
32+
import org.matsim.core.network.io.MatsimNetworkReader;
33+
import org.matsim.core.utils.io.IOUtils;
34+
import org.matsim.vehicles.Vehicle;
35+
36+
import com.google.common.base.Verify;
37+
38+
public class ExportLinkTraversals {
39+
static public void main(String[] args) throws ConfigurationException, MalformedURLException, IOException {
40+
CommandLine cmd = new CommandLine.Builder(args) //
41+
.requireOptions("events-path", "output-path") //
42+
.allowOptions("network-path", "extent-path") //
43+
.build();
44+
45+
ScenarioExtent extent = null;
46+
Network network = null;
47+
48+
if (cmd.hasOption("extent-path")) {
49+
Verify.verify(cmd.hasOption("network-path"), "Network path must be given");
50+
51+
network = NetworkUtils.createNetwork();
52+
new MatsimNetworkReader(network).readFile(cmd.getOptionStrict("network-path"));
53+
54+
extent = new ShapeScenarioExtent.Builder(new File(cmd.getOptionStrict("extent-path")), Optional.empty(),
55+
Optional.empty()).build();
56+
}
57+
58+
BufferedWriter writer = IOUtils.getBufferedWriter(cmd.getOptionStrict("output-path"));
59+
60+
EventsManager eventsManager = EventsUtils.createEventsManager();
61+
eventsManager.addHandler(new TraversalExporter(writer, extent, network));
62+
new MatsimEventsReader(eventsManager).readFile(cmd.getOptionStrict("events-path"));
63+
64+
writer.close();
65+
}
66+
67+
private static class TraversalExporter implements VehicleEntersTrafficEventHandler,
68+
VehicleLeavesTrafficEventHandler, LinkEnterEventHandler, LinkLeaveEventHandler {
69+
private final BufferedWriter writer;
70+
private final ScenarioExtent extent;
71+
private final Network network;
72+
73+
private final IdMap<Vehicle, Id<Person>> drivers = new IdMap<>(Vehicle.class);
74+
private final IdMap<Person, LinkEnterEvent> enterEvents = new IdMap<>(Person.class);
75+
76+
TraversalExporter(BufferedWriter writer, ScenarioExtent extent, Network network) {
77+
this.writer = writer;
78+
this.extent = extent;
79+
this.network = network;
80+
81+
try {
82+
writer.write(String.join(";", Arrays.asList( //
83+
"person_id", "vehicle_id", "link_id", "enter_time", "leave_time")) + "\n");
84+
} catch (IOException e) {
85+
throw new RuntimeException(e);
86+
}
87+
}
88+
89+
@Override
90+
public void handleEvent(VehicleEntersTrafficEvent event) {
91+
if (event.getNetworkMode().equals("car")) {
92+
drivers.put(event.getVehicleId(), event.getPersonId());
93+
}
94+
}
95+
96+
@Override
97+
public void handleEvent(VehicleLeavesTrafficEvent event) {
98+
if (drivers.remove(event.getVehicleId()) != null) {
99+
writeTraversal(event.getPersonId(), enterEvents.remove(event.getPersonId()), null);
100+
}
101+
}
102+
103+
@Override
104+
public void handleEvent(LinkEnterEvent event) {
105+
Id<Person> personId = drivers.get(event.getVehicleId());
106+
107+
if (personId != null) {
108+
enterEvents.put(personId, event);
109+
}
110+
}
111+
112+
@Override
113+
public void handleEvent(LinkLeaveEvent event) {
114+
Id<Person> personId = drivers.get(event.getVehicleId());
115+
116+
if (personId != null) {
117+
// enter event can be null (first leave event on trip)
118+
writeTraversal(personId, enterEvents.remove(personId), event);
119+
}
120+
}
121+
122+
private void writeTraversal(Id<Person> personId, LinkEnterEvent enterEvent, LinkLeaveEvent leaveEvent) {
123+
final Id<Vehicle> vehicleId;
124+
final Id<Link> linkId;
125+
126+
if (enterEvent != null) {
127+
vehicleId = enterEvent.getVehicleId();
128+
linkId = enterEvent.getLinkId();
129+
} else if (leaveEvent != null) {
130+
vehicleId = leaveEvent.getVehicleId();
131+
linkId = leaveEvent.getLinkId();
132+
} else {
133+
return; // no actual driving happened
134+
}
135+
136+
final double enterTime = enterEvent != null ? enterEvent.getTime() : Double.NaN;
137+
final double leaveTime = leaveEvent != null ? leaveEvent.getTime() : Double.NaN;
138+
139+
if (extent != null) {
140+
Link link = network.getLinks().get(linkId);
141+
Coord fromCoord = link.getFromNode().getCoord();
142+
Coord toCoord = link.getToNode().getCoord();
143+
144+
if (!extent.isInside(fromCoord) && !extent.isInside(toCoord)) {
145+
return; // ignore this one as it doesn't touch the requested extent
146+
}
147+
}
148+
149+
try {
150+
writer.write(String.join(";", new String[] { //
151+
personId.toString(), //
152+
vehicleId.toString(), //
153+
linkId.toString(), //
154+
String.valueOf(enterTime), //
155+
String.valueOf(leaveTime) //
156+
}) + "\n");
157+
} catch (IOException e) {
158+
throw new RuntimeException(e);
159+
}
160+
}
161+
}
162+
}

0 commit comments

Comments
 (0)