MATSIM
LanesUtils.java
Go to the documentation of this file.
1 /* *********************************************************************** *
2  * project: org.matsim.*
3  * LanesUtils
4  * *
5  * *********************************************************************** *
6  * *
7  * copyright : (C) 2012 by the members listed in the COPYING, *
8  * LICENSE and WARRANTY file. *
9  * email : info at matsim dot org *
10  * *
11  * *********************************************************************** *
12  * *
13  * This program is free software; you can redistribute it and/or modify *
14  * it under the terms of the GNU General Public License as published by *
15  * the Free Software Foundation; either version 2 of the License, or *
16  * (at your option) any later version. *
17  * See also COPYING, LICENSE and WARRANTY file *
18  * *
19  * *********************************************************************** */
20 package org.matsim.lanes;
21 
22 import org.matsim.api.core.v01.Id;
23 import org.matsim.api.core.v01.Scenario;
26 import org.matsim.core.config.Config;
29 
30 import java.util.*;
31 
37 public final class LanesUtils {
38 
39  public static Lanes createLanesContainer(){
40  return new LanesImpl();
41  }
42 
62  public static void createAndAddLane(LanesToLinkAssignment l2l,
63  LanesFactory factory, Id<Lane> laneId, double capacity,
64  double startsAtMeterFromLinkEnd, int alignment,
65  int numberOfRepresentedLanes, List<Id<Link>> toLinkIds, List<Id<Lane>> toLaneIds) {
66 
67  Lane lane = factory.createLane(laneId);
68  if (toLinkIds != null){
69  for (Id<Link> toLinkId : toLinkIds) {
70  lane.addToLinkId(toLinkId);
71  }
72  }
73  if (toLaneIds != null){
74  for (Id<Lane> toLaneId : toLaneIds) {
75  lane.addToLaneId(toLaneId);
76  }
77  }
78  lane.setCapacityVehiclesPerHour(capacity);
79  lane.setStartsAtMeterFromLinkEnd(startsAtMeterFromLinkEnd);
80  lane.setNumberOfRepresentedLanes(numberOfRepresentedLanes);
81  lane.setAlignment(alignment);
82  l2l.addLane(lane);
83  }
84 
89  public static void createOriginalLanesAndSetLaneCapacities(Network network, Lanes lanes){
90  LanesFactory factory = lanes.getFactory();
91  for (LanesToLinkAssignment l2l : lanes.getLanesToLinkAssignments().values()){
92  Link link = network.getLinks().get(l2l.getLinkId());
93 
94  Lane olLane = factory.createLane(Id.create(l2l.getLinkId().toString() + ".ol", Lane.class));
95  l2l.addLane(olLane);
96  for (Lane lane : l2l.getLanes().values()) {
97  olLane.addToLaneId(lane.getId());
98 
99  //set capacity of the lane depending on link capacity and number of representative lanes
100  LanesUtils.calculateAndSetCapacity(lane, true, link, network);
101  }
103  olLane.setStartsAtMeterFromLinkEnd(link.getLength());
104  }
105  }
106 
113  public static List<ModelLane> createLanes(Link link, LanesToLinkAssignment lanesToLinkAssignment) {
114  List<ModelLane> queueLanes = new ArrayList<>();
115  List<Lane> sortedLanes = new ArrayList<>(lanesToLinkAssignment.getLanes().values());
116 
117  // orders lanes by start on link an whether they are outgoing or not o the start is the same
118  sortedLanes.sort(Comparator.comparingDouble(Lane::getStartsAtMeterFromLinkEnd).thenComparing(
119  (l1, l2) -> {
120  boolean l1Outgoing = l1.getToLinkIds() != null && !l1.getToLinkIds().isEmpty();
121  boolean l2Outgoing = l2.getToLinkIds() != null && !l2.getToLinkIds().isEmpty();
122  if (l1Outgoing && !l2Outgoing)
123  return -1;
124  else if(l2Outgoing && !l1Outgoing)
125  return 1;
126  else
127  return 0;
128  }
129  ));
130  Collections.reverse(sortedLanes);
131 
132  List<ModelLane> laneList = new LinkedList<>();
133  Lane firstLane = sortedLanes.remove(0);
134  if (firstLane.getStartsAtMeterFromLinkEnd() != link.getLength()) {
135  throw new IllegalStateException("First Lane Id " + firstLane.getId() + " on Link Id " + link.getId() +
136  "isn't starting at the beginning of the link!");
137  }
138  ModelLane firstQLane = new ModelLane(firstLane);
139  laneList.add(firstQLane);
140  Stack<ModelLane> laneStack = new Stack<>();
141 
142  while (!laneList.isEmpty()){
143  ModelLane lastQLane = laneList.remove(0);
144  laneStack.push(lastQLane);
145  queueLanes.add(lastQLane);
146 
147  //if existing create the subsequent lanes
148  List<Id<Lane>> toLaneIds = lastQLane.getLaneData().getToLaneIds();
149  double nextMetersFromLinkEnd = 0.0;
150  double laneLength = 0.0;
151  if (toLaneIds != null && (!toLaneIds.isEmpty())) {
152  for (Id<Lane> toLaneId : toLaneIds){
153  Lane currentLane = lanesToLinkAssignment.getLanes().get(toLaneId);
154  nextMetersFromLinkEnd = currentLane.getStartsAtMeterFromLinkEnd();
155  ModelLane currentQLane = new ModelLane(currentLane);
156  laneList.add(currentQLane);
157  lastQLane.addAToLane(currentQLane);
158  }
159  laneLength = lastQLane.getLaneData().getStartsAtMeterFromLinkEnd() - nextMetersFromLinkEnd;
160  lastQLane.setEndsAtMetersFromLinkEnd(nextMetersFromLinkEnd);
161  }
162  //there are no subsequent lanes
163  else {
164  laneLength = lastQLane.getLaneData().getStartsAtMeterFromLinkEnd();
165  lastQLane.setEndsAtMetersFromLinkEnd(0.0);
166  }
167  lastQLane.setLength(laneLength);
168  }
169 
170  //fill toLinks
171  while (! laneStack.isEmpty()){
172  ModelLane qLane = laneStack.pop();
173  if (qLane.getToLanes() == null || (qLane.getToLanes().isEmpty())) {
174  for (Id<Link> toLinkId : qLane.getLaneData().getToLinkIds()){
175  qLane.addDestinationLink(toLinkId);
176  }
177  }
178  else {
179  for (ModelLane subsequentLane : qLane.getToLanes()){
180  for (Id<Link> toLinkId : subsequentLane.getDestinationLinkIds()){
181  qLane.addDestinationLink(toLinkId);
182  }
183  }
184  }
185  }
186 
187  Collections.sort(queueLanes, new Comparator<ModelLane>() {
188  @Override
189  public int compare(ModelLane o1, ModelLane o2) {
190  if (o1.getEndsAtMeterFromLinkEnd() < o2.getEndsAtMeterFromLinkEnd()) {
191  return -1;
192  } else if (o1.getEndsAtMeterFromLinkEnd() > o2.getEndsAtMeterFromLinkEnd()) {
193  return 1;
194  } else {
195  return 0;
196  }
197  }
198  });
199  return queueLanes;
200  }
201 
210  public static void calculateAndSetCapacity(Lane lane, boolean isLaneAtLinkEnd, Link link, Network network){
211  if (isLaneAtLinkEnd){
212  double noLanesLink = link.getNumberOfLanes();
213  double linkFlowCapPerSecondPerLane = link.getCapacity() / network.getCapacityPeriod()
214  / noLanesLink;
215  double laneFlowCapPerHour = lane.getNumberOfRepresentedLanes()
216  * linkFlowCapPerSecondPerLane * 3600.0;
217  lane.setCapacityVehiclesPerHour(laneFlowCapPerHour);
218  }
219  else {
220  double capacity = link.getCapacity() / network.getCapacityPeriod() * 3600.0;
221  lane.setCapacityVehiclesPerHour(capacity);
222  }
223  }
224 
225  public static void calculateMissingCapacitiesForLanes20(String networkInputFilename, String lanes20InputFilename, String lanes20OutputFilename){
226  Config config = ConfigUtils.createConfig();
227  config.network().setInputFile(networkInputFilename);
228  config.qsim().setUseLanes(true);
229  config.network().setLaneDefinitionsFile(lanes20InputFilename);
230  Scenario scenario = ScenarioUtils.loadScenario(config);
231  Network network = scenario.getNetwork();
232  Lanes lanes = scenario.getLanes();
233  for (LanesToLinkAssignment l2l : lanes.getLanesToLinkAssignments().values()){
234  Link link = network.getLinks().get(l2l.getLinkId());
235  for (Lane lane : l2l.getLanes().values()){
236  if (lane.getToLaneIds() == null || lane.getToLaneIds().isEmpty()){
237  calculateAndSetCapacity(lane, true, link, network);
238  }
239  else {
240  calculateAndSetCapacity(lane, false, link, network);
241  }
242  }
243  }
244  LanesWriter writerDelegate = new LanesWriter(lanes);
245  writerDelegate.write(lanes20OutputFilename);
246  }
247 
249  for (LanesToLinkAssignment linkLanes : lanes.getLanesToLinkAssignments().values()) {
250  double linkCap = net.getLinks().get(linkLanes.getLinkId()).getCapacity();
251  for (Lane lane : linkLanes.getLanes().values()) {
252  lane.setCapacityVehiclesPerHour(linkCap);
253  }
254  }
255  }
256 }
static void createOriginalLanesAndSetLaneCapacities(Network network, Lanes lanes)
Definition: LanesUtils.java:89
static List< ModelLane > createLanes(Link link, LanesToLinkAssignment lanesToLinkAssignment)
void setCapacityVehiclesPerHour(double capacity)
SortedMap< Id< Link >, LanesToLinkAssignment > getLanesToLinkAssignments()
static void overwriteLaneCapacitiesByNetworkCapacities(Network net, Lanes lanes)
final NetworkConfigGroup network()
Definition: Config.java:411
double getNumberOfRepresentedLanes()
LanesFactory getFactory()
void setLaneDefinitionsFile(final String laneDefinitions)
void setNumberOfRepresentedLanes(double number)
Lane createLane(Id< Lane > laneId)
static void createAndAddLane(LanesToLinkAssignment l2l, LanesFactory factory, Id< Lane > laneId, double capacity, double startsAtMeterFromLinkEnd, int alignment, int numberOfRepresentedLanes, List< Id< Link >> toLinkIds, List< Id< Lane >> toLaneIds)
Definition: LanesUtils.java:62
static Lanes createLanesContainer()
Definition: LanesUtils.java:39
static< T > Id< T > create(final long key, final Class< T > type)
Definition: Id.java:68
double getStartsAtMeterFromLinkEnd()
List< Id< Link > > getToLinkIds()
List< ModelLane > getToLanes()
Definition: ModelLane.java:54
QSimConfigGroup qsim()
Definition: Config.java:447
Map< Id< Link >, ? extends Link > getLinks()
void setAlignment(int alignment)
static void calculateMissingCapacitiesForLanes20(String networkInputFilename, String lanes20InputFilename, String lanes20OutputFilename)
void setStartsAtMeterFromLinkEnd(double meter)
List< Id< Lane > > getToLaneIds()
static Scenario loadScenario(final Config config)
static void calculateAndSetCapacity(Lane lane, boolean isLaneAtLinkEnd, Link link, Network network)
void addToLaneId(Id< Lane > id)
void write(String filename)
void addToLinkId(Id< Link > id)
static Config createConfig(final String context)