public void addTurn(List<Road> via, Road.End to) { assert equals(to.getJunction()); Relation existing = null; for (Turn t : to.getTurns()) { if (t.getFrom().getOutgoingRoadEnd().equals(getOutgoingRoadEnd()) && t.getVia().equals(via)) { if (t.getFrom().equals(this)) { // was already added return; } existing = t.getRelation(); } } final Relation r; if (existing == null) { r = new Relation(); r.put("type", Constants.TYPE_TURNS); r.addMember(new RelationMember(Constants.TURN_ROLE_FROM, getOutgoingRoadEnd().getWay())); if (via.isEmpty()) { r.addMember(new RelationMember(Constants.TURN_ROLE_VIA, getOutgoingJunction().getNode())); } else { for (Way w : Utils.flattenVia(getOutgoingJunction().getNode(), via, to.getJunction().getNode())) { r.addMember(new RelationMember(Constants.TURN_ROLE_VIA, w)); } } r.addMember(new RelationMember(Constants.TURN_ROLE_TO, to.getWay())); getOutgoingJunction().getNode().getDataSet().addPrimitive(r); } else { r = existing; } final String key = isExtra() ? Constants.TURN_KEY_EXTRA_LANES : Constants.TURN_KEY_LANES; final List<Integer> lanes = Turn.indices(r, key); lanes.add(getIndex()); r.put(key, Turn.join(lanes)); }
static List<Lane> load(Road.End roadEnd) { final List<Lane> result = new ArrayList<Lane>(); int i; i = 0; for (double l : CollectionUtils.reverse(roadEnd.getLengths(Kind.EXTRA_LEFT))) { result.add(new Lane(roadEnd, --i, Kind.EXTRA_LEFT, l)); } final int regulars = getRegularCount(roadEnd.getWay(), roadEnd.getJunction().getNode()); for (i = 1; i <= regulars; ++i) { result.add(new Lane(roadEnd, i)); } i = 0; for (double l : roadEnd.getLengths(Kind.EXTRA_RIGHT)) { result.add(new Lane(roadEnd, ++i, Kind.EXTRA_RIGHT, l)); } return result; }
public Road.End getIncomingRoadEnd() { return roadEnd.getOppositeEnd(); }
public Road getRoad() { return roadEnd.getRoad(); }