From bc21013afe4c27dda816a2bc9f1646f90545b53a Mon Sep 17 00:00:00 2001 From: Abhishek Kejriwal Date: Mon, 12 Oct 2020 15:59:31 -0700 Subject: [PATCH] add speedlimitunit and speedlimitsign to legstep --- .../api/directions/v5/models/LegStep.java | 60 +++++++++++++++++++ .../api/directions/v5/models/MaxSpeed.java | 4 +- .../api/directions/v5/models/SpeedLimit.java | 32 ++++++++++ .../api/directions/v5/models/LegStepTest.java | 2 + .../directions/v5/MapboxDirectionsTest.java | 27 +++++++++ .../resources/directions_v5_speedlimit.json | 1 + 6 files changed, 124 insertions(+), 2 deletions(-) create mode 100644 services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/SpeedLimit.java create mode 100644 services-directions/src/test/resources/directions_v5_speedlimit.json diff --git a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/LegStep.java b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/LegStep.java index 5d4f80d2b..160500262 100644 --- a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/LegStep.java +++ b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/LegStep.java @@ -3,6 +3,7 @@ import androidx.annotation.NonNull; import androidx.annotation.Nullable; +import androidx.annotation.StringDef; import com.google.auto.value.AutoValue; import com.google.gson.Gson; import com.google.gson.GsonBuilder; @@ -10,6 +11,8 @@ import com.google.gson.annotations.SerializedName; import com.mapbox.api.directions.v5.DirectionsAdapterFactory; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; import java.util.List; /** @@ -20,6 +23,27 @@ @AutoValue public abstract class LegStep extends DirectionsJsonObject { + /** + * {@link LegStep.SpeedLimitSign} accident. + */ + public static final String MUTCD = "mutcd"; + + /** + * {@link LegStep.SpeedLimitSign} congestion. + */ + public static final String VIENNA = "vienna"; + + /** + * Speed limit sign. + */ + @Retention(RetentionPolicy.SOURCE) + @StringDef({ + MUTCD, + VIENNA + }) + public @interface SpeedLimitSign { + } + /** * Create a new instance of this class by using the {@link Builder} class. * @@ -59,6 +83,24 @@ public static Builder builder() { @SerializedName("duration_typical") public abstract Double durationTypical(); + /** + * Speed limit unit as per the locale. + * + * @return unit of the speed limit + */ + @Nullable + @SpeedLimit.Unit + public abstract String speedLimitUnit(); + + /** + * Speed limit sign type. + * + * @see LegStep.SpeedLimitSign + */ + @Nullable + @LegStep.SpeedLimitSign + public abstract String speedLimitSign(); + /** * Gives the geometry of the leg step. * @@ -288,6 +330,24 @@ public abstract static class Builder { */ public abstract Builder durationTypical(@Nullable Double durationTypical); + /** + * Speed limit unit as per the locale. + * + * @param speedLimitUnit speed limit unit + * @return this builder for chaining options together + * @see SpeedLimit.Unit + */ + public abstract Builder speedLimitUnit(@Nullable @SpeedLimit.Unit String speedLimitUnit); + + /** + * Speed limit sign type. + * + * @param speedLimitSign speed limit sign + * @return this builder for chaining options together + * @see SpeedLimitSign + */ + public abstract Builder speedLimitSign(@Nullable @SpeedLimitSign String speedLimitSign); + /** * Gives the geometry of the leg step. * diff --git a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/MaxSpeed.java b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/MaxSpeed.java index 81fbd9154..7c01bc6ea 100644 --- a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/MaxSpeed.java +++ b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/MaxSpeed.java @@ -8,7 +8,6 @@ import com.google.gson.TypeAdapter; import com.mapbox.api.directions.v5.DirectionsAdapterFactory; - /** * Object representing max speeds along a route. * @@ -43,6 +42,7 @@ public static Builder builder() { * @since 3.0.0 */ @Nullable + @SpeedLimit.Unit public abstract String unit(); /** @@ -124,7 +124,7 @@ public abstract static class Builder { * @return a {@link Builder} object * @since 3.0.0 */ - public abstract Builder unit(@Nullable String unit); + public abstract Builder unit(@Nullable @SpeedLimit.Unit String unit); /** * Boolean is true if the speed limit is not known, otherwise null. diff --git a/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/SpeedLimit.java b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/SpeedLimit.java new file mode 100644 index 000000000..40587ae47 --- /dev/null +++ b/services-directions-models/src/main/java/com/mapbox/api/directions/v5/models/SpeedLimit.java @@ -0,0 +1,32 @@ +package com.mapbox.api.directions.v5.models; + +import androidx.annotation.StringDef; + +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +/** + * The file exposes speed limit annotations. + */ +public class SpeedLimit { + /** + * Speed limit unit in km/h. + */ + public static final String KMPH = "km/h"; + + /** + * Speed limit unit in mph. + */ + public static final String MPH = "mph"; + + /** + * Speed limit unit. + */ + @Retention(RetentionPolicy.SOURCE) + @StringDef({ + MPH, + KMPH + }) + public @interface Unit { + } +} diff --git a/services-directions-models/src/test/java/com/mapbox/api/directions/v5/models/LegStepTest.java b/services-directions-models/src/test/java/com/mapbox/api/directions/v5/models/LegStepTest.java index 10cbc2ac8..75c40e7ed 100644 --- a/services-directions-models/src/test/java/com/mapbox/api/directions/v5/models/LegStepTest.java +++ b/services-directions-models/src/test/java/com/mapbox/api/directions/v5/models/LegStepTest.java @@ -75,6 +75,8 @@ public void testToFromJson3() { .modifier("left") .instruction("Turn left onto Adalbertstraße") .build()) + .speedLimitUnit("mph") + .speedLimitSign(LegStep.MUTCD) .intersections(intersections) .voiceInstructions(voiceInstructions) .bannerInstructions(bannerInstructions) diff --git a/services-directions/src/test/java/com/mapbox/api/directions/v5/MapboxDirectionsTest.java b/services-directions/src/test/java/com/mapbox/api/directions/v5/MapboxDirectionsTest.java index e349c61ab..f0ccabb13 100644 --- a/services-directions/src/test/java/com/mapbox/api/directions/v5/MapboxDirectionsTest.java +++ b/services-directions/src/test/java/com/mapbox/api/directions/v5/MapboxDirectionsTest.java @@ -56,6 +56,7 @@ public class MapboxDirectionsTest extends TestUtils { private static final String DIRECTIONS_ROTARY_FIXTURE = "directions_v5_fixtures_rotary.json"; private static final String DIRECTIONS_V5_ANNOTATIONS_FIXTURE = "directions_annotations_v5.json"; private static final String DIRECTIONS_V5_NO_ROUTE = "directions_v5_no_route.json"; + private static final String DIRECTIONS_V5_SPEED_LIMIT = "directions_v5_speedlimit.json"; private static final String DIRECTIONS_V5_MAX_SPEED_ANNOTATION = "directions_v5_max_speed_annotation.json"; private static final String DIRECTIONS_V5_BANNER_INSTRUCTIONS = "directions_v5_banner_instructions.json"; private static final String DIRECTIONS_V5_APPROACHES_REQUEST = "directions_v5_approaches.json"; @@ -789,6 +790,32 @@ public void maxSpeedAnnotation_doesGetCreatedInResponse() throws IOException { assertNotNull(maxSpeedAnnotation.maxspeed()); } + @Test + public void speedLimit_doesUnitGetCreatedInResponse() throws IOException { + Gson gson = new GsonBuilder() + .registerTypeAdapterFactory(DirectionsAdapterFactory.create()).create(); + String body = loadJsonFixture(DIRECTIONS_V5_SPEED_LIMIT); + DirectionsResponse response = gson.fromJson(body, DirectionsResponse.class); + DirectionsRoute speedLimitRoute = response.routes().get(0); + String speedLimitSign = speedLimitRoute.legs().get(0).steps().get(0).speedLimitSign(); + String speedLimitUnit = speedLimitRoute.legs().get(0).steps().get(0).speedLimitUnit(); + + assertEquals("mph", speedLimitUnit); + } + + @Test + public void speedLimit_doesSignGetCreatedInResponse() throws IOException { + Gson gson = new GsonBuilder() + .registerTypeAdapterFactory(DirectionsAdapterFactory.create()).create(); + String body = loadJsonFixture(DIRECTIONS_V5_SPEED_LIMIT); + DirectionsResponse response = gson.fromJson(body, DirectionsResponse.class); + DirectionsRoute speedLimitRoute = response.routes().get(0); + String speedLimitSign = speedLimitRoute.legs().get(0).steps().get(0).speedLimitSign(); + String speedLimitUnit = speedLimitRoute.legs().get(0).steps().get(0).speedLimitUnit(); + + assertEquals("mutcd", speedLimitSign); + } + @Test public void subBannerInstructions() throws Exception { Gson gson = new GsonBuilder() diff --git a/services-directions/src/test/resources/directions_v5_speedlimit.json b/services-directions/src/test/resources/directions_v5_speedlimit.json new file mode 100644 index 000000000..a577e7456 --- /dev/null +++ b/services-directions/src/test/resources/directions_v5_speedlimit.json @@ -0,0 +1 @@ +{"routes":[{"geometry":"i`q`gAvrzohFTfD~@zNz@tMqIdAsn@tHcL}eB_@wFs@{KmGgaA_AuNuAeTcGe_AgAqPiAeQ_Go}@wAaU}AwU_Ga~@q@_KS}C[}Ee@eHoIyqAOuB[aFG}@qJgzAGgAcAqOgGm_AyAaUd\\{D~V{C~C]dDe@fVuC~WcD~C_@tC]bWyCb\\aFh\\aE~VcDnDXfDY`AKvCQhGtHjMzPdAGfHc@b@CrDUfN}@zJg@jP_A`Ia@hk@qCd\\_Bz@EdUaAtVoAzKe@l`@eBvNq@|DQhOo@zT_A~S{@|^aBpXyArXoApXoAn[qAtDQ`Ow@VpKd@xRDnBn@pW^tOtAjq@FdDBtA_ERki@fC","legs":[{"annotation":{"duration":[0.8,2.3,2.2,3.6,16.3,21.1,1.7,2.8,14.2,3.4,6.4,19.4,5.3,5.8,20,7.1,5.8,16.2,3.1,1.3,1.8,2.4,21.2,0.9,2.1,0.6,27.5,0.7,7.7,36.7,12.6,7.6,6.5,1.3,1.1,5,3.5,0.6,0.8,4.3,6.3,7.3,14.2,1.8,1.7,0.7,1.5,3,5.4,0.6,2.7,0.3,3.6,9.8,7.6,11.2,1.9,8.4,5.5,0.4,17.8,6.1,3.3,7.7,11.2,4.2,11.6,5,4.8,6,4.8,6.9,6.8,9.6,1.9,5.4,2.2,3.5,0.6,4.3,2.6,13.5,1.4,0.7,2,14.3],"congestion":["low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","heavy","low","low","moderate","low","low","low","low","low","low","low","low","low","low","moderate","low","low","low","low","low","low","low","low","low","heavy","heavy","heavy","heavy","low","low","low","low","heavy","low","low","low","moderate","moderate","moderate","low","low","low","low","moderate","low","low","low","low","low","low","low","low","low","low","low","low","low","low"],"maxspeed":[{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":48,"unit":"km/h"},{"speed":48,"unit":"km/h"},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"speed":24,"unit":"km/h"},{"speed":24,"unit":"km/h"},{"unknown":true},{"unknown":true},{"speed":24,"unit":"km/h"},{"speed":24,"unit":"km/h"},{"unknown":true},{"unknown":true},{"speed":24,"unit":"km/h"},{"speed":24,"unit":"km/h"},{"unknown":true},{"unknown":true},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":16,"unit":"km/h"},{"speed":16,"unit":"km/h"},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"speed":40,"unit":"km/h"},{"unknown":true},{"unknown":true},{"unknown":true},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"}]},"summary":"Hayes Street, Valencia Street","weight":847.3,"duration":596.9,"steps":[{"intersections":[{"out":0,"entry":[true],"bearings":[261],"location":[-122.435388,37.774357]}],"driving_side":"right","geometry":"i`q`gAvrzohFTfD~@zNz@tM","mode":"driving","maneuver":{"bearing_after":261,"bearing_before":0,"location":[-122.435388,37.774357],"modifier":"right","type":"depart","instruction":"Head west on Fell Street"},"weight":33.9,"duration":9.3,"name":"Fell Street","distance":51,"speedLimitSign":"mutcd","speedLimitUnit":"mph","voiceInstructions":[{"distanceAlongGeometry":51,"announcement":"Head west on Fell Street, then turn right onto Scott Street","ssmlAnnouncement":"Head west on Fell Street, then turn right onto Scott Street"}],"bannerInstructions":[{"distanceAlongGeometry":51,"primary":{"text":"Scott Street","components":[{"text":"Scott Street","type":"text","abbr":"Scott St","abbr_priority":0}],"type":"turn","modifier":"right"},"secondary":null,"sub":{"text":"Hayes Street","components":[{"text":"Hayes Street","type":"text","abbr":"Hayes St","abbr_priority":0}],"type":"turn","modifier":"right"}}]},{"intersections":[{"out":3,"in":0,"entry":[false,false,true,true],"bearings":[75,165,255,345],"location":[-122.435961,37.774284]}],"driving_side":"right","geometry":"w{p`gApv{ohFqIdAsn@tH","mode":"driving","maneuver":{"bearing_after":350,"bearing_before":260,"location":[-122.435961,37.774284],"modifier":"right","type":"turn","instruction":"Turn right onto Scott Street"},"weight":34.6,"duration":22,"name":"Scott Street","distance":104.9,"speedLimitSign":"mutcd","speedLimitUnit":"mph","voiceInstructions":[{"distanceAlongGeometry":71.5,"announcement":"Turn right onto Hayes Street","ssmlAnnouncement":"Turn right onto Hayes Street"}],"bannerInstructions":[{"distanceAlongGeometry":104.9,"primary":{"text":"Hayes Street","components":[{"text":"Hayes Street","type":"text","abbr":"Hayes St","abbr_priority":0}],"type":"turn","modifier":"right"},"secondary":null}]},{"intersections":[{"out":0,"in":1,"entry":[true,false,true,true],"bearings":[75,165,255,345],"location":[-122.436151,37.775215]},{"out":0,"in":2,"entry":[true,true,false],"bearings":[75,165,255],"location":[-122.434504,37.775425]},{"out":0,"in":2,"entry":[true,true,false,true],"bearings":[75,165,255,345],"location":[-122.432863,37.775634]},{"out":0,"in":2,"entry":[true,true,false,true],"bearings":[75,165,255,345],"location":[-122.431216,37.775843]},{"out":0,"in":2,"entry":[true,true,false,true],"bearings":[75,165,255,345],"location":[-122.429572,37.776052]},{"out":0,"in":2,"entry":[true,true,false,true],"bearings":[75,165,255,345],"location":[-122.427928,37.776262]},{"out":0,"in":2,"entry":[true,true,false,true],"bearings":[75,165,255,345],"location":[-122.426286,37.776471]},{"out":0,"in":2,"entry":[true,true,false,true],"bearings":[75,195,255,345],"location":[-122.424646,37.776678]},{"out":0,"in":2,"entry":[true,false,false],"bearings":[75,165,255],"location":[-122.424381,37.776712]}],"driving_side":"right","geometry":"}ur`gAlb|ohFcL}eB_@wFs@{KmGgaA_AuNuAeTcGe_AgAqPiAeQ_Go}@wAaU}AwU_Ga~@q@_KS}C[}Ee@eHoIyqAOuB[aFG}@qJgzAGgAcAqOgGm_AyAaU","mode":"driving","maneuver":{"bearing_after":80,"bearing_before":350,"location":[-122.436151,37.775215],"modifier":"right","type":"turn","instruction":"Turn right onto Hayes Street"},"weight":290.8,"duration":253.90000000000003,"name":"Hayes Street","distance":1171.3,"speedLimitSign":"mutcd","speedLimitUnit":"mph","voiceInstructions":[{"distanceAlongGeometry":1151.3,"announcement":"Continue on Hayes Street for a half mile","ssmlAnnouncement":"Continue on Hayes Street for a half mile"},{"distanceAlongGeometry":322.9,"announcement":"In a quarter mile, turn right onto Gough Street","ssmlAnnouncement":"In a quarter mile, turn right onto Gough Street"},{"distanceAlongGeometry":69.2,"announcement":"Turn right onto Gough Street","ssmlAnnouncement":"Turn right onto Gough Street"}],"bannerInstructions":[{"distanceAlongGeometry":1171.3,"primary":{"text":"Gough Street","components":[{"text":"Gough Street","type":"text","abbr":"Gough St","abbr_priority":0}],"type":"turn","modifier":"right"},"secondary":null}]},{"intersections":[{"out":1,"in":2,"entry":[true,true,false,false],"bearings":[75,165,255,345],"location":[-122.422997,37.776889]},{"lanes":[{"valid":false,"indications":["slight left"]},{"valid":true,"indications":["straight"]},{"valid":true,"indications":["straight","right"]},{"valid":false,"indications":["right"]}],"out":1,"in":3,"entry":[true,true,false,false],"bearings":[75,165,255,345],"location":[-122.422903,37.776422]},{"lanes":[{"valid":false,"indications":["slight left"]},{"valid":true,"indications":["straight"]},{"valid":true,"indications":["straight","right"]},{"valid":false,"indications":["right"]}],"out":1,"in":3,"entry":[true,true,true,false],"bearings":[75,165,255,345],"location":[-122.42281,37.775958]},{"out":1,"in":3,"entry":[true,true,false,false],"bearings":[75,165,255,345],"location":[-122.422618,37.775023]},{"out":1,"in":3,"entry":[true,true,false,false],"bearings":[75,165,255,345],"location":[-122.422526,37.774562]},{"out":1,"in":3,"entry":[true,true,true,false],"bearings":[75,165,255,345],"location":[-122.422413,37.774096]},{"out":1,"in":3,"entry":[false,true,false,false],"bearings":[75,165,255,345],"location":[-122.422316,37.773627]}],"driving_side":"right","geometry":"q~u`gAhlbohFd\\{D~V{C~C]dDe@fVuC~WcD~C_@tC]bWyCb\\aFh\\aE~VcD","mode":"driving","maneuver":{"bearing_after":170,"bearing_before":80,"location":[-122.422997,37.776889],"modifier":"right","type":"turn","instruction":"Turn right onto Gough Street"},"weight":101.10000000000001,"pronunciation":"ˈɡɔːf ˈstɹiːt","duration":64.5,"name":"Gough Street","distance":411.1,"speedLimitSign":"mutcd","speedLimitUnit":"mph","voiceInstructions":[{"distanceAlongGeometry":391.1,"announcement":"In a quarter mile, keep right onto Gough Street","ssmlAnnouncement":"In a quarter mile, keep right onto Gough Street"},{"distanceAlongGeometry":95.6,"announcement":"Keep right onto Gough Street, then turn right onto Market Street","ssmlAnnouncement":"Keep right onto Gough Street, then turn right onto Market Street"}],"bannerInstructions":[{"distanceAlongGeometry":411.1,"primary":{"text":"Gough Street","components":[{"text":"Gough Street","type":"text","abbr":"Gough St","abbr_priority":0}],"type":"fork","modifier":"right"},"secondary":null},{"distanceAlongGeometry":95.6,"primary":{"text":"Gough Street","components":[{"text":"Gough Street","type":"text","abbr":"Gough St","abbr_priority":0}],"type":"fork","modifier":"right"},"secondary":null,"sub":{"text":"Market Street","components":[{"text":"Market","type":"text","abbr":"Mkt","abbr_priority":0},{"text":"Street","type":"text","abbr":"St","abbr_priority":1}],"type":"turn","modifier":"right"}}]},{"intersections":[{"out":1,"in":2,"entry":[true,true,false],"bearings":[150,180,345],"location":[-122.422234,37.773243]},{"out":2,"in":0,"entry":[false,false,true,true],"bearings":[0,75,180,255],"location":[-122.422247,37.773155]}],"driving_side":"right","geometry":"uzn`gAr|`ohFnDXfDY`AKvCQ","mode":"driving","maneuver":{"bearing_after":185,"bearing_before":170,"location":[-122.422234,37.773243],"modifier":"slight right","type":"fork","instruction":"Keep right onto Gough Street"},"weight":21.200000000000003,"pronunciation":"ˈɡɔːf ˈstɹiːt","duration":7.8,"name":"Gough Street","distance":31.5,"speedLimitSign":"mutcd","speedLimitUnit":"mph","voiceInstructions":[{"distanceAlongGeometry":31.5,"announcement":"Turn right onto Market Street, then turn left onto Valencia Street","ssmlAnnouncement":"Turn right onto Market Street, then turn left onto Valencia Street"}],"bannerInstructions":[{"distanceAlongGeometry":31.5,"primary":{"text":"Market Street","components":[{"text":"Market","type":"text","abbr":"Mkt","abbr_priority":0},{"text":"Street","type":"text","abbr":"St","abbr_priority":1}],"type":"turn","modifier":"right"},"secondary":null,"sub":{"text":"Valencia Street","components":[{"text":"Valencia Street","type":"text","abbr":"Valencia St","abbr_priority":0}],"type":"turn","modifier":"left"}}]},{"intersections":[{"out":2,"in":0,"entry":[false,false,true],"bearings":[0,45,225],"location":[-122.422219,37.772962]}],"driving_side":"right","geometry":"cin`gAt{`ohFhGtHjMzP","mode":"driving","maneuver":{"bearing_after":222,"bearing_before":172,"location":[-122.422219,37.772962],"modifier":"right","type":"turn","instruction":"Turn right onto Market Street"},"weight":27.7,"duration":11.1,"name":"Market Street","distance":56,"speedLimitSign":"mutcd","speedLimitUnit":"mph","voiceInstructions":[{"distanceAlongGeometry":56,"announcement":"Turn left onto Valencia Street","ssmlAnnouncement":"Turn left onto Valencia Street"}],"bannerInstructions":[{"distanceAlongGeometry":56,"primary":{"text":"Valencia Street","components":[{"text":"Valencia Street","type":"text","abbr":"Valencia St","abbr_priority":0}],"type":"turn","modifier":"left"},"secondary":null}]},{"intersections":[{"out":1,"in":0,"entry":[false,true,true],"bearings":[45,180,225],"location":[-122.42266,37.772599]},{"out":3,"in":0,"entry":[false,true,true,true,false],"bearings":[0,45,60,180,225],"location":[-122.422636,37.772398]},{"out":2,"in":0,"entry":[false,true,true],"bearings":[0,90,180],"location":[-122.422542,37.771596]},{"out":2,"in":0,"entry":[false,false,true,true],"bearings":[0,90,180,270],"location":[-122.422368,37.769874]},{"out":2,"in":0,"entry":[false,false,true,false],"bearings":[0,90,180,270],"location":[-122.422309,37.769289]},{"out":1,"in":0,"entry":[false,true,true],"bearings":[0,180,270],"location":[-122.422258,37.768754]},{"out":2,"in":0,"entry":[false,true,true,false],"bearings":[0,90,180,270],"location":[-122.4222,37.768146]},{"out":1,"in":0,"entry":[false,true,true],"bearings":[0,180,270],"location":[-122.422138,37.76746]},{"out":2,"in":0,"entry":[false,false,true,true],"bearings":[0,90,180,270],"location":[-122.422044,37.76654]}],"driving_side":"right","geometry":"mrm`gAfwaohFdAGfHc@b@CrDUfN}@zJg@jP_A`Ia@hk@qCd\\_Bz@EdUaAtVoAzKe@l`@eBvNq@|DQhOo@zT_A~S{@|^aBpXyArXoApXoAn[qAtDQ`Ow@","mode":"driving","maneuver":{"bearing_after":174,"bearing_before":223,"location":[-122.42266,37.772599],"modifier":"left","type":"turn","instruction":"Turn left onto Valencia Street"},"weight":264.8,"duration":179.20000000000005,"name":"Valencia Street","distance":857.2,"speedLimitSign":"mutcd","speedLimitUnit":"mph","voiceInstructions":[{"distanceAlongGeometry":837.2,"announcement":"Continue on Valencia Street for a half mile","ssmlAnnouncement":"Continue on Valencia Street for a half mile"},{"distanceAlongGeometry":334.8,"announcement":"In a quarter mile, turn right onto 16th Street","ssmlAnnouncement":"In a quarter mile, turn right onto 16th Street"},{"distanceAlongGeometry":71.8,"announcement":"Turn right onto 16th Street","ssmlAnnouncement":"Turn right onto 16th Street"}],"bannerInstructions":[{"distanceAlongGeometry":857.2,"primary":{"text":"16th Street","components":[{"text":"16th Street","type":"text","abbr":"16th St","abbr_priority":0}],"type":"turn","modifier":"right"},"secondary":null}]},{"intersections":[{"out":3,"in":0,"entry":[false,true,true,true],"bearings":[0,90,180,270],"location":[-122.421886,37.764917]},{"out":2,"in":0,"entry":[false,true,true],"bearings":[90,180,270],"location":[-122.422853,37.764859]},{"out":2,"in":1,"entry":[false,false,true],"bearings":[0,90,270],"location":[-122.42312,37.764843]}],"driving_side":"right","geometry":"ir~_gAzf`ohFVpKd@xRDnBn@pW^tOtAjq@FdDBtA","mode":"driving","maneuver":{"bearing_after":264,"bearing_before":174,"location":[-122.421886,37.764917],"modifier":"right","type":"turn","instruction":"Turn right onto 16th Street"},"weight":56.900000000000006,"duration":32.8,"name":"16th Street","distance":190.9,"speedLimitSign":"mutcd","speedLimitUnit":"mph","voiceInstructions":[{"distanceAlongGeometry":170.9,"announcement":"In 600 feet, turn right onto Guerrero Street","ssmlAnnouncement":"In 600 feet, turn right onto Guerrero Street"},{"distanceAlongGeometry":87.3,"announcement":"Turn right onto Guerrero Street, then you will arrive at your destination","ssmlAnnouncement":"Turn right onto Guerrero Street, then you will arrive at your destination"}],"bannerInstructions":[{"distanceAlongGeometry":190.9,"primary":{"text":"Guerrero Street","components":[{"text":"Guerrero Street","type":"text","abbr":"Guerrero St","abbr_priority":0}],"type":"turn","modifier":"right"},"secondary":null}]},{"intersections":[{"out":0,"in":1,"entry":[true,false,false,true],"bearings":[0,90,180,270],"location":[-122.424052,37.764794]}],"driving_side":"right","geometry":"sj~_gAfndohF_ERki@fC","mode":"driving","maneuver":{"bearing_after":354,"bearing_before":265,"location":[-122.424052,37.764794],"modifier":"right","type":"turn","instruction":"Turn right onto Guerrero Street"},"weight":16.3,"duration":16.3,"name":"Guerrero Street","distance":86.4,"speedLimitSign":"mutcd","speedLimitUnit":"mph","voiceInstructions":[{"distanceAlongGeometry":26.5,"announcement":"You have arrived at your destination","ssmlAnnouncement":"You have arrived at your destination"}],"bannerInstructions":[{"distanceAlongGeometry":86.4,"primary":{"text":"You will arrive","components":[{"text":"You will arrive","type":"text"}],"type":"arrive","modifier":"straight"},"secondary":null},{"distanceAlongGeometry":26.5,"primary":{"text":"You have arrived","components":[{"text":"You have arrived","type":"text"}],"type":"arrive","modifier":"straight"},"secondary":null}]},{"intersections":[{"in":0,"entry":[true],"bearings":[175],"location":[-122.42413,37.765568]}],"driving_side":"right","geometry":"_{_`gAbsdohF","mode":"driving","maneuver":{"bearing_after":0,"bearing_before":355,"location":[-122.42413,37.765568],"type":"arrive","instruction":"You have arrived at your destination"},"weight":0,"duration":0,"name":"Guerrero Street","distance":0,"speedLimitSign":"mutcd","speedLimitUnit":"mph","voiceInstructions":[],"bannerInstructions":[]}],"distance":2960.2}],"weight_name":"routability","weight":847.3,"duration":596.9,"distance":2960.2,"voiceLocale":"en-US"},{"geometry":"i`q`gAvrzohFTfD~@zNz@tMqIdAsn@tHcL}eB_@wFs@{KmGgaA_AuNfy@wJvs@uIrDc@lC[tt@{Ify@wJ|\\aEn[wD~[{Dd\\}DuGwdAmCg`@g@kIo@oJyBw]kEyp@uFa{@eBaXiA{PuDsk@uEwq@k@kFtEqCtA_Dh@wABGz@uBHWp@aBvAaCn@o@|@_@pTmAtFYnCOhP{@n^qB`FYrj@_CpJa@fMk@bNq@j@C`sA}Fz}AqH`ES|CMlPo@hhAgExDOIcE{DPmk@`Co_@rA_Mf@yCJ_ERki@fC","legs":[{"annotation":{"duration":[0.8,2.3,2.2,3.6,16.3,21.1,1.7,2.8,14.2,3.4,22.2,24.4,2.6,1.5,18.3,19.9,12.1,10.9,7.2,7.6,13.2,8.5,2.7,3,7.9,13.4,12.8,4.9,6.6,15.3,14.5,2.1,9.7,6.1,0.9,0.1,1.1,0.2,0.9,2.5,1.1,1.2,12.6,4.5,2.6,10.1,5.8,1.3,12.7,3.4,4.2,2.9,0.3,15.9,18.5,1.2,0.9,3.1,12.4,1,2.6,1,7.3,14.9,6.4,2.2,2,14.3],"congestion":["low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","moderate","low","low","low","low","low","low","low","low","low","low","low","low","moderate","low","low","moderate","moderate","unknown","unknown","unknown","unknown","unknown","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low"],"maxspeed":[{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":48,"unit":"km/h"},{"speed":48,"unit":"km/h"},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"unknown":true},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"}]},"summary":"Steiner Street, Guerrero Street","weight":858.7,"duration":540.3,"steps":[{"intersections":[{"out":0,"entry":[true],"bearings":[261],"location":[-122.435388,37.774357]}],"driving_side":"right","geometry":"i`q`gAvrzohFTfD~@zNz@tM","mode":"driving","maneuver":{"bearing_after":261,"bearing_before":0,"location":[-122.435388,37.774357],"modifier":"right","type":"depart","instruction":"Head west on Fell Street"},"weight":33.9,"duration":9.3,"name":"Fell Street","distance":51,"speedLimitSign":"mutcd","speedLimitUnit":"mph","voiceInstructions":[{"distanceAlongGeometry":51,"announcement":"Head west on Fell Street, then turn right onto Scott Street","ssmlAnnouncement":"Head west on Fell Street, then turn right onto Scott Street"}],"bannerInstructions":[{"distanceAlongGeometry":51,"primary":{"text":"Scott Street","components":[{"text":"Scott Street","type":"text","abbr":"Scott St","abbr_priority":0}],"type":"turn","modifier":"right"},"secondary":null,"sub":{"text":"Hayes Street","components":[{"text":"Hayes Street","type":"text","abbr":"Hayes St","abbr_priority":0}],"type":"turn","modifier":"right"}}]},{"intersections":[{"out":3,"in":0,"entry":[false,false,true,true],"bearings":[75,165,255,345],"location":[-122.435961,37.774284]}],"driving_side":"right","geometry":"w{p`gApv{ohFqIdAsn@tH","mode":"driving","maneuver":{"bearing_after":350,"bearing_before":260,"location":[-122.435961,37.774284],"modifier":"right","type":"turn","instruction":"Turn right onto Scott Street"},"weight":34.6,"duration":22,"name":"Scott Street","distance":104.9,"speedLimitSign":"mutcd","speedLimitUnit":"mph","voiceInstructions":[{"distanceAlongGeometry":71.5,"announcement":"Turn right onto Hayes Street","ssmlAnnouncement":"Turn right onto Hayes Street"}],"bannerInstructions":[{"distanceAlongGeometry":104.9,"primary":{"text":"Hayes Street","components":[{"text":"Hayes Street","type":"text","abbr":"Hayes St","abbr_priority":0}],"type":"turn","modifier":"right"},"secondary":null}]},{"intersections":[{"out":0,"in":1,"entry":[true,false,true,true],"bearings":[75,165,255,345],"location":[-122.436151,37.775215]},{"out":0,"in":2,"entry":[true,true,false],"bearings":[75,165,255],"location":[-122.434504,37.775425]}],"driving_side":"right","geometry":"}ur`gAlb|ohFcL}eB_@wFs@{KmGgaA_AuN","mode":"driving","maneuver":{"bearing_after":80,"bearing_before":350,"location":[-122.436151,37.775215],"modifier":"right","type":"turn","instruction":"Turn right onto Hayes Street"},"weight":58,"duration":45.3,"name":"Hayes Street","distance":292.8,"speedLimitSign":"mutcd","speedLimitUnit":"mph","voiceInstructions":[{"distanceAlongGeometry":272.8,"announcement":"In 900 feet, turn right onto Steiner Street","ssmlAnnouncement":"In 900 feet, turn right onto Steiner Street"},{"distanceAlongGeometry":97,"announcement":"Turn right onto Steiner Street","ssmlAnnouncement":"Turn right onto Steiner Street"}],"bannerInstructions":[{"distanceAlongGeometry":292.8,"primary":{"text":"Steiner Street","components":[{"text":"Steiner Street","type":"text","abbr":"Steiner St","abbr_priority":0}],"type":"turn","modifier":"right"},"secondary":null}]},{"intersections":[{"out":1,"in":2,"entry":[true,true,false,true],"bearings":[75,165,255,345],"location":[-122.432863,37.775634]},{"out":1,"in":3,"entry":[false,true,true,false],"bearings":[75,165,255,345],"location":[-122.432675,37.774702]},{"out":1,"in":3,"entry":[true,true,false,false],"bearings":[75,165,255,345],"location":[-122.432486,37.773768]},{"out":1,"in":3,"entry":[true,true,true,false],"bearings":[75,165,255,345],"location":[-122.432298,37.772838]},{"out":1,"in":3,"entry":[true,true,true,false],"bearings":[75,165,255,345],"location":[-122.43211,37.771906]},{"out":1,"in":2,"entry":[true,true,false],"bearings":[75,165,345],"location":[-122.432013,37.771427]},{"out":1,"in":3,"entry":[true,true,true,false],"bearings":[75,165,255,345],"location":[-122.431921,37.770971]},{"out":1,"in":2,"entry":[true,true,false],"bearings":[75,165,345],"location":[-122.431827,37.770507]}],"driving_side":"right","geometry":"cps`gA|tuohFfy@wJvs@uIrDc@lC[tt@{Ify@wJ|\\aEn[wD~[{Dd\\}D","mode":"driving","maneuver":{"bearing_after":170,"bearing_before":80,"location":[-122.432863,37.775634],"modifier":"right","type":"turn","instruction":"Turn right onto Steiner Street"},"weight":206.8,"duration":138,"name":"Steiner Street","distance":630.1,"speedLimitSign":"mutcd","speedLimitUnit":"mph","voiceInstructions":[{"distanceAlongGeometry":610.1,"announcement":"Continue on Steiner Street for a half mile","ssmlAnnouncement":"Continue on Steiner Street for a half mile"},{"distanceAlongGeometry":319.6,"announcement":"In a quarter mile, turn left onto Hermann Street","ssmlAnnouncement":"In a quarter mile, turn left onto Hermann Street"},{"distanceAlongGeometry":68.5,"announcement":"Turn left onto Hermann Street","ssmlAnnouncement":"Turn left onto Hermann Street"}],"bannerInstructions":[{"distanceAlongGeometry":630.1,"primary":{"text":"Hermann Street","components":[{"text":"Hermann Street","type":"text","abbr":"Hermann St","abbr_priority":0}],"type":"turn","modifier":"left"},"secondary":null}]},{"intersections":[{"out":0,"in":2,"entry":[true,true,false],"bearings":[75,165,345],"location":[-122.431732,37.77004]},{"out":0,"in":2,"entry":[true,true,false,true],"bearings":[75,165,255,345],"location":[-122.430084,37.77025]},{"out":0,"in":2,"entry":[true,true,false],"bearings":[75,180,255],"location":[-122.429242,37.770355]},{"out":0,"in":2,"entry":[true,true,false,true],"bearings":[75,165,255,345],"location":[-122.428445,37.770457]},{"out":0,"in":2,"entry":[true,false,false,true],"bearings":[75,165,255,345],"location":[-122.426797,37.770668]},{"out":0,"in":1,"entry":[true,false,true],"bearings":[75,255,345],"location":[-122.426083,37.770759]}],"driving_side":"right","geometry":"orh`gAfnsohFuGwdAmCg`@g@kIo@oJyBw]kEyp@uFa{@eBaXiA{PuDsk@uEwq@k@kF","mode":"driving","maneuver":{"bearing_after":80,"bearing_before":170,"location":[-122.431732,37.77004],"modifier":"left","type":"turn","instruction":"Turn left onto Hermann Street"},"weight":107.10000000000001,"duration":105.1,"name":"Hermann Street","distance":586.1,"speedLimitSign":"mutcd","speedLimitUnit":"mph","voiceInstructions":[{"distanceAlongGeometry":566.1,"announcement":"In a quarter mile, turn right onto Laguna Street","ssmlAnnouncement":"In a quarter mile, turn right onto Laguna Street"},{"distanceAlongGeometry":83.6,"announcement":"Turn right onto Laguna Street","ssmlAnnouncement":"Turn right onto Laguna Street"}],"bannerInstructions":[{"distanceAlongGeometry":586.1,"primary":{"text":"Laguna Street","components":[{"text":"Laguna Street","type":"text","abbr":"Laguna St","abbr_priority":0}],"type":"turn","modifier":"right"},"secondary":null}]},{"intersections":[{"out":0,"in":1,"entry":[true,false,false],"bearings":[135,255,345],"location":[-122.425153,37.770888]},{"out":1,"in":3,"entry":[false,true,true,false],"bearings":[45,120,225,300],"location":[-122.425,37.770738]},{"out":1,"in":3,"entry":[false,true,true,false],"bearings":[45,120,240,300],"location":[-122.424952,37.770715]},{"out":1,"in":3,"entry":[true,true,false,false],"bearings":[45,120,225,300],"location":[-122.424893,37.770685]},{"out":1,"in":3,"entry":[true,true,false,false],"bearings":[45,135,225,300],"location":[-122.424832,37.770655]},{"out":2,"in":0,"entry":[false,true,true,true],"bearings":[0,90,180,270],"location":[-122.424637,37.769739]},{"out":1,"in":0,"entry":[false,true,false],"bearings":[0,180,270],"location":[-122.424567,37.769122]},{"out":2,"in":0,"entry":[false,true,true,false],"bearings":[0,90,180,270],"location":[-122.424464,37.768011]},{"out":2,"in":0,"entry":[false,true,true,true],"bearings":[0,90,180,270],"location":[-122.42431,37.766402]},{"out":2,"in":0,"entry":[false,true,true,true],"bearings":[0,90,180,270],"location":[-122.424147,37.764787]}],"driving_side":"right","geometry":"ogj`gA`sfohFtEqCtA_Dh@wABGz@uBHWp@aBvAaCn@o@|@_@pTmAtFYnCOhP{@n^qB`FYrj@_CpJa@fMk@bNq@j@C`sA}Fz}AqH`ES|CMlPo@hhAgExDO","mode":"driving","maneuver":{"bearing_after":132,"bearing_before":78,"location":[-122.425153,37.770888],"modifier":"right","type":"end of road","instruction":"Turn right onto Laguna Street"},"weight":301.40000000000003,"duration":160.5,"name":"Laguna Street","distance":878.9,"speedLimitSign":"mutcd","speedLimitUnit":"mph","voiceInstructions":[{"distanceAlongGeometry":858.9,"announcement":"Continue on Laguna Street for a half mile","ssmlAnnouncement":"Continue on Laguna Street for a half mile"},{"distanceAlongGeometry":383.3,"announcement":"In a quarter mile, make a U-turn and continue on Guerrero Street","ssmlAnnouncement":"In a quarter mile, make a U-turn and continue on Guerrero Street"},{"distanceAlongGeometry":82.1,"announcement":"Make a U-turn and continue on Guerrero Street","ssmlAnnouncement":"Make a U-turn and continue on Guerrero Street"}],"bannerInstructions":[{"distanceAlongGeometry":878.9,"primary":{"text":"Guerrero Street","components":[{"text":"Guerrero Street","type":"text","abbr":"Guerrero St","abbr_priority":0}],"type":"turn","modifier":"uturn"},"secondary":null}]},{"intersections":[{"out":1,"in":0,"entry":[false,true,true,true],"bearings":[0,90,180,270],"location":[-122.424008,37.763163]},{"out":0,"in":3,"entry":[true,true,false,false],"bearings":[0,90,180,270],"location":[-122.42391,37.763168]},{"out":0,"in":2,"entry":[true,true,false],"bearings":[0,90,180],"location":[-122.423984,37.763973]},{"out":0,"in":2,"entry":[true,true,false,true],"bearings":[0,90,180,270],"location":[-122.424052,37.764794]}],"driving_side":"right","geometry":"ud{_gAnkdohFIcE{DPmk@`Co_@rA_Mf@yCJ_ERki@fC","mode":"driving","maneuver":{"bearing_after":85,"bearing_before":175,"location":[-122.424008,37.763163],"modifier":"uturn","type":"continue","instruction":"Make a U-turn and continue on Guerrero Street"},"weight":116.89999999999999,"duration":60.099999999999994,"name":"Guerrero Street","distance":276.3,"speedLimitSign":"mutcd","speedLimitUnit":"mph","voiceInstructions":[{"distanceAlongGeometry":256.3,"announcement":"In 900 feet, you will arrive at your destination","ssmlAnnouncement":"In 900 feet, you will arrive at your destination"},{"distanceAlongGeometry":23,"announcement":"You have arrived at your destination","ssmlAnnouncement":"You have arrived at your destination"}],"bannerInstructions":[{"distanceAlongGeometry":276.3,"primary":{"text":"You will arrive","components":[{"text":"You will arrive","type":"text"}],"type":"arrive","modifier":"straight"},"secondary":null},{"distanceAlongGeometry":23,"primary":{"text":"You have arrived","components":[{"text":"You have arrived","type":"text"}],"type":"arrive","modifier":"straight"},"secondary":null}]},{"intersections":[{"in":0,"entry":[true],"bearings":[175],"location":[-122.42413,37.765568]}],"driving_side":"right","geometry":"_{_`gAbsdohF","mode":"driving","maneuver":{"bearing_after":0,"bearing_before":355,"location":[-122.42413,37.765568],"type":"arrive","instruction":"You have arrived at your destination"},"weight":0,"duration":0,"name":"Guerrero Street","distance":0,"speedLimitSign":"mutcd","speedLimitUnit":"mph","voiceInstructions":[],"bannerInstructions":[]}],"distance":2820}],"weight_name":"routability","weight":858.7,"duration":540.3,"distance":2820,"voiceLocale":"en-US"},{"geometry":"i`q`gAvrzohFTfD~@zNz@tMFdAjCha@~Cff@RpCh@lIj@tITvDfH}@bLsArIcAjXcD|NgBdi@oGhy@yJdNaBl]cE`Gu@tCi@rEqDjEGdBCdBI`w@oJ`F]fEr@|dBiHy@m\\]kMQ_H_Bcu@{A_r@Y{MOoGQkISqIqB{z@uBuw@YiKQ}HeBgs@MyECoA{@y]WsKUmJEmBCiBI{B?UAMAc@EcBM_GI{CKcDEiBGwBM}GcAg^kCacAQgH_CibAWwK}@__@]kOMiFKeE{@a]SsIkAgg@i@aV{@i^zT_A~S{@|^aBpXyArXoApXoAn[qAtDQ`Ow@VpKd@xRDnBn@pW^tOtAjq@FdDBtA_ERki@fC","legs":[{"annotation":{"duration":[0.8,2.3,2.2,0.5,7.7,8.8,1.1,2.4,2,1,2.2,3.9,9.8,20.6,4.9,13,22.3,2.7,5.5,1.5,0.9,2,1.5,0.7,0.7,13,1.6,2.2,34.5,7.5,3.7,2.3,7.9,6.6,2.6,2.9,3.5,2.1,12.2,12,2.6,1.6,8.6,1.1,0.5,12,4.9,4.5,1.3,1.3,0.7,0.1,0.1,0.2,0.5,1.6,0.9,0.9,0.6,0.7,1.2,4.3,15.7,2,9,2,3.7,1.9,0.8,2,6.4,2.2,8.5,4.9,6.6,5,4.8,6,4.8,6.9,6.8,9.6,1.9,5.4,2.2,3.5,0.6,4.3,2.6,13.5,1.4,0.7,2,14.3],"congestion":["low","low","low","heavy","unknown","unknown","moderate","moderate","low","low","low","moderate","heavy","heavy","low","moderate","low","low","low","low","low","low","low","low","low","low","low","moderate","low","low","low","low","low","low","low","moderate","low","moderate","moderate","low","low","low","low","low","moderate","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","low","moderate","low","low","low","low","low","low","low","low","low","moderate","low","low","low","low","low","low","low","low","low","low","low","low","low","low"],"maxspeed":[{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":48,"unit":"km/h"},{"speed":48,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"unknown":true},{"unknown":true},{"speed":40,"unit":"km/h"},{"unknown":true},{"unknown":true},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"},{"unknown":true},{"unknown":true},{"unknown":true},{"unknown":true},{"speed":40,"unit":"km/h"},{"unknown":true},{"unknown":true},{"unknown":true},{"speed":40,"unit":"km/h"},{"speed":40,"unit":"km/h"}]},"summary":"Divisadero Street, 14th Street","weight":850.8,"duration":504.9,"steps":[{"intersections":[{"out":0,"entry":[true],"bearings":[261],"location":[-122.435388,37.774357]},{"out":2,"in":0,"entry":[false,false,true,true],"bearings":[75,165,255,345],"location":[-122.435961,37.774284]}],"driving_side":"right","geometry":"i`q`gAvrzohFTfD~@zNz@tMFdAjCha@~Cff@RpCh@lIj@tI","mode":"driving","maneuver":{"bearing_after":261,"bearing_before":0,"location":[-122.435388,37.774357],"modifier":"right","type":"depart","instruction":"Head west on Fell Street"},"weight":56,"duration":31.8,"name":"Fell Street","distance":195.6,"speedLimitSign":"mutcd","speedLimitUnit":"mph","voiceInstructions":[{"distanceAlongGeometry":195.6,"announcement":"Head west on Fell Street, then turn left onto Divisadero Street","ssmlAnnouncement":"Head west on Fell Street, then turn left onto Divisadero Street"},{"distanceAlongGeometry":92.3,"announcement":"Turn left onto Divisadero Street","ssmlAnnouncement":"Turn left onto Divisadero Street"}],"bannerInstructions":[{"distanceAlongGeometry":195.6,"primary":{"text":"Divisadero Street","components":[{"text":"Divisadero Street","type":"text","abbr":"Divisadero St","abbr_priority":0}],"type":"turn","modifier":"left"},"secondary":null}]},{"intersections":[{"out":2,"in":0,"entry":[false,false,true,true],"bearings":[75,165,255,345],"location":[-122.437584,37.774077]},{"out":1,"in":0,"entry":[false,true,true,false],"bearings":[75,165,255,345],"location":[-122.437676,37.774066]},{"out":1,"in":3,"entry":[true,true,false,false],"bearings":[75,165,255,345],"location":[-122.437487,37.773132]},{"out":1,"in":3,"entry":[true,true,true,false],"bearings":[75,165,255,345],"location":[-122.437299,37.772202]},{"out":1,"in":3,"entry":[true,true,true,false],"bearings":[75,165,255,345],"location":[-122.43711,37.771269]},{"out":1,"in":3,"entry":[true,true,true,false],"bearings":[75,150,255,345],"location":[-122.436915,37.770335]},{"lanes":[{"valid":true,"indications":["left"]},{"valid":true,"indications":["straight","slight left"]}],"out":2,"in":0,"entry":[false,true,true],"bearings":[0,120,180],"location":[-122.436826,37.770229]},{"out":1,"in":3,"entry":[true,true,true,false],"bearings":[90,195,270,345],"location":[-122.436616,37.769015]}],"driving_side":"right","geometry":"ynp`gA~{~ohFTvDfH}@bLsArIcAjXcD|NgBdi@oGhy@yJdNaBl]cE`Gu@tCi@rEqDjEGdBCdBI`w@oJ`F]fEr@|dBiH","mode":"driving","maneuver":{"bearing_after":260,"bearing_before":260,"location":[-122.437584,37.774077],"modifier":"left","type":"turn","instruction":"Turn left onto Divisadero Street"},"weight":278.2,"duration":163.4,"name":"Divisadero Street","distance":772.4,"speedLimitSign":"mutcd","speedLimitUnit":"mph","voiceInstructions":[{"distanceAlongGeometry":752.4,"announcement":"Continue on Divisadero Street for a half mile","ssmlAnnouncement":"Continue on Divisadero Street for a half mile"},{"distanceAlongGeometry":330.9,"announcement":"In a quarter mile, turn left onto 14th Street","ssmlAnnouncement":"In a quarter mile, turn left onto 14th Street"},{"distanceAlongGeometry":70.9,"announcement":"Turn left onto 14th Street","ssmlAnnouncement":"Turn left onto 14th Street"}],"bannerInstructions":[{"distanceAlongGeometry":772.4,"primary":{"text":"14th Street","components":[{"text":"14th Street","type":"text","abbr":"14th St","abbr_priority":0}],"type":"turn","modifier":"left"},"secondary":null}]},{"intersections":[{"out":1,"in":0,"entry":[false,true,true],"bearings":[0,90,270],"location":[-122.436493,37.767284]},{"out":1,"in":3,"entry":[true,true,true,false],"bearings":[0,90,180,270],"location":[-122.435648,37.767337]},{"out":1,"in":3,"entry":[true,true,true,false],"bearings":[0,90,180,270],"location":[-122.433426,37.767461]},{"out":1,"in":2,"entry":[true,true,false],"bearings":[0,90,270],"location":[-122.432299,37.767528]},{"out":1,"in":3,"entry":[true,true,true,false],"bearings":[0,90,180,270],"location":[-122.431195,37.7676]},{"out":1,"in":2,"entry":[true,true,false],"bearings":[0,90,270],"location":[-122.430091,37.767667]},{"out":1,"in":3,"entry":[false,true,true,false],"bearings":[0,90,165,270],"location":[-122.429065,37.767727]},{"out":1,"in":3,"entry":[false,true,false,false],"bearings":[0,90,180,270],"location":[-122.428917,37.767737]},{"out":2,"in":4,"entry":[false,false,true,false,false],"bearings":[45,49,85,222,266],"location":[-122.428789,37.767744]},{"out":1,"in":3,"entry":[false,true,false,false],"bearings":[45,90,225,270],"location":[-122.428516,37.767762]},{"out":0,"in":2,"entry":[true,false,false],"bearings":[90,180,270],"location":[-122.427873,37.767803]},{"out":1,"in":3,"entry":[false,true,true,false],"bearings":[0,90,180,270],"location":[-122.426784,37.767873]},{"out":1,"in":3,"entry":[true,true,false,false],"bearings":[0,90,180,270],"location":[-122.426636,37.767882]},{"out":1,"in":2,"entry":[true,true,false],"bearings":[0,90,270],"location":[-122.425559,37.767946]},{"out":0,"in":2,"entry":[true,true,false],"bearings":[90,180,270],"location":[-122.425355,37.767958]},{"out":1,"in":3,"entry":[false,true,true,false],"bearings":[0,90,180,270],"location":[-122.424464,37.768011]},{"out":1,"in":3,"entry":[true,true,false,false],"bearings":[0,90,180,270],"location":[-122.424365,37.768017]}],"driving_side":"right","geometry":"gfc`gAxw|ohFy@m\\]kMQ_H_Bcu@{A_r@Y{MOoGQkISqIqB{z@uBuw@YiKQ}HeBgs@MyECoA{@y]WsKUmJEmBCiBI{B?UAMAc@EcBM_GI{CKcDEiBGwBM}GcAg^kCacAQgH_CibAWwK}@__@]kOMiFKeE{@a]SsIkAgg@i@aV{@i^","mode":"driving","maneuver":{"bearing_after":84,"bearing_before":175,"location":[-122.436493,37.767284],"modifier":"left","type":"end of road","instruction":"Turn left onto 14th Street"},"weight":349,"duration":203.3,"name":"14th Street","distance":1260.4,"speedLimitSign":"mutcd","speedLimitUnit":"mph","voiceInstructions":[{"distanceAlongGeometry":1240.4,"announcement":"Continue on 14th Street for 1 mile","ssmlAnnouncement":"Continue on 14th Street for 1 mile"},{"distanceAlongGeometry":434,"announcement":"In a quarter mile, turn right onto Valencia Street","ssmlAnnouncement":"In a quarter mile, turn right onto Valencia Street"},{"distanceAlongGeometry":93,"announcement":"Turn right onto Valencia Street","ssmlAnnouncement":"Turn right onto Valencia Street"}],"bannerInstructions":[{"distanceAlongGeometry":1260.4,"primary":{"text":"Valencia Street","components":[{"text":"Valencia Street","type":"text","abbr":"Valencia St","abbr_priority":0}],"type":"turn","modifier":"right"},"secondary":null}]},{"intersections":[{"out":2,"in":3,"entry":[true,true,true,false],"bearings":[0,90,180,270],"location":[-122.4222,37.768146]},{"out":1,"in":0,"entry":[false,true,true],"bearings":[0,180,270],"location":[-122.422138,37.76746]},{"out":2,"in":0,"entry":[false,false,true,true],"bearings":[0,90,180,270],"location":[-122.422044,37.76654]}],"driving_side":"right","geometry":"c|d`gAnz`ohFzT_A~S{@|^aBpXyArXoApXoAn[qAtDQ`Ow@","mode":"driving","maneuver":{"bearing_after":175,"bearing_before":84,"location":[-122.4222,37.768146],"modifier":"right","type":"turn","instruction":"Turn right onto Valencia Street"},"weight":94.4,"duration":57.300000000000004,"name":"Valencia Street","distance":360.2,"speedLimitSign":"mutcd","speedLimitUnit":"mph","voiceInstructions":[{"distanceAlongGeometry":340.2,"announcement":"In a quarter mile, turn right onto 16th Street","ssmlAnnouncement":"In a quarter mile, turn right onto 16th Street"},{"distanceAlongGeometry":94.3,"announcement":"Turn right onto 16th Street","ssmlAnnouncement":"Turn right onto 16th Street"}],"bannerInstructions":[{"distanceAlongGeometry":360.2,"primary":{"text":"16th Street","components":[{"text":"16th Street","type":"text","abbr":"16th St","abbr_priority":0}],"type":"turn","modifier":"right"},"secondary":null}]},{"intersections":[{"out":3,"in":0,"entry":[false,true,true,true],"bearings":[0,90,180,270],"location":[-122.421886,37.764917]},{"out":2,"in":0,"entry":[false,true,true],"bearings":[90,180,270],"location":[-122.422853,37.764859]},{"out":2,"in":1,"entry":[false,false,true],"bearings":[0,90,270],"location":[-122.42312,37.764843]}],"driving_side":"right","geometry":"ir~_gAzf`ohFVpKd@xRDnBn@pW^tOtAjq@FdDBtA","mode":"driving","maneuver":{"bearing_after":264,"bearing_before":174,"location":[-122.421886,37.764917],"modifier":"right","type":"turn","instruction":"Turn right onto 16th Street"},"weight":56.900000000000006,"duration":32.8,"name":"16th Street","distance":190.9,"speedLimitSign":"mutcd","speedLimitUnit":"mph","voiceInstructions":[{"distanceAlongGeometry":170.9,"announcement":"In 600 feet, turn right onto Guerrero Street","ssmlAnnouncement":"In 600 feet, turn right onto Guerrero Street"},{"distanceAlongGeometry":87.3,"announcement":"Turn right onto Guerrero Street, then you will arrive at your destination","ssmlAnnouncement":"Turn right onto Guerrero Street, then you will arrive at your destination"}],"bannerInstructions":[{"distanceAlongGeometry":190.9,"primary":{"text":"Guerrero Street","components":[{"text":"Guerrero Street","type":"text","abbr":"Guerrero St","abbr_priority":0}],"type":"turn","modifier":"right"},"secondary":null}]},{"intersections":[{"out":0,"in":1,"entry":[true,false,false,true],"bearings":[0,90,180,270],"location":[-122.424052,37.764794]}],"driving_side":"right","geometry":"sj~_gAfndohF_ERki@fC","mode":"driving","maneuver":{"bearing_after":354,"bearing_before":265,"location":[-122.424052,37.764794],"modifier":"right","type":"turn","instruction":"Turn right onto Guerrero Street"},"weight":16.3,"duration":16.3,"name":"Guerrero Street","distance":86.4,"speedLimitSign":"mutcd","speedLimitUnit":"mph","voiceInstructions":[{"distanceAlongGeometry":26.5,"announcement":"You have arrived at your destination","ssmlAnnouncement":"You have arrived at your destination"}],"bannerInstructions":[{"distanceAlongGeometry":86.4,"primary":{"text":"You will arrive","components":[{"text":"You will arrive","type":"text"}],"type":"arrive","modifier":"straight"},"secondary":null},{"distanceAlongGeometry":26.5,"primary":{"text":"You have arrived","components":[{"text":"You have arrived","type":"text"}],"type":"arrive","modifier":"straight"},"secondary":null}]},{"intersections":[{"in":0,"entry":[true],"bearings":[175],"location":[-122.42413,37.765568]}],"driving_side":"right","geometry":"_{_`gAbsdohF","mode":"driving","maneuver":{"bearing_after":0,"bearing_before":355,"location":[-122.42413,37.765568],"type":"arrive","instruction":"You have arrived at your destination"},"weight":0,"duration":0,"name":"Guerrero Street","distance":0,"speedLimitSign":"mutcd","speedLimitUnit":"mph","voiceInstructions":[],"bannerInstructions":[]}],"distance":2865.8}],"weight_name":"routability","weight":850.8,"duration":504.9,"distance":2865.8,"voiceLocale":"en-US"}],"waypoints":[{"distance":5.618988860717543,"name":"Fell Street","location":[-122.435388,37.774357]},{"distance":2.8279999669326497,"name":"Guerrero Street","location":[-122.42413,37.765568]}],"code":"Ok","uuid":"ckgl20uw702rh7aljytb7xrcq"} \ No newline at end of file