Skip to content

Commit

Permalink
Add builder for StreetEdge
Browse files Browse the repository at this point in the history
  • Loading branch information
vpaturet committed Jul 17, 2023
1 parent 83ce065 commit 73d873b
Show file tree
Hide file tree
Showing 36 changed files with 1,264 additions and 870 deletions.
Expand Up @@ -19,6 +19,7 @@
import org.opentripplanner.street.model.edge.Edge;
import org.opentripplanner.street.model.edge.NamedArea;
import org.opentripplanner.street.model.edge.StreetEdge;
import org.opentripplanner.street.model.edge.StreetEdgeBuilder;
import org.opentripplanner.street.model.edge.StreetTransitStopLink;
import org.opentripplanner.street.model.vertex.OsmBoardingLocationVertex;
import org.opentripplanner.street.model.vertex.StreetVertex;
Expand Down Expand Up @@ -185,15 +186,15 @@ private boolean connectVertexToStop(TransitStopVertex ts, StreetIndex index) {

private StreetEdge linkBoardingLocationToStreetNetwork(StreetVertex from, StreetVertex to) {
var line = GeometryUtils.makeLineString(List.of(from.getCoordinate(), to.getCoordinate()));
return StreetEdge.createStreetEdge(
from,
to,
line,
new LocalizedString("name.platform"),
SphericalDistanceLibrary.length(line),
StreetTraversalPermission.PEDESTRIAN_AND_BICYCLE,
false
);
return new StreetEdgeBuilder<>()
.withFromVertex(from)
.withToVertex(to)
.withGeometry(line)
.withName(new LocalizedString("name.platform"))
.withMeterLength(SphericalDistanceLibrary.length(line))
.withPermission(StreetTraversalPermission.PEDESTRIAN_AND_BICYCLE)
.withBack(false)
.buildAndConnect();
}

private void linkBoardingLocationToStop(
Expand Down
Expand Up @@ -29,6 +29,7 @@
import org.opentripplanner.routing.vehicle_parking.VehicleParking;
import org.opentripplanner.street.model.StreetTraversalPermission;
import org.opentripplanner.street.model.edge.StreetEdge;
import org.opentripplanner.street.model.edge.StreetEdgeBuilder;
import org.opentripplanner.street.model.vertex.IntersectionVertex;
import org.opentripplanner.street.model.vertex.Vertex;
import org.slf4j.Logger;
Expand Down Expand Up @@ -463,7 +464,8 @@ private StreetEdgePair getEdgesForStreet(
}

LineString backGeometry = geometry.reverse();
StreetEdge street = null, backStreet = null;
StreetEdge street = null;
StreetEdge backStreet = null;
double length = getGeometryLengthMeters(geometry);

var permissionPair = OsmFilter.getPermissions(permissions, way);
Expand Down Expand Up @@ -499,13 +501,6 @@ private StreetEdgePair getEdgesForStreet(
if (street != null && backStreet != null) {
backStreet.shareData(street);
}

/* mark edges that are on roundabouts */
if (way.isRoundabout()) {
if (street != null) street.setRoundabout(true);
if (backStreet != null) backStreet.setRoundabout(true);
}

return new StreetEdgePair(street, backStreet);
}

Expand All @@ -524,37 +519,34 @@ private StreetEdge getEdgeForStreet(
I18NString name = params.edgeNamer().getNameForWay(way, label);
float carSpeed = way.getOsmProvider().getOsmTagMapper().getCarSpeedForWay(way, back);

StreetEdge street = StreetEdge.createStreetEdge(
startEndpoint,
endEndpoint,
geometry,
name,
length,
permissions,
back
);
street.setCarSpeed(carSpeed);
street.setLink(OsmFilter.isLink(way));
StreetEdgeBuilder<?> seb = new StreetEdgeBuilder<>()
.withFromVertex(startEndpoint)
.withToVertex(endEndpoint)
.withGeometry(geometry)
.withName(name)
.withMeterLength(length)
.withPermission(permissions)
.withBack(back)
.withCarSpeed(carSpeed)
.withLink(OsmFilter.isLink(way))
.withRoundabout(way.isRoundabout())
.withSlopeOverride(way.getOsmProvider().getWayPropertySet().getSlopeOverride(way))
.withStairs(way.isSteps());

if (!way.hasTag("name") && !way.hasTag("ref")) {
street.setHasBogusName(true);
seb.withBogusName(true);
}

boolean steps = way.isSteps();
street.setStairs(steps);

/* TODO: This should probably generalized somehow? */
if ((way.isTagFalse("wheelchair") || (steps && !way.isTagTrue("wheelchair")))) {
street.setWheelchairAccessible(false);
if ((way.isTagFalse("wheelchair") || (way.isSteps() && !way.isTagTrue("wheelchair")))) {
seb.withWheelchairAccessible(false);
}

street.setSlopeOverride(way.getOsmProvider().getWayPropertySet().getSlopeOverride(way));

// < 0.04: account for
if (carSpeed < 0.04) {
issueStore.add(new StreetCarSpeedZero(way));
}

StreetEdge street = seb.buildAndConnect();
params.edgeNamer().recordEdge(way, street);

return street;
Expand Down
Expand Up @@ -37,6 +37,7 @@
import org.opentripplanner.routing.graph.Graph;
import org.opentripplanner.street.model.StreetTraversalPermission;
import org.opentripplanner.street.model.edge.AreaEdge;
import org.opentripplanner.street.model.edge.AreaEdgeBuilder;
import org.opentripplanner.street.model.edge.AreaEdgeList;
import org.opentripplanner.street.model.edge.Edge;
import org.opentripplanner.street.model.edge.NamedArea;
Expand Down Expand Up @@ -527,27 +528,26 @@ private Set<AreaEdge> createSegments(
endEndpoint.getLabel();
I18NString name = namer.getNameForWay(areaEntity, label);

AreaEdge street = AreaEdge.createAreaEdge(
startEndpoint,
endEndpoint,
line,
name,
length,
areaPermissions,
false,
edgeList
);
street.setCarSpeed(carSpeed);
AreaEdgeBuilder streetEdgeBuilder = new AreaEdgeBuilder()
.withFromVertex(startEndpoint)
.withToVertex(endEndpoint)
.withGeometry(line)
.withName(name)
.withMeterLength(length)
.withPermission(areaPermissions)
.withBack(false)
.withArea(edgeList)
.withCarSpeed(carSpeed);

if (!areaEntity.hasTag("name") && !areaEntity.hasTag("ref")) {
street.setHasBogusName(true);
streetEdgeBuilder.withBogusName(true);
}

if (areaEntity.isTagFalse("wheelchair")) {
street.setWheelchairAccessible(false);
streetEdgeBuilder.withWheelchairAccessible(false);
}

street.setLink(OsmFilter.isLink(areaEntity));
streetEdgeBuilder.withLink(OsmFilter.isLink(areaEntity));

label =
"way (area) " +
Expand All @@ -558,27 +558,26 @@ private Set<AreaEdge> createSegments(
startEndpoint.getLabel();
name = namer.getNameForWay(areaEntity, label);

AreaEdge backStreet = AreaEdge.createAreaEdge(
endEndpoint,
startEndpoint,
line.reverse(),
name,
length,
areaPermissions,
true,
edgeList
);
backStreet.setCarSpeed(carSpeed);
AreaEdgeBuilder backStreetEdgeBuilder = new AreaEdgeBuilder()
.withFromVertex(endEndpoint)
.withToVertex(startEndpoint)
.withGeometry(line.reverse())
.withName(name)
.withMeterLength(length)
.withPermission(areaPermissions)
.withBack(true)
.withArea(edgeList)
.withCarSpeed(carSpeed);

if (!areaEntity.hasTag("name") && !areaEntity.hasTag("ref")) {
backStreet.setHasBogusName(true);
backStreetEdgeBuilder.withBogusName(true);
}

if (areaEntity.isTagFalse("wheelchair")) {
backStreet.setWheelchairAccessible(false);
backStreetEdgeBuilder.withWheelchairAccessible(false);
}

backStreet.setLink(OsmFilter.isLink(areaEntity));
backStreetEdgeBuilder.withLink(OsmFilter.isLink(areaEntity));

if (!wayPropertiesCache.containsKey(areaEntity)) {
WayProperties wayData = areaEntity
Expand All @@ -588,6 +587,8 @@ private Set<AreaEdge> createSegments(
wayPropertiesCache.put(areaEntity, wayData);
}

AreaEdge street = streetEdgeBuilder.buildAndConnect();
AreaEdge backStreet = backStreetEdgeBuilder.buildAndConnect();
normalizer.applyWayProperties(
street,
backStreet,
Expand Down
Expand Up @@ -29,6 +29,7 @@
import org.opentripplanner.street.model.edge.StreetEdge;
import org.opentripplanner.street.model.edge.TemporaryFreeEdge;
import org.opentripplanner.street.model.edge.TemporaryPartialStreetEdge;
import org.opentripplanner.street.model.edge.TemporaryPartialStreetEdgeBuilder;
import org.opentripplanner.street.model.vertex.StreetVertex;
import org.opentripplanner.street.model.vertex.TemporaryStreetLocation;
import org.opentripplanner.street.model.vertex.TransitStopVertex;
Expand Down Expand Up @@ -276,35 +277,33 @@ private static void createHalfLocationForTest(
double lengthOut = street.getDistanceMeters() * (1 - lengthRatioIn);

if (endVertex) {
TemporaryPartialStreetEdge temporaryPartialStreetEdge = TemporaryPartialStreetEdge.createTemporaryPartialStreetEdge(
street,
fromv,
base,
geometries.beginning(),
name,
lengthIn
);

temporaryPartialStreetEdge.setMotorVehicleNoThruTraffic(street.isMotorVehicleNoThruTraffic());
temporaryPartialStreetEdge.setBicycleNoThruTraffic(street.isBicycleNoThruTraffic());
temporaryPartialStreetEdge.setWalkNoThruTraffic(street.isWalkNoThruTraffic());
temporaryPartialStreetEdge.setLink(street.isLink());
tempEdges.addEdge(temporaryPartialStreetEdge);
TemporaryPartialStreetEdge tpse = new TemporaryPartialStreetEdgeBuilder()
.withParentEdge(street)
.withFromVertex(fromv)
.withToVertex(base)
.withGeometry(geometries.beginning())
.withName(name)
.withMeterLength(lengthIn)
.withMotorVehicleNoThruTraffic(street.isMotorVehicleNoThruTraffic())
.withBicycleNoThruTraffic(street.isBicycleNoThruTraffic())
.withWalkNoThruTraffic(street.isWalkNoThruTraffic())
.withLink(street.isLink())
.buildAndConnect();
tempEdges.addEdge(tpse);
} else {
TemporaryPartialStreetEdge temporaryPartialStreetEdge = TemporaryPartialStreetEdge.createTemporaryPartialStreetEdge(
street,
base,
tov,
geometries.ending(),
name,
lengthOut
);

temporaryPartialStreetEdge.setLink(street.isLink());
temporaryPartialStreetEdge.setMotorVehicleNoThruTraffic(street.isMotorVehicleNoThruTraffic());
temporaryPartialStreetEdge.setBicycleNoThruTraffic(street.isBicycleNoThruTraffic());
temporaryPartialStreetEdge.setWalkNoThruTraffic(street.isWalkNoThruTraffic());
tempEdges.addEdge(temporaryPartialStreetEdge);
TemporaryPartialStreetEdge tpse = new TemporaryPartialStreetEdgeBuilder()
.withParentEdge(street)
.withFromVertex(base)
.withToVertex(tov)
.withGeometry(geometries.ending())
.withName(name)
.withMeterLength(lengthOut)
.withLink(street.isLink())
.withMotorVehicleNoThruTraffic(street.isMotorVehicleNoThruTraffic())
.withBicycleNoThruTraffic(street.isBicycleNoThruTraffic())
.withWalkNoThruTraffic(street.isWalkNoThruTraffic())
.buildAndConnect();
tempEdges.addEdge(tpse);
}
}

Expand Down
53 changes: 25 additions & 28 deletions src/main/java/org/opentripplanner/routing/linking/VertexLinker.java
Expand Up @@ -21,6 +21,7 @@
import org.opentripplanner.routing.graph.Graph;
import org.opentripplanner.routing.graph.index.EdgeSpatialIndex;
import org.opentripplanner.street.model.edge.AreaEdge;
import org.opentripplanner.street.model.edge.AreaEdgeBuilder;
import org.opentripplanner.street.model.edge.AreaEdgeList;
import org.opentripplanner.street.model.edge.Edge;
import org.opentripplanner.street.model.edge.NamedArea;
Expand Down Expand Up @@ -639,42 +640,38 @@ private void createSegments(
// if all joining edges are nothru, then the new edge should be as well
var incomingNoThruModes = getNoThruModes(to.getIncoming());
var outgoingNoThruModes = getNoThruModes(to.getIncoming());

AreaEdge ae = AreaEdge.createAreaEdge(
from,
to,
line,
hit.getName(),
length,
hit.getPermission(),
false,
ael
);
AreaEdgeBuilder areaEdgeBuilder = new AreaEdgeBuilder()
.withFromVertex(from)
.withToVertex(to)
.withGeometry(line)
.withName(hit.getName())
.withMeterLength(length)
.withPermission(hit.getPermission())
.withBack(false)
.withArea(ael);
for (TraverseMode tm : outgoingNoThruModes) {
ae.setNoThruTraffic(tm);
areaEdgeBuilder.withNoThruTrafficTraverseMode(tm);
}

AreaEdge areaEdge = areaEdgeBuilder.buildAndConnect();
if (scope != Scope.PERMANENT) {
tempEdges.addEdge(ae);
tempEdges.addEdge(areaEdge);
}

ae =
AreaEdge.createAreaEdge(
to,
from,
line.reverse(),
hit.getName(),
length,
hit.getPermission(),
true,
ael
);
AreaEdgeBuilder reverseAreaEdgeBuilder = new AreaEdgeBuilder()
.withFromVertex(to)
.withToVertex(from)
.withGeometry(line.reverse())
.withName(hit.getName())
.withMeterLength(length)
.withPermission(hit.getPermission())
.withBack(true)
.withArea(ael);
for (TraverseMode tm : incomingNoThruModes) {
ae.setNoThruTraffic(tm);
reverseAreaEdgeBuilder.withNoThruTrafficTraverseMode(tm);
}

AreaEdge reverseAreaEdge = reverseAreaEdgeBuilder.buildAndConnect();
if (scope != Scope.PERMANENT) {
tempEdges.addEdge(ae);
tempEdges.addEdge(reverseAreaEdge);
}
}
}
Expand Down

0 comments on commit 73d873b

Please sign in to comment.