private VisLane createVisLane(ModelLane qlane, double linkLength, double linkScale, double linkLengthCorrectionFactor) { String id = qlane.getLaneData().getId().toString(); double startPosition = (linkLength - qlane.getLaneData().getStartsAtMeterFromLinkEnd()) * linkScale * linkLengthCorrectionFactor; double endPosition = startPosition + (qlane.getLength() * linkScale * linkLengthCorrectionFactor); // log.error("lane " + qlane.getId() + " starts at: " + startPosition + " and ends at : " +endPosition); int alignment = qlane.getLaneData().getAlignment(); VisLane lane = new VisLane(id); lane.setStartPosition(startPosition); lane.setEndPosition(endPosition); lane.setAlignment(alignment); lane.setNumberOfLanes(qlane.getLaneData().getNumberOfRepresentedLanes()); return lane; }
private Map<Id<Link>, List<TurnInfo>> createTurnInfos(Lanes laneDefs) { Map<Id<Link>, List<TurnInfo>> inLinkIdTurnInfoMap = new HashMap<>(); Set<Id<Link>> toLinkIds = new HashSet<>(); for (LanesToLinkAssignment l2l : laneDefs.getLanesToLinkAssignments().values()) { toLinkIds.clear(); for (Lane lane : l2l.getLanes().values()) { if (lane.getToLinkIds() != null && (lane.getToLaneIds() == null || lane.getToLaneIds().isEmpty())) { // make sure that it is a lane at the end of a link toLinkIds.addAll(lane.getToLinkIds()); } } if (!toLinkIds.isEmpty()) { List<TurnInfo> turnInfoList = new ArrayList<TurnInfo>(); for (Id<Link> toLinkId : toLinkIds) { turnInfoList.add(new TurnInfo(l2l.getLinkId(), toLinkId)); } inLinkIdTurnInfoMap.put(l2l.getLinkId(), turnInfoList); } } return inLinkIdTurnInfoMap; }
if (toLinkIds != null){ for (Id<Link> toLinkId : toLinkIds) { lane.addToLinkId(toLinkId); lane.addToLaneId(toLaneId); lane.setCapacityVehiclesPerHour(capacity); lane.setStartsAtMeterFromLinkEnd(startsAtMeterFromLinkEnd); lane.setNumberOfRepresentedLanes(numberOfRepresentedLanes); lane.setAlignment(alignment); l2l.addLane(lane);
xmllane.setId(bl.getId().toString()); if ((bl.getToLinkIds() == null && bl.getToLaneIds() != null) || (bl.getToLinkIds() != null && bl.getToLaneIds() == null)){ xmllane.setLeadsTo(fac.createXMLLaneTypeXMLLeadsTo()); "be set for Lane Id " + bl.getId() + " on link Id " + ltla.getLinkId() + "! Cannot write according to XML grammar."); if (bl.getToLinkIds() != null){ for (Id<Link> id : bl.getToLinkIds()) { XMLIdRefType xmlToLink = fac.createXMLIdRefType(); xmlToLink.setRefId(id.toString()); else if (bl.getToLaneIds() != null){ for (Id<Lane> id : bl.getToLaneIds()) { XMLIdRefType xmlToLink = fac.createXMLIdRefType(); xmlToLink.setRefId(id.toString()); capacity.setVehiclesPerHour(bl.getCapacityVehiclesPerHour()); xmllane.setCapacity(capacity); lanes.setNumber(bl.getNumberOfRepresentedLanes()); xmllane.setRepresentedLanes(lanes); startsAt.setMeterFromLinkEnd(bl.getStartsAtMeterFromLinkEnd()); xmllane.setStartsAt(startsAt); xmllane.setAlignment(bl.getAlignment());
Map<Id<Lane>, Set<Id<Link>>> laneIdToLinksMap = new HashMap<>(); for (ModelLane lane : lanes) { // lanes is sorted downstream to upstream Id<Lane> laneId = lane.getLaneData().getId(); builder.setLaneId(laneId); builder.setLength(lane.getLength()); builder.setEffectiveNumberOfLanes(lane.getLaneData().getNumberOfRepresentedLanes()); builder.setFlowCapacity_s(lane.getLaneData().getCapacityVehiclesPerHour() / 3600.); QLaneI queue = builder.createLane(this); toLinkIds.addAll(lane.getLaneData().getToLinkIds()); laneIdToLinksMap.put(laneId, toLinkIds); } else { // lane is within the link and has no connection to a node toLinkIdDownstreamQueues); for (ModelLane toLane : lane.getToLanes()) { Set<Id<Link>> toLinks = laneIdToLinksMap.get(toLane.getLaneData().getId()); if (toLinks == null){ toLinkIdDownstreamQueues.put(toLinkId, downstreamQueues); downstreamQueues.add(queueByIdMap.get(toLane.getLaneData().getId()));
Link link = this.network.getLinks().get(l2l.getLinkId()); for (Lane l : l2l.getLanes().values()){ if (link.getLength() < l.getStartsAtMeterFromLinkEnd()) { log.error("Link Id " + link.getId() + " is shorter than an assigned lane with id " + l.getId()); return false; if (lane.getToLaneIds() != null) { for (Id<Lane> toLaneId : lane.getToLaneIds()){ if (! l2l.getLanes().containsKey(toLaneId)){ log.error("Error: toLane not existing:"); log.error(" Lane Id: " + lane.getId() + " on Link Id: " + l2l.getLinkId() + " leads to Lane Id: " + toLaneId + " that is not existing!"); return false; else if (lane.getToLinkIds() != null){ for (Id<Link> toLinkId : lane.getToLinkIds()) { if (! this.network.getLinks().containsKey(toLinkId)){ log.error("No link found in network for toLinkId " + toLinkId + " of laneId " + lane.getId() + " of link id " + l2l.getLinkId()); return false; Link link = this.network.getLinks().get(l2l.getLinkId()); if (! link.getToNode().getOutLinks().containsKey(toLinkId)){ log.error("The given toLink " + toLinkId + " is not reachable from lane " + lane.getId() + " on link " + link.getId()); return false;
/** * Replaces the method that converted a lane from format 11 to format 20. * Use this when you have not defined an original lane of the link and when you have not set lane capacities yet. */ public static void createOriginalLanesAndSetLaneCapacities(Network network, Lanes lanes){ LanesFactory factory = lanes.getFactory(); for (LanesToLinkAssignment l2l : lanes.getLanesToLinkAssignments().values()){ Link link = network.getLinks().get(l2l.getLinkId()); Lane olLane = factory.createLane(Id.create(l2l.getLinkId().toString() + ".ol", Lane.class)); l2l.addLane(olLane); for (Lane lane : l2l.getLanes().values()) { olLane.addToLaneId(lane.getId()); //set capacity of the lane depending on link capacity and number of representative lanes LanesUtils.calculateAndSetCapacity(lane, true, link, network); } olLane.setNumberOfRepresentedLanes(link.getNumberOfLanes()); olLane.setStartsAtMeterFromLinkEnd(link.getLength()); } }
private void createLanes() { Lanes ld = scenario.getLanes(); LanesFactory f = ld.getFactory(); LanesToLinkAssignment l2l = f.createLanesToLinkAssignment(Id.create(12, Link.class)); ld.addLanesToLinkAssignment(l2l); Lane l = f.createLane(Id.create(121, Lane.class)); l.setStartsAtMeterFromLinkEnd(300); l.addToLaneId(Id.create(122, Lane.class)); l2l.addLane(l); l = f.createLane(Id.create(122, Lane.class)); l.setStartsAtMeterFromLinkEnd(150); l.addToLinkId(Id.create(25, Link.class)); l2l.addLane(l); }
VisLane otfLane = lanesLinkData.getLaneData().get(lane.getLaneData().getId().toString()); if (lane.getToLanes() == null || lane.getToLanes().isEmpty()){ for (Id<Link> id : lane.getLaneData().getToLinkIds()){ otfLane.addToLinkId(id.toString()); VisLane otfToLane = lanesLinkData.getLaneData().get(toLane.getLaneData().getId().toString()); otfLane.addToLane(otfToLane);
@Override public int compare(Lane o1, Lane o2) { if (o1.getStartsAtMeterFromLinkEnd() < o2.getStartsAtMeterFromLinkEnd()) { return -1; } else if (o1.getStartsAtMeterFromLinkEnd() > o2.getStartsAtMeterFromLinkEnd()) { return 1; } else { return 0; } } });
public boolean allDownstreamLinksEmpty(SignalData signal){ if (signal.getTurningMoveRestrictions() != null) { return allLinksEmpty(signal.getTurningMoveRestrictions()); } // else: if (signal.getLaneIds() != null && !signal.getLaneIds().isEmpty()) { Set<Id<Link>> toLinks = new HashSet<>(); for (Id<Lane> laneId : signal.getLaneIds()) { Lane lane = lanes.getLanesToLinkAssignments().get(signal.getLinkId()).getLanes().get(laneId); toLinks.addAll(lane.getToLinkIds()); } return allLinksEmpty(toLinks); } // else: // if no turning move restrictions and no lanes with to links are set, turning is allowed to all outgoing links Node systemNode = this.network.getLinks().get(signal.getLinkId()).getToNode(); return allLinksEmpty(systemNode.getOutLinks().keySet()); }
/** * Calculate capacity by formular from Neumann2008DA: * * Flow of a Lane is given by the flow of the link divided by the number of lanes represented by the link. * * A Lane may represent one or more lanes in reality. This is given by the attribute numberOfRepresentedLanes of * the Lane definition. The flow of a lane is scaled by this number. */ public static void calculateAndSetCapacity(Lane lane, boolean isLaneAtLinkEnd, Link link, Network network){ if (isLaneAtLinkEnd){ double noLanesLink = link.getNumberOfLanes(); double linkFlowCapPerSecondPerLane = link.getCapacity() / network.getCapacityPeriod() / noLanesLink; double laneFlowCapPerHour = lane.getNumberOfRepresentedLanes() * linkFlowCapPerSecondPerLane * 3600.0; lane.setCapacityVehiclesPerHour(laneFlowCapPerHour); } else { double capacity = link.getCapacity() / network.getCapacityPeriod() * 3600.0; lane.setCapacityVehiclesPerHour(capacity); } }
LaemmerSignal(SignalGroup signalGroup) { this.group = signalGroup; // calculate outflow capacity once (in reality one also has to initialize this value and cannot update it every second) for (Signal signal : group.getSignals().values()) { if (signal.getLaneIds() != null && !signal.getLaneIds().isEmpty() && lanes.getLanesToLinkAssignments().get(signal.getLinkId()).getLanes().size() > 1) { for (Id<Lane> laneId : signal.getLaneIds()) { double laneOutflow = lanes.getLanesToLinkAssignments().get(signal.getLinkId()).getLanes() .get(laneId).getCapacityVehiclesPerHour() * config.qsim().getFlowCapFactor() / 3600; laneOutflowCapacitiesPerS.put(laneId, laneOutflow); signalOutflowCapacityPerS += laneOutflow; } } else { double linkOutflowPerS = network.getLinks().get(signal.getLinkId()).getCapacity() * config.qsim().getFlowCapFactor() / 3600; linkOutflowCapacitiesPerS.put(signal.getLinkId(), linkOutflowPerS); signalOutflowCapacityPerS += linkOutflowPerS; } } }
@Override public void addLane(Lane lane) { this.lanes.put(lane.getId(), lane); }
public static void overwriteLaneCapacitiesByNetworkCapacities(Network net, Lanes lanes) { for (LanesToLinkAssignment linkLanes : lanes.getLanesToLinkAssignments().values()) { double linkCap = net.getLinks().get(linkLanes.getLinkId()).getCapacity(); for (Lane lane : linkLanes.getLanes().values()) { lane.setCapacityVehiclesPerHour(linkCap); } } } }
Id<Lane> firstSignalLaneId = (Id<Lane>) signalData.getLaneIds().toArray()[0]; Lane firstSignalLane = lanes.getLanesToLinkAssignments().get(signalLinkId).getLanes().get(firstSignalLaneId); stepNumber = firstSignalLane.getAlignment();
lanes.addAll(l2la.getLanes().values()); Lane lane = lanes.get(0); assertEquals(laneId3, lane.getId()); assertEquals(linkId1, lane.getToLinkIds().get(0)); assertEquals(45.0, lane.getStartsAtMeterFromLinkEnd(), EPSILON); assertEquals(1.0, lane.getNumberOfRepresentedLanes()); assertEquals(0.725, lane.getCapacityVehiclesPerHour(), EPSILON); lane = lanes.get(1); assertEquals(laneId5, lane.getId()); assertEquals(60.0, lane.getStartsAtMeterFromLinkEnd(), EPSILON); assertEquals(2.5, lane.getNumberOfRepresentedLanes()); assertEquals(2, lane.getCapacityVehiclesPerHour(), EPSILON); lanes.addAll(l2la.getLanes().values()); lane = lanes.get(0); assertEquals(laneId1, lane.getId()); assertEquals(linkId1, lane.getToLinkIds().get(0)); assertEquals(45.0, lane.getStartsAtMeterFromLinkEnd(), EPSILON); assertEquals(1900.0, lane.getCapacityVehiclesPerHour(), EPSILON); assertEquals(1.0, lane.getNumberOfRepresentedLanes());
if (firstLane.getStartsAtMeterFromLinkEnd() != link.getLength()) { throw new IllegalStateException("First Lane Id " + firstLane.getId() + " on Link Id " + link.getId() + "isn't starting at the beginning of the link!"); List<Id<Lane>> toLaneIds = lastQLane.getLaneData().getToLaneIds(); double nextMetersFromLinkEnd = 0.0; double laneLength = 0.0; for (Id<Lane> toLaneId : toLaneIds){ Lane currentLane = lanesToLinkAssignment.getLanes().get(toLaneId); nextMetersFromLinkEnd = currentLane.getStartsAtMeterFromLinkEnd(); ModelLane currentQLane = new ModelLane(currentLane); laneList.add(currentQLane); lastQLane.addAToLane(currentQLane); laneLength = lastQLane.getLaneData().getStartsAtMeterFromLinkEnd() - nextMetersFromLinkEnd; lastQLane.setEndsAtMetersFromLinkEnd(nextMetersFromLinkEnd); laneLength = lastQLane.getLaneData().getStartsAtMeterFromLinkEnd(); lastQLane.setEndsAtMetersFromLinkEnd(0.0); ModelLane qLane = laneStack.pop(); if (qLane.getToLanes() == null || (qLane.getToLanes().isEmpty())) { for (Id<Link> toLinkId : qLane.getLaneData().getToLinkIds()){ qLane.addDestinationLink(toLinkId);
private void calculateEarliestTimeInDistance (double enterTime, double dist, Link link, Lane lane){ this.earliestTimeInDistance = enterTime + ((lane.getStartsAtMeterFromLinkEnd() - dist) / link.getFreespeed(enterTime)); // log.debug("link " + link.getId() + " enterTime: " + enterTime + " earliest time " + this.earliestTimeInDistance + " distance " + d); }
for (Id<Link> toLinkId : signalizedLane.getToLinkIds()) { setOfLinkTuplesPerSignal.get(signal.getId()).add(new Tuple<Id<Link>, Id<Link>>(signal.getLinkId(), toLinkId));