From 68e5d47a77d921ec532ca4cf4d58516cd5df9574 Mon Sep 17 00:00:00 2001 From: Marko Burjek Date: Fri, 30 Jun 2017 11:29:59 +0200 Subject: [PATCH 1/3] Add tests for changing speed unit from m/s to mm/s --- .../com/conveyal/r5/streets/SpeedsTests.java | 119 ++++++++++++++++++ 1 file changed, 119 insertions(+) create mode 100644 src/test/java/com/conveyal/r5/streets/SpeedsTests.java diff --git a/src/test/java/com/conveyal/r5/streets/SpeedsTests.java b/src/test/java/com/conveyal/r5/streets/SpeedsTests.java new file mode 100644 index 000000000..db000899e --- /dev/null +++ b/src/test/java/com/conveyal/r5/streets/SpeedsTests.java @@ -0,0 +1,119 @@ +package com.conveyal.r5.streets; + +import com.conveyal.r5.analyst.scenario.FakeGraph; +import com.conveyal.r5.point_to_point.builder.TNBuilderConfig; +import com.conveyal.r5.profile.ProfileRequest; +import com.conveyal.r5.profile.StreetMode; +import com.conveyal.r5.transit.TransportNetwork; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import java.util.ArrayList; + +/** + * Created by mabu on 30.6.2017. + */ +public class SpeedsTests { + + private static final Logger LOG = LoggerFactory.getLogger(SpeedsTests.class); + + + + private TransportNetwork transportNetwork; + + @Before + public void setUp() throws Exception { + transportNetwork = TransportNetwork.fromFiles(FakeGraph.class.getResource("columbus.osm.pbf").getFile(), + new ArrayList<>(), TNBuilderConfig.defaultConfig()); + } + + @Test + public void testSpeed() throws Exception { + EdgeStore.Edge testEdge = getEdgeFromOSM(37024879); //maxspeed =35 mph + + + double EXPECTED_SPEED_KMH = 56.327; //56.304001 + double EXPECTED_SPEED_MS = 15.6464; //15.64 + double EXPECTED_CAR_SPEED_MMS = 15.6464; //15.64 + + compareSpeed(testEdge, EXPECTED_SPEED_KMH, EXPECTED_SPEED_MS, EXPECTED_CAR_SPEED_MMS); + + testEdge = getEdgeFromOSM(21409508); //highway = residential + compareSpeed(testEdge, 40.24, 11.18, 11.18); + + testEdge = getEdgeFromOSM(21346162); //highway = motorway + compareSpeed(testEdge, 88.48, 24.58, 24.58); + + testEdge = getEdgeFromOSM(158779252); //highway = footway + compareSpeed(testEdge, 40.24, 11.18, 11.18); + + } + + @Test + public void testTimes() throws Exception { + + + ProfileRequest pr = new ProfileRequest(); + pr.fromLat = 40.0975849; + pr.fromLon = -83.0137315; + pr.toLat = 40.095727; + pr.toLon = -83.0145031; + + compareTime(pr, StreetMode.CAR, 54, 88, 253580); + compareTime(pr, StreetMode.WALK, 196, 561, 253580); + compareTime(pr, StreetMode.BICYCLE, 64, 162, 253580); + + pr.toLat = 39.9972981; + pr.toLon = -83.0115556; + compareTime(pr, StreetMode.CAR, 823, 719, 11500909); + compareTime(pr, StreetMode.WALK, 8752, 17569, 11276153); + compareTime(pr, StreetMode.BICYCLE, 2947, 2888, 11463477); + } + + private void compareTime(ProfileRequest pr, StreetMode streetMode, + int expectedDuration, int expectedWeight, int expectedDistance) { + StreetRouter sr = new StreetRouter(transportNetwork.streetLayer); + sr.profileRequest = pr; + sr.streetMode = streetMode; + sr.distanceLimitMeters = 100_000; + Assert.assertTrue(sr.setDestination(pr.toLat, pr.toLon)); + Assert.assertTrue(sr.setOrigin(pr.fromLat, pr.fromLon)); + + sr.route(); + + StreetRouter.State lastState = sr.getState(sr.getDestinationSplit()); + Assert.assertNotNull("Last state NULL for "+ streetMode, lastState); + + //LOG.info("State:{}", lastState); + Assert.assertEquals(expectedDuration, lastState.getDurationSeconds()); + Assert.assertEquals(expectedWeight, lastState.weight); + Assert.assertEquals(expectedDistance, lastState.distance); + } + + private void compareSpeed(EdgeStore.Edge testEdge, double EXPECTED_SPEED_KMH, + double EXPECTED_SPEED_MS, double EXPECTED_CAR_SPEED_MMS) { + //LOG.info("Edge:{} {}", testEdge, testEdge.getCarSpeedMetersPerSecond()); + + Assert.assertEquals(EXPECTED_SPEED_KMH,testEdge.getSpeedkmh(),0.1); + Assert.assertEquals(EXPECTED_SPEED_MS,testEdge.getCarSpeedMetersPerSecond(),0.1); + final ProfileRequest pr = new ProfileRequest(); + + Assert.assertEquals(EXPECTED_CAR_SPEED_MMS,testEdge.calculateSpeed(pr, StreetMode.CAR),0.1); + Assert.assertEquals(pr.bikeSpeed,testEdge.calculateSpeed(pr, StreetMode.BICYCLE),0.1); + Assert.assertEquals(pr.walkSpeed,testEdge.calculateSpeed(pr, StreetMode.WALK),0.1); + } + + private EdgeStore.Edge getEdgeFromOSM(long osmid) { + EdgeStore.Edge edge = transportNetwork.streetLayer.edgeStore.getCursor(); + while(edge.advance()) { + if (edge.getOSMID() == osmid) { + return edge; + } + } + return null; + + } +} From 8f2782c26cf38f62bed66de0eeb72da4d8be69da Mon Sep 17 00:00:00 2001 From: Marko Burjek Date: Fri, 30 Jun 2017 17:57:43 +0200 Subject: [PATCH 2/3] Speed is now saved as mm/s int in edge Time in traverse is calculated with mm length and mm/s GetSpeedForMode is now in mm/s not m/s --- .../com/conveyal/r5/analyst/GridComputer.java | 6 ++-- .../r5/analyst/TravelTimeSurfaceComputer.java | 4 +-- .../PointToPointRouterServer.java | 21 ++++++------ .../conveyal/r5/profile/ProfileRequest.java | 8 ++--- .../com/conveyal/r5/streets/EdgeStore.java | 33 ++++++++++++------- .../com/conveyal/r5/streets/StreetLayer.java | 11 ++++--- .../com/conveyal/r5/streets/StreetRouter.java | 18 +++++----- .../com/conveyal/r5/streets/SpeedsTests.java | 19 +++++------ 8 files changed, 66 insertions(+), 54 deletions(-) diff --git a/src/main/java/com/conveyal/r5/analyst/GridComputer.java b/src/main/java/com/conveyal/r5/analyst/GridComputer.java index 6099e10c8..914971da3 100644 --- a/src/main/java/com/conveyal/r5/analyst/GridComputer.java +++ b/src/main/java/com/conveyal/r5/analyst/GridComputer.java @@ -159,7 +159,7 @@ public void run() throws IOException { sr.quantityToMinimize = StreetRouter.State.RoutingVariable.DURATION_SECONDS; sr.route(); - int offstreetWalkSpeedMillimetersPerSecond = (int) (request.request.getSpeedForMode(directMode) * 1000); + int offstreetWalkSpeedMillimetersPerSecond = (int) (request.request.getSpeedForMode(directMode)); int[] travelTimes = linkedDestinations.eval(sr::getTravelTimeToVertex, offstreetWalkSpeedMillimetersPerSecond).travelTimes; double accessibility = 0; @@ -198,7 +198,7 @@ public void run() throws IOException { TIntIntMap reachedStops = sr.getReachedStops(); // convert millimeters to seconds - int millimetersPerSecond = (int) (request.request.getSpeedForMode(accessMode) * 1000); + int millimetersPerSecond = (int) (request.request.getSpeedForMode(accessMode)); for (TIntIntIterator it = reachedStops.iterator(); it.hasNext(); ) { it.advance(); it.setValue(it.value() / millimetersPerSecond); @@ -234,7 +234,7 @@ public void run() throws IOException { int minCount = (int) (router.nMinutes * router.monteCarloDrawsPerMinute * (request.travelTimePercentile / 100d)); // Do propagation of travel times from transit stops to the destinations - int offstreetTravelSpeedMillimetersPerSecond = (int) (request.request.getSpeedForMode(accessMode) * 1000); + int offstreetTravelSpeedMillimetersPerSecond = (int) (request.request.getSpeedForMode(accessMode)); int[] nonTransitTravelTimesToDestinations = linkedDestinationsDirect.eval(sr::getTravelTimeToVertex, offstreetTravelSpeedMillimetersPerSecond).travelTimes; PerTargetPropagater propagater = diff --git a/src/main/java/com/conveyal/r5/analyst/TravelTimeSurfaceComputer.java b/src/main/java/com/conveyal/r5/analyst/TravelTimeSurfaceComputer.java index 2fb8971f1..a9a0f0c41 100644 --- a/src/main/java/com/conveyal/r5/analyst/TravelTimeSurfaceComputer.java +++ b/src/main/java/com/conveyal/r5/analyst/TravelTimeSurfaceComputer.java @@ -68,7 +68,7 @@ public void write (OutputStream os) throws IOException { sr.setOrigin(request.request.fromLat, request.request.fromLon); sr.route(); - int offstreetTravelSpeedMillimetersPerSecond = (int) (request.request.getSpeedForMode(directMode) * 1000); + int offstreetTravelSpeedMillimetersPerSecond = (int) (request.request.getSpeedForMode(directMode)); LinkedPointSet linkedDestinations = destinations.link(network.streetLayer, directMode); @@ -113,7 +113,7 @@ public void write (OutputStream os) throws IOException { sr.route(); // Get the travel times to all stops reached in the initial on-street search. Convert distances to speeds. - int offstreetTravelSpeedMillimetersPerSecond = (int) (request.request.getSpeedForMode(accessMode) * 1000); + int offstreetTravelSpeedMillimetersPerSecond = (int) (request.request.getSpeedForMode(accessMode)); // getReachedStops returns distances, not times, so convert to times in the loop below TIntIntMap accessTimes = sr.getReachedStops(); diff --git a/src/main/java/com/conveyal/r5/point_to_point/PointToPointRouterServer.java b/src/main/java/com/conveyal/r5/point_to_point/PointToPointRouterServer.java index 810523793..862d67e63 100644 --- a/src/main/java/com/conveyal/r5/point_to_point/PointToPointRouterServer.java +++ b/src/main/java/com/conveyal/r5/point_to_point/PointToPointRouterServer.java @@ -835,7 +835,7 @@ private static void run(TransportNetwork transportNetwork) { get("debug/speeds", (request, response) -> { response.header("Content-Type", "application/json"); Map content = new HashMap<>(2); - Map speedUsage = new HashMap<>(); + Map speedUsage = new HashMap<>(); MinMax minMax = new MinMax(); if (request.queryParams().size() < 4) { @@ -1172,7 +1172,8 @@ private static GeoJsonFeature getEdgeFeature(boolean both, EdgeStore.Edge cursor GeoJsonFeature feature = new GeoJsonFeature(geometry); feature.addProperty("permission", cursor.getPermissionsAsString()); feature.addProperty("edge_id", cursor.getEdgeIndex()); - feature.addProperty("speed_ms", cursor.getSpeed()); + //TODO: make better speed calculations client side with mm/s instead of 100*m/s + feature.addProperty("speed_ms", cursor.getSpeed()/10); //divided by 10 so it's the same as previously short speed feature.addProperty("osmid", cursor.getOSMID()); //Needed for filtering flags for (EdgeStore.EdgeFlag flag: EdgeStore.EdgeFlag.values()) { @@ -1184,9 +1185,9 @@ private static GeoJsonFeature getEdgeFeature(boolean both, EdgeStore.Edge cursor return feature; } - private static void updateSpeed(EdgeStore.Edge edge, Map speedUsage, + private static void updateSpeed(EdgeStore.Edge edge, Map speedUsage, MinMax minMax) { - Short currentEdgeSpeed = edge.getSpeed(); + Integer currentEdgeSpeed = edge.getSpeed()/10; Integer currentValue = speedUsage.getOrDefault(currentEdgeSpeed, 0); speedUsage.put(currentEdgeSpeed, currentValue+1); minMax.updateMin(currentEdgeSpeed); @@ -1194,15 +1195,15 @@ private static void updateSpeed(EdgeStore.Edge edge, Map speedUs } private static class MinMax { - public short min = Short.MAX_VALUE; - public short max = Short.MIN_VALUE; + public int min = Integer.MAX_VALUE; + public int max = Integer.MIN_VALUE; - public void updateMin(Short currentEdgeSpeed) { - min = (short) Math.min(currentEdgeSpeed, min); + void updateMin(Integer currentEdgeSpeed) { + min = Math.min(currentEdgeSpeed, min); } - public void updateMax(Short currentEdgeSpeed) { - max = (short) Math.max(currentEdgeSpeed, max); + void updateMax(Integer currentEdgeSpeed) { + max = Math.max(currentEdgeSpeed, max); } } diff --git a/src/main/java/com/conveyal/r5/profile/ProfileRequest.java b/src/main/java/com/conveyal/r5/profile/ProfileRequest.java index c516ea72d..f07b34f42 100644 --- a/src/main/java/com/conveyal/r5/profile/ProfileRequest.java +++ b/src/main/java/com/conveyal/r5/profile/ProfileRequest.java @@ -239,17 +239,17 @@ public ZonedDateTime getFromTimeDateZD() { } /** - * @return the speed at which the given mode will traverse street edges. + * @return the speed at which the given mode will traverse street edges in mm/s. */ @JsonIgnore public float getSpeedForMode (StreetMode streetMode) { switch (streetMode) { case WALK: - return walkSpeed; + return walkSpeed*1000; case BICYCLE: - return bikeSpeed; + return bikeSpeed*1000; case CAR: - return carSpeed; + return carSpeed*1000; default: break; } diff --git a/src/main/java/com/conveyal/r5/streets/EdgeStore.java b/src/main/java/com/conveyal/r5/streets/EdgeStore.java index e6d8139d6..25a21126c 100644 --- a/src/main/java/com/conveyal/r5/streets/EdgeStore.java +++ b/src/main/java/com/conveyal/r5/streets/EdgeStore.java @@ -84,7 +84,7 @@ public class EdgeStore implements Serializable { * Saved speed is mostly the same as speed saved as m/s * 1000 it differs in second decimal place and is 0.024% smaller * This way of saving speeds is 3.5% smaller then previous (saving 7 decimal places) */ - public TShortList speeds; + public TIntList speeds; /** The index of the origin vertex of each edge pair in the forward direction. One entry for each edge pair. */ public TIntList fromVertices; @@ -175,7 +175,7 @@ public EdgeStore (VertexStore vertexStore, StreetLayer layer, int initialSize) { // There are separate flags and speeds entries for the forward and backward edges in each pair. flags = new TIntArrayList(initialSize); - speeds = new TShortArrayList(initialSize); + speeds = new TIntArrayList(initialSize); // Vertex indices, geometries, and lengths are shared between pairs of forward and backward edges. int initialEdgePairs = initialSize / 2; fromVertices = new TIntArrayList(initialEdgePairs); @@ -469,7 +469,11 @@ public void setFlags(Set flagSet) { } } - public short getSpeed() { + /** + * @return the car speed on this edge in mm/s taking live traffic updates into account if requested (though that's not + * yet implemented) + */ + public int getSpeed() { return speeds.get(edgeIndex); } @@ -478,14 +482,17 @@ public short getSpeed() { * yet implemented) */ public float getCarSpeedMetersPerSecond() { - return (float) ((speeds.get(edgeIndex) / 100.)); + return (float) ((speeds.get(edgeIndex) / 1000.)); } public float getSpeedkmh() { - return (float) ((speeds.get(edgeIndex) / 100.) * 3.6); + return (float) ((speeds.get(edgeIndex) / 1000.) * 3.6); } - public void setSpeed(short speed) { + /** + * @param speed Speed in mm/s + */ + public void setSpeed(int speed) { speeds.set(edgeIndex, speed); } @@ -540,6 +547,8 @@ public boolean isForward () { * If driving speed is based on max edge speed. (or from traffic if traffic is supported) * * Otherwise speed is based on wanted walking, cycling speed provided in ProfileRequest. + * + * Unit is mm/s */ public float calculateSpeed(ProfileRequest options, StreetMode traverseStreetMode) { if (traverseStreetMode == null) { @@ -547,7 +556,7 @@ public float calculateSpeed(ProfileRequest options, StreetMode traverseStreetMod return Float.NaN; } else if (traverseStreetMode == StreetMode.CAR) { // TODO: apply speed based on traffic information if switched on in the request - return getCarSpeedMetersPerSecond(); + return getSpeed(); } return options.getSpeedForMode(traverseStreetMode); } @@ -564,8 +573,8 @@ public StreetRouter.State traverse (StreetRouter.State s0, StreetMode streetMode } StreetRouter.State s1 = new StreetRouter.State(vertex, edgeIndex, s0); - float speedms = calculateSpeed(req, streetMode); - float time = (float) (getLengthM() / speedms); + float speedmms = calculateSpeed(req, streetMode); + float time = getLengthMm() / speedmms; float weight = 0; if (!canTurnFrom(s0, s1, req.reverseSearch)) return null; @@ -606,8 +615,8 @@ public StreetRouter.State traverse (StreetRouter.State s0, StreetMode streetMode if (walking) { //Recalculation of time and speed is needed if we are walking with bike - speedms = calculateSpeed(req, StreetMode.WALK)*0.9f; - time = (float) (getLengthM() / speedms); + speedmms = calculateSpeed(req, StreetMode.WALK)*0.9f; + time = getLengthMm() / speedmms; } //elevation costs @@ -1073,7 +1082,7 @@ public EdgeStore extendOnlyCopy() { copy.vertexStore = vertexStore.extendOnlyCopy(); copy.flags = new TIntAugmentedList(flags); // This is a deep copy, we should do an extend-copy but need a new class for that. Can we just use ints? - copy.speeds = new TShortArrayList(speeds); + copy.speeds = new TIntArrayList(speeds); // Vertex indices, geometries, and lengths are shared between pairs of forward and backward edges. copy.fromVertices = new TIntAugmentedList(fromVertices); copy.toVertices = new TIntAugmentedList(toVertices); diff --git a/src/main/java/com/conveyal/r5/streets/StreetLayer.java b/src/main/java/com/conveyal/r5/streets/StreetLayer.java index 612fcb0b4..82ae89376 100644 --- a/src/main/java/com/conveyal/r5/streets/StreetLayer.java +++ b/src/main/java/com/conveyal/r5/streets/StreetLayer.java @@ -971,8 +971,11 @@ private int getEdgeLengthMillimeters (List nodes) { return (int)(lengthMeters * 1000); } - private static short speedToShort(Float speed) { - return (short) Math.round(speed * 100); + /** + * Converts speed from m/s to mm/s and rounds it to integer + */ + private static int speedToMmPerS(Float speed) { + return (int) Math.round(speed * 1000); } /** @@ -1009,8 +1012,8 @@ private void makeEdge(Way way, int beginIdx, int endIdx, Long osmID) { } // FIXME this encoded speed should probably never be exposed outside the edge object - short forwardSpeed = speedToShort(speedLabeler.getSpeedMS(way, false)); - short backwardSpeed = speedToShort(speedLabeler.getSpeedMS(way, true)); + int forwardSpeed = speedToMmPerS(speedLabeler.getSpeedMS(way, false)); + int backwardSpeed = speedToMmPerS(speedLabeler.getSpeedMS(way, true)); RoadPermission roadPermission = permissions.getPermissions(way); diff --git a/src/main/java/com/conveyal/r5/streets/StreetRouter.java b/src/main/java/com/conveyal/r5/streets/StreetRouter.java index 6c0c6baac..d11cc53e9 100644 --- a/src/main/java/com/conveyal/r5/streets/StreetRouter.java +++ b/src/main/java/com/conveyal/r5/streets/StreetRouter.java @@ -304,12 +304,12 @@ public boolean setOrigin (double lat, double lon) { State startState1 = new State(split.vertex1, split.edge, streetMode); EdgeStore.Edge edge = streetLayer.edgeStore.getCursor(split.edge); // Uses weight based on distance from end vertices, and speed on edge which depends on transport mode - float speedMetersPerSecond = edge.calculateSpeed(profileRequest, streetMode); - startState1.weight = (int) ((split.distance1_mm / 1000) / speedMetersPerSecond); + float speedMiliMetersPerSecond = edge.calculateSpeed(profileRequest, streetMode); + startState1.weight = (int) (split.distance1_mm / speedMiliMetersPerSecond); edge.advance(); // Speed can be different on opposite sides of the same street - speedMetersPerSecond = edge.calculateSpeed(profileRequest, streetMode); - startState0.weight = (int) ((split.distance0_mm / 1000) / speedMetersPerSecond); + speedMiliMetersPerSecond = edge.calculateSpeed(profileRequest, streetMode); + startState0.weight = (int) (split.distance0_mm / speedMiliMetersPerSecond); // FIXME we're setting weight but not time and distance on these states above! // FIXME Below is reversing the vertices, but then aren't the weights, times, distances wrong? Why are we even doing this? @@ -433,10 +433,10 @@ public void route () { double maxAbsLatRadians = Math.toRadians(VertexStore.fixedDegreesToFloating(maxAbsLatFixed)); millimetersPerUnitLonFixed = MM_PER_UNIT_LAT_FIXED * Math.cos(maxAbsLatRadians); // FIXME account for speeds of individual street segments, not just speed in request - double maxSpeedMetersPerSecond = profileRequest.getSpeedForMode(streetMode); + double maxSpeedMilimetersPerSecond = profileRequest.getSpeedForMode(streetMode); // Car speed is currently often unspecified in the request and defaults to zero. - if (maxSpeedMetersPerSecond == 0) maxSpeedMetersPerSecond = 36.11; // 130 km/h - maxSpeedSecondsPerMillimeter = 1 / (maxSpeedMetersPerSecond * 1000); + if (maxSpeedMilimetersPerSecond == 0) maxSpeedMilimetersPerSecond = 36.11*1000; // 130 km/h + maxSpeedSecondsPerMillimeter = 1 / maxSpeedMilimetersPerSecond; } if (distanceLimitMeters > 0) { @@ -735,7 +735,7 @@ public State getState(Split split) { // figure out the turn cost int turnCost = this.turnCostCalculator.computeTurnCost(s.backEdge, split.edge, s.streetMode); - int traversalCost = (int) Math.round(split.distance0_mm / 1000d / e.calculateSpeed(profileRequest, s.streetMode)); + int traversalCost = Math.round(split.distance0_mm / e.calculateSpeed(profileRequest, s.streetMode)); // TODO length of perpendicular ret.incrementWeight(turnCost + traversalCost); @@ -765,7 +765,7 @@ public State getState(Split split) { // figure out the turn cost int turnCost = this.turnCostCalculator.computeTurnCost(s.backEdge, split.edge + 1, s.streetMode); - int traversalCost = (int) Math.round(split.distance1_mm / 1000d / e.calculateSpeed(profileRequest, s.streetMode)); + int traversalCost = Math.round(split.distance1_mm / e.calculateSpeed(profileRequest, s.streetMode)); ret.distance += split.distance1_mm; // TODO length of perpendicular diff --git a/src/test/java/com/conveyal/r5/streets/SpeedsTests.java b/src/test/java/com/conveyal/r5/streets/SpeedsTests.java index db000899e..cf9331013 100644 --- a/src/test/java/com/conveyal/r5/streets/SpeedsTests.java +++ b/src/test/java/com/conveyal/r5/streets/SpeedsTests.java @@ -37,18 +37,18 @@ public void testSpeed() throws Exception { double EXPECTED_SPEED_KMH = 56.327; //56.304001 double EXPECTED_SPEED_MS = 15.6464; //15.64 - double EXPECTED_CAR_SPEED_MMS = 15.6464; //15.64 + double EXPECTED_CAR_SPEED_MMS = 15.64304*1000; //15.64 compareSpeed(testEdge, EXPECTED_SPEED_KMH, EXPECTED_SPEED_MS, EXPECTED_CAR_SPEED_MMS); testEdge = getEdgeFromOSM(21409508); //highway = residential - compareSpeed(testEdge, 40.24, 11.18, 11.18); + compareSpeed(testEdge, 40.2336, 11.176, 11.176*1000); testEdge = getEdgeFromOSM(21346162); //highway = motorway - compareSpeed(testEdge, 88.48, 24.58, 24.58); + compareSpeed(testEdge, 88.4952, 24.582, 24.582*1000); testEdge = getEdgeFromOSM(158779252); //highway = footway - compareSpeed(testEdge, 40.24, 11.18, 11.18); + compareSpeed(testEdge, 40.2336, 11.176, 11.176*1000); } @@ -63,18 +63,17 @@ public void testTimes() throws Exception { pr.toLon = -83.0145031; compareTime(pr, StreetMode.CAR, 54, 88, 253580); - compareTime(pr, StreetMode.WALK, 196, 561, 253580); + compareTime(pr, StreetMode.WALK, 196, 562, 253580); compareTime(pr, StreetMode.BICYCLE, 64, 162, 253580); pr.toLat = 39.9972981; pr.toLon = -83.0115556; compareTime(pr, StreetMode.CAR, 823, 719, 11500909); - compareTime(pr, StreetMode.WALK, 8752, 17569, 11276153); + compareTime(pr, StreetMode.WALK, 8752, 17570, 11276153); compareTime(pr, StreetMode.BICYCLE, 2947, 2888, 11463477); } - private void compareTime(ProfileRequest pr, StreetMode streetMode, - int expectedDuration, int expectedWeight, int expectedDistance) { + private void compareTime(ProfileRequest pr, StreetMode streetMode, int expectedDuration, int expectedWeight, int expectedDistance) { StreetRouter sr = new StreetRouter(transportNetwork.streetLayer); sr.profileRequest = pr; sr.streetMode = streetMode; @@ -102,8 +101,8 @@ private void compareSpeed(EdgeStore.Edge testEdge, double EXPECTED_SPEED_KMH, final ProfileRequest pr = new ProfileRequest(); Assert.assertEquals(EXPECTED_CAR_SPEED_MMS,testEdge.calculateSpeed(pr, StreetMode.CAR),0.1); - Assert.assertEquals(pr.bikeSpeed,testEdge.calculateSpeed(pr, StreetMode.BICYCLE),0.1); - Assert.assertEquals(pr.walkSpeed,testEdge.calculateSpeed(pr, StreetMode.WALK),0.1); + Assert.assertEquals(pr.bikeSpeed*1000,testEdge.calculateSpeed(pr, StreetMode.BICYCLE),0.1); + Assert.assertEquals(pr.walkSpeed*1000,testEdge.calculateSpeed(pr, StreetMode.WALK),0.1); } private EdgeStore.Edge getEdgeFromOSM(long osmid) { From 7ff9a6177295aa1363e4d23e1740164f01ccf2b9 Mon Sep 17 00:00:00 2001 From: Marko Burjek Date: Mon, 3 Jul 2017 10:03:39 +0200 Subject: [PATCH 3/3] Debug client uses new speed units --- .../r5/point_to_point/PointToPointRouterServer.java | 5 ++--- src/main/resources/debug-plan/scripts/config.js | 4 ++-- src/main/resources/debug-plan/scripts/utils.js | 10 +++++----- 3 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/main/java/com/conveyal/r5/point_to_point/PointToPointRouterServer.java b/src/main/java/com/conveyal/r5/point_to_point/PointToPointRouterServer.java index 862d67e63..776e59ab0 100644 --- a/src/main/java/com/conveyal/r5/point_to_point/PointToPointRouterServer.java +++ b/src/main/java/com/conveyal/r5/point_to_point/PointToPointRouterServer.java @@ -1172,8 +1172,7 @@ private static GeoJsonFeature getEdgeFeature(boolean both, EdgeStore.Edge cursor GeoJsonFeature feature = new GeoJsonFeature(geometry); feature.addProperty("permission", cursor.getPermissionsAsString()); feature.addProperty("edge_id", cursor.getEdgeIndex()); - //TODO: make better speed calculations client side with mm/s instead of 100*m/s - feature.addProperty("speed_ms", cursor.getSpeed()/10); //divided by 10 so it's the same as previously short speed + feature.addProperty("speed_mms", cursor.getSpeed()); feature.addProperty("osmid", cursor.getOSMID()); //Needed for filtering flags for (EdgeStore.EdgeFlag flag: EdgeStore.EdgeFlag.values()) { @@ -1187,7 +1186,7 @@ private static GeoJsonFeature getEdgeFeature(boolean both, EdgeStore.Edge cursor private static void updateSpeed(EdgeStore.Edge edge, Map speedUsage, MinMax minMax) { - Integer currentEdgeSpeed = edge.getSpeed()/10; + Integer currentEdgeSpeed = edge.getSpeed(); Integer currentValue = speedUsage.getOrDefault(currentEdgeSpeed, 0); speedUsage.put(currentEdgeSpeed, currentValue+1); minMax.updateMin(currentEdgeSpeed); diff --git a/src/main/resources/debug-plan/scripts/config.js b/src/main/resources/debug-plan/scripts/config.js index 50c75106d..dafd0a8d3 100644 --- a/src/main/resources/debug-plan/scripts/config.js +++ b/src/main/resources/debug-plan/scripts/config.js @@ -5,9 +5,9 @@ var otp_config = { }; //Those are layers and name of properties in a layer if detail=true var layers = { - streetEdges:["edge_id", "permission", "speed_ms", "flags", "osmid"], + streetEdges:["edge_id", "permission", "speed_mms", "flags", "osmid"], permEdges:["name", "edge_id", "label", "osmid"], - turns:["edge_id", "permission", "speed_ms", "only", "edge", "via_edge_idx", "restrictionId", "osmid"] + turns:["edge_id", "permission", "speed_mms", "only", "edge", "via_edge_idx", "restrictionId", "osmid"] }; var current_layer = "streetEdges"; var url = otp_config.hostname + '/' + otp_config.restService; diff --git a/src/main/resources/debug-plan/scripts/utils.js b/src/main/resources/debug-plan/scripts/utils.js index 37bcd070c..3ec6aa8c7 100644 --- a/src/main/resources/debug-plan/scripts/utils.js +++ b/src/main/resources/debug-plan/scripts/utils.js @@ -224,7 +224,7 @@ function getStyle(type) { "line-color":speedColor(speed), "line-width":2 }, - "filter":["==", "speed_ms", parseInt(speed)] + "filter":["==", "speed_mms", parseInt(speed)] }; style.layers.push(speed_layer); }); @@ -263,12 +263,12 @@ function getStyle(type) { current_type = type; } -//Converts speed from m/s to kmh/mph +//Converts speed from mm/s to kmh/mph // based on GUI settings // And returnes it rounded to 2 decimal places //and wanted unit -function showSpeed(speedms) { - var speed_ms = speedms/100; +function showSpeed(speedmms) { + var speed_ms = speedmms/1000; var speed; if (text.unit == "kmh") { speed = speed_ms*3.6; @@ -287,7 +287,7 @@ function fillPopup(feature, layer) { for (var i=0; i < layer_info.length; i++) { pop += layer_info[i].toUpperCase(); pop +=": "; - if (layer_info[i] == "speed_ms") { + if (layer_info[i] == "speed_mms") { pop += showSpeed(prop[layer_info[i]]); } else if (layer_info[i] == "osmid") { pop += "OSM W:" + prop[layer_info[i]]+"";