Skip to content

Commit 665fdf9

Browse files
authored
feat: add alternates to valhalla (#152)
1 parent 4fa16b0 commit 665fdf9

File tree

4 files changed

+172
-14
lines changed

4 files changed

+172
-14
lines changed

CHANGELOG.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
1313
- Added a `km` and a `mi` property to `Direction` class to get the distance in kilometers and miles ([#139](https://github.com/gis-ops/routingpy/issues/139)).
1414
Distance stored in `Direction.distance` are always in meters.
1515
- Added a `pred_edge_id` property to `Edge` class that is used in `Expansions`.
16-
- `geotiff` support for Valhalla's isochrones ([#150](https://github.com/mthh/routingpy/pull/150))
16+
- Added `geotiff` support for Valhalla's isochrones ([#150](https://github.com/mthh/routingpy/pull/150)).
17+
- Added `alternates` support for Valhalla's directions ([#152](https://github.com/mthh/routingpy/pull/152)).
1718

1819
### Fixed
1920

@@ -23,7 +24,7 @@ and this project adheres to [Semantic Versioning](http://semver.org/spec/v2.0.0.
2324
- Added missing support for `kwargs` to Valhalla's `matrix` creation function ([#135](https://github.com/mthh/routingpy/pull/135))
2425
- Fixed Valhalla's `expansion` method to follow the latest Valhalla API changes ([#142](https://github.com/mthh/routingpy/pull/142))
2526
- Updating params with `kwargs` [#145](https://github.com/mthh/routingpy/pull/145)
26-
- Relative import so submoduling works ([#150](https://github.com/mthh/routingpy/pull/150))
27+
- Relative import so submoduling works ([#151](https://github.com/mthh/routingpy/pull/151))
2728

2829
### Removed
2930

routingpy/routers/valhalla.py

Lines changed: 33 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@
2121
from .. import utils
2222
from ..client_base import DEFAULT
2323
from ..client_default import Client
24-
from ..direction import Direction
24+
from ..direction import Direction, Directions
2525
from ..expansion import Edge, Expansions
2626
from ..isochrone import Isochrone, Isochrones
2727
from ..matrix import Matrix
@@ -122,6 +122,7 @@ def directions(
122122
avoid_locations: Optional[List[List[float]]] = None,
123123
avoid_polygons: Optional[List[List[List[float]]]] = None,
124124
date_time: Optional[dict] = None,
125+
alternatives: Optional[int] = None,
125126
id: Optional[Union[str, int, float]] = None,
126127
dry_run: Optional[bool] = None,
127128
**kwargs
@@ -172,6 +173,11 @@ def directions(
172173
in ISO 8601 format (YYYY-MM-DDThh:mm), local time.
173174
E.g. date_time = {type: 0, value: 2021-03-03T08:06:23}
174175
176+
:param int alternatives: The amount of alternatives to request. Note, with 1 you should get 2 routes.
177+
Also note that there may be no alternates or less alternates than what is requested and that
178+
alternates are not yet supported on routes with more than 2 locations.
179+
Default 0.
180+
175181
:param id: Name your route request. If id is specified, the naming will be sent thru to the response.
176182
177183
:param dry_run: Print URL and parameters without sending the request.
@@ -193,12 +199,14 @@ def directions(
193199
avoid_locations,
194200
avoid_polygons,
195201
date_time,
202+
alternatives,
196203
id,
197204
**kwargs
198205
)
199206

200207
return self.parse_direction_json(
201-
self.client._request("/route", post_params=params, dry_run=dry_run)
208+
self.client._request("/route", post_params=params, dry_run=dry_run),
209+
alternatives,
202210
)
203211

204212
@staticmethod
@@ -213,6 +221,7 @@ def get_direction_params(
213221
avoid_locations=None,
214222
avoid_polygons=None,
215223
date_time=None,
224+
alternatives=None,
216225
id=None,
217226
**kwargs
218227
):
@@ -249,6 +258,9 @@ def get_direction_params(
249258
if date_time:
250259
params["date_time"] = date_time
251260

261+
if alternatives:
262+
params["alternates"] = alternatives
263+
252264
if id:
253265
params["id"] = id
254266

@@ -263,19 +275,29 @@ def get_direction_params(
263275
return params
264276

265277
@staticmethod
266-
def parse_direction_json(response):
278+
def parse_direction_json(response, alternatives):
267279
if response is None: # pragma: no cover
268-
return Direction()
280+
return Directions() if alternatives else Direction()
281+
282+
directions = []
283+
routes = [response] if not alternatives else [response] + response.get("alternates", [])
269284

270-
geometry, duration, distance = [], 0, 0
271-
for leg in response["trip"]["legs"]:
272-
geometry.extend(utils.decode_polyline6(leg["shape"]))
273-
duration += leg["summary"]["time"]
274-
distance += leg["summary"]["length"]
285+
for route in routes:
286+
geometry, duration, distance = [], 0, 0
287+
for leg in route["trip"]["legs"]:
288+
geometry.extend(utils.decode_polyline6(leg["shape"]))
289+
duration += leg["summary"]["time"]
290+
distance += leg["summary"]["length"]
275291

276-
distance *= 1000 # convert to meters
292+
distance *= 1000 # convert to meters
293+
294+
directions.append(
295+
Direction(
296+
geometry=geometry, duration=int(duration), distance=int(distance), raw=response
297+
)
298+
)
277299

278-
return Direction(geometry=geometry, duration=int(duration), distance=int(distance), raw=response)
300+
return Directions(directions, response) if alternatives else directions[0]
279301

280302
def isochrones( # noqa: C901
281303
self,

tests/data/mock.py

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,95 @@
4848
},
4949
"units": "kilometers",
5050
},
51+
"alternatives": {
52+
"trip": {
53+
"locations": [
54+
{"type": "break", "lat": 42.358528, "lon": -83.2714, "original_index": 0},
55+
{"type": "break", "lat": 42.43892, "lon": -82.749855, "original_index": 1},
56+
],
57+
"legs": [
58+
{
59+
"summary": {
60+
"has_time_restrictions": False,
61+
"has_toll": False,
62+
"has_highway": False,
63+
"has_ferry": False,
64+
"min_lat": 42.350438,
65+
"min_lon": -83.275885,
66+
"max_lat": 42.456438,
67+
"max_lon": -82.869245,
68+
"time": 2308.26,
69+
"length": 46.176,
70+
"cost": 3735.242,
71+
},
72+
"shape": "_ojxoAjmny}CpzAuA~EETt_@Tjj@P|]H~OHpRDvGNxLBnBFrDJ|J}EfA_@VsK`EaH~BiFpBqKbE}B~@q@TiC|@iHvB_FpAgGnAqKhBqQpAsIP_KPgQZq_@b@ic@\\sGHwBBiMFuf@~@ic@`@}GJ}TVmMNmOPkCBkSTa]^iDDeEFeGHgFJ_ED}HL_IJmABgCDeA@mLNuCG}`@VgLX}Qb@mIRk_@v@_[p@ka@ZqIDgLH_DD}W`@_A@oJPwEDoKJcVVog@f@aK@sE?aXBqC@}HKoEIe_@m@aCCeMG{F?{S_@wx@yAga@s@cLS_AA}FGwCCurAoAsEA}@Eqb@?_V]oK?egAdB{ENmw@Nif@vBmDHg^~AmPr@yDNcCRgDZeL~@on@nAyWtAsa@zEsIbAiFl@cHj@eDJySn@oFP{\\fAuMR_FHG{FI_IQcQGyFE{IyB}]i@sH}GwlAwD}q@kE{w@gDkaA}Hu{@}@qh@Q_f@?enA@oo@@qbA^uaBb@{eBxAigAt@ge@hAihCz@kr@dAilETg_AKspAGeoA]wv@eBcyDDgNDyI^iStD}q@nCwWpDkWzBkMxB{K|FsV|G}UzDmLbEcL`JgTfHyN`FeJ|HiMlIsLjv@saA|tAy_Bj]}c@hj@a{@jLyQ|GwKvNsWvMuVvWii@`IoQhHuQrQ{h@jFgS~CaOrEkVzCcTpCoVrCoW~@gQl@eQpAak@p@g`@d@g`@\\kk@Dub@Ge`@We`@q@ek@w@ca@gAcb@cDq~@gBs_@_Cub@eJcvAyBw_@sFa}@aDobAs@a_@e@}_AMqp@AmXU_b@[gvDm@_zAgB_vAyAks@mAyo@e@gQgB_y@e@qXo@kRy@wi@_Ake@]kW_@ux@Gw}@Iqe@S{k@K{uEYorAQg~AOk}AYm[mA{ZaB}W_BeRwBoReEuWyEwToEmRkEgOcJg[{AgGioAqdFmOeq@eMsm@eJwh@iIsf@cs@cgF_Kkt@a~@y_HuB_Pqb@{bDuGuh@yC_\\gAmLqC}_@gC{_@iDov@_A_WeAcc@s@}w@Fay@`@wnBX_cA?_ZDu{ELwt@CiYDa`@x@_f@z@qXpAiYhAaRtBqYtBsSvBoR|B{QpCkRhA{GzB{LvF}YfEoQnGkXrOqi@rJcY|\\yw@|G{LbCyFjKqRdR_XzQyUdJcKbLaKlZkTxPaKlHoDpOyHfKcE|UsGn\\gHhSaCfTo@vES|JM|JBvO`@dRLth@Bp_BxDdo@\\j\\{@jq@uDzSyCzMeC`TcElQaFbTaHvZwLzMgGvZcPlOgJjRiM|KsI|UcSh]e`@xWg^|JwQ|I_QpOm]|Ke\\jQao@te@ugB~V{_A|Jg_@bs@kjCzWqaAnS_w@v_@}vAbMae@hg@}jBnM_f@``@kwAzb@a_B~AsGzF}TnTku@jm@crBdl@{iBl\\ojAxf@oaBpm@{pBxGcUzc@cmAhe@snAhToj@|t@_mBtSoi@|EcMbSgi@bPof@lL_c@vWckAzNmt@rKkj@pJ{UbJu`@xJc^fMy_@vLiXhMcWvKoSnL}QfIaLhGgHpGcG`BaBbGgH`HkGjQmPfFkF~BwDlD{FrDqIlD_LlCiOhAaLrCs_@dDkd@lJ_sAF{DBqBIwHmBaUoAcG{HuXqHyWaEyN{^awAwHyWsHqRigAu_FotAurGmZuqAmXqpA{Mih@u^ihAs\\{w@yWyh@_CyEcMgUsgA_tByIoPspA{`Cqk@}`Aa^ol@wEeH}Usa@_t@eoAse@u|@{h@ukAcAkC_KsWuYuu@kXmr@aFmMaCgGwa@yjAgPmg@_BqE_c@iyA}IkZuPin@wWa~@eRim@mUeo@kYyo@sH_Po^qp@eKaQiVqc@qNmVoDoGgTw_@mLwSao@qjAwB}DoFoJuO_[gQu^eQaa@_GyOel@wjBgYcfAqNsk@wMki@maB{mGaO}i@e\\wnAkb@y|AySi{@og@moB}CuLi]mrAeHyUiS}i@mQq`@s\\mk@sVo\\i]g]}]aXmMwJqFsDoIeFgUgNcPuIwZgUqSiQkJoJ}IeKeXo`@eFsI}E}IkL{VqEaLiFyNsDoLsG_VuFcW_EiUgBiLaVkqBwSykByIqu@cJkp@wHwe@}Hea@eP_r@gNyf@u]{mAwPin@aNme@{S_r@q~@gzCeVmy@sr@o`Co@}BmX{bAkH{WwNqm@}Oiv@mCiP{Jwm@kBmLm[ahDqB{\\yAks@iA}dANk`@\\ixACwf@e@kh@oA}e@yC{h@}Fag@mEw]_EiWsGy]}DuQwJo`@sK{^{Xgz@s]_o@}P_YaT{[cIeLiS{Z_I}KokAycB}OwUaKkPaJkPyMeXoGoN}V}x@cOq`@oHuYyh@alCmYkxAw~@sxEg[uiBso@}kEeLqz@iDeUoGq^kGya@iOo}@eEqW{EmZcV}zAwHed@iRcdA{^igBiRc~@{hAinFsWwpAeTgeAcHu_@kHmd@cFaZ_WwfBoLep@yIs^iUuu@cDkJgg@ygAcUm_@mHqKsH}KydA{{AcgAw~Awd@aq@mEqGy_AusAaCmD{`@al@yp@qbAmpA{kBMUsPiWgSw]q]wp@eJoR{ByFcHgPoGkOw`@qbAaMuYyT{e@{IqO_Vma@yL_RuNqSmVs[gL}M{BiCcUcUwToSq[gX{u@yi@cf@{\\ifBcpAej@s`@gJkHeYmSyp@gg@y[qTs[oTccAim@gjBqdAigAii@yb@eUaQ_J}dAwi@k`@_Q}f@gRmdC_z@wf@qPysEa}Ag]kLmw@_WwTaHaTmJmbAgb@{QiJgUwM{GuBmDiAyMiEwKmD{Bo@aEiAiDaA|@iGf@{DrAyJNkA`@yCdAeI`DoVlZmrBzD{W~c@yzCj@sDb@wCbJgn@dJqm@rFg_@x@gFfS{yA~@{GlB{M|@wFlDuUvIum@nBqQpAwQn@eKq@iGnK_s@nRapAhBwLj`@uiCvPqhAjP{eAzPoiAbN_`AdPcgAnIak@`Jim@|Kut@t@qFxEk[pGyb@tAgJbJim@nHmf@bDeTzGqd@`G}^n@eEvDsVzEk[|CkSrAwInI_j@zJso@rQaiAfCiPr@kErDuUbDoSrl@q_EdKwq@bQmoAdBaN`Q{lA^eGXcIwF}@yDo@{BWs^cEgAMaI}@iX_CcW_@ca@`@iFF{CBaj@AgB?sICqNQoJKqMOqBCoRWuBCeKM{T[iDE_DFuHP}UbAaDLqWfA}UbAiWbAwETcFRoDDmFFsAEeBK{IkA_KiCi@OsQwDiTiGsScGqDaA{N}DqQ{E}PuEoh@mNqIaC}b@}Lq^{Jo^{JmTaGyTgG_Y_I{MwDqLeDaFqAiZ{Hy@Suj@mNeHaBiKaCyS}EqCq@mU_GcLqA_T}@gLtB{An@iFrBkHfF{HtHgFvGqGfMyDxLqBpK_QxdAyClQnFbDtAkJ~BmOlDiPdJih@_G}EuRsGiBWwUmDqLa@k^bAeNw@qPkBwLuGiJ_NmD{Ky@wNdCuPrPcX~^_l@vNgd@rLo\\rImNdVgP`LuHzMyH",
73+
}
74+
],
75+
"summary": {
76+
"has_time_restrictions": False,
77+
"has_toll": False,
78+
"has_highway": True,
79+
"has_ferry": False,
80+
"min_lat": 42.350438,
81+
"min_lon": -83.275885,
82+
"max_lat": 42.456438,
83+
"max_lon": -82.869245,
84+
"time": 2308.26,
85+
"length": 46.176,
86+
"cost": 3735.242,
87+
},
88+
"status_message": "Found route between points",
89+
"status": 0,
90+
"units": "kilometers",
91+
"language": "en-US",
92+
},
93+
"alternates": [
94+
{
95+
"trip": {
96+
"locations": [
97+
{"type": "break", "lat": 42.358528, "lon": -83.2714, "original_index": 0},
98+
{"type": "break", "lat": 42.43892, "lon": -82.749855, "original_index": 1},
99+
],
100+
"legs": [
101+
{
102+
"summary": {
103+
"has_time_restrictions": False,
104+
"has_toll": False,
105+
"has_highway": False,
106+
"has_ferry": False,
107+
"min_lat": 42.356887,
108+
"min_lon": -83.275885,
109+
"max_lat": 42.496507,
110+
"max_lon": -82.869245,
111+
"time": 2837.547,
112+
"length": 54.324,
113+
"cost": 4493.543,
114+
},
115+
"shape": "_ojxoAjmny}CpzAuA~EETt_@Tjj@P|]H~OHpRDvGNxLBnBFrDJ|J}EfA_@VsK`EaH~BiFpBqKbE}B~@q@TiC|@iHvB_FpAgGnAqKhBqQpAsIP_KPgQZq_@b@ic@\\sGHwBBiMFuf@~@ic@`@}GJ}TVmMNmOPkCBkSTa]^iDDeEFeGHgFJ_ED}HL_IJmABgCDeA@mLNuCG}`@VgLX}Qb@mIRk_@v@_[p@ka@ZqIDgLH_DD}W`@_A@oJPwEDoKJcVVog@f@aK@sE?aXBqC@}HKoEIe_@m@aCCeMG{F?{S_@wx@yAga@s@cLS_AA}FGwCCurAoAsEA}@Eqb@?_V]oK?egAdB{ENmw@Nif@vBmDHg^~AmPr@yDNcCRgDZeL~@on@nAyWtAsa@zEsIbAiFl@cHj@eDJySn@oFP{\\fAuMR_FHG{FI_IQcQGyFE{IyB}]i@sH}GwlAwD}q@kE{w@gDkaA}Hu{@}@qh@Q_f@?enA@oo@@qbA^uaBb@{eBxAigAt@ge@hAihCz@kr@vDemBjAafA^ay@d@oTDgC`@_XHkKN{OLi\\Cg~AUqh@y@acBm@swABuOPaQp@ob@JqGhAmPrCcVjEg[xGw\\xK_b@fYgt@tF_MrPqYpLwObt@c{@llAitAjUgYjV}[hK}NlSu]dRc\\nn@akA`DoGzIeQ`HwMzZk_A`Lcf@~Lox@vCu`@`B{]pCw_AhBswAl@aiA_@it@yEuvByFcjAyFs~@wCgj@iDsq@m@aMqCsu@eDqzAQkQm@gj@Xct@l@coBt@qhAf@ot@l@u{BOoPWaOg@uOgBg[wCgf@?yOcJqxA_Bm_@{Ck}@wAyk@WuMe@ij@_@_l@MuoAPgmCc@s}AEmPe@gpEk@ojAe@q]mCmg@cEac@}E{YqGa^eJe_@aKc_@gIc\\_B_HoA}FyBiI{g@usB{Uk_AoSmz@mJob@mX{zA{WuzBoOokAiaBazLkS{zAeFye@_A_KYkD_BsSuBiW{AkTgBmXgD_r@kAo^s@cXQsZ]qZEck@\\}iCRgfDfA{cCzDceAOkOn@cKbEyw@bHkoAlC_n@r@__@RgXa@aTIoEG_JsAa`AqCmfBaA_k@y@ye@iBuR_DgOmEcNgG}KmXwZiQeSmFyG}BeCqAkBeB}CoAaDiAwDo@eDe@kEMuBOcDKeSCeFAyBk@a~@_@sQMmF{@y\\OmGk@wWOqG[}NQeIy@i`@{@ka@WeMMkGWmJUyI[sU]wRB_LDaF?oFGeAEw@YsCQmAYaB]uAiAcEuMuZ{@wCcAkD{Lqc@wIo[uEsPsTcx@sEkPwGcV}@aDcAoDuCaKeCeJwEcQcQ_n@uLqb@{A}FiA_F}[ikAsCqK_DcLa@yAaBcGkAgE_BcGuBuHmBeHwAgFyCqK[kAg@oB_IsZcUc{@}Is\\oEoP]uAyEkQ}BuIyAqF{@eD_AiDoGuUgBuGwBeIaUyy@oLcc@mAoE_B_HeCwJiK_`@uH{XuAaFuDeNkAwEmAqEkEiR_@wAwDyN_BgGiBgHQm@uBqHqBkHgBsGwAqF{@}CaBcGcHaWw[_lAkEiPgD_MmCcKeA{DuAkFaAmDyAkFaD_M{BaI{HqYkMue@uMkf@uAcFuE_QeDuLmAmEcAqDoDyMQo@kDsM_Scu@mM}e@gCiJyAqFmCaKiC_JkA}DPkGaAkDiDyI_EiK{Ms\\Wo@eDeI_D{GsCaG}BwDgDsF{DmFiMyP{B}CcMwOaO}S{FyJ}F{LeCuFeC{HiC{JsBsJiBoKyKcr@uEoXaEcRsDkOkP_j@wM_j@cq@}rCkTy~@s_@{{AoJaa@_R{r@uU_|@{kBycH_m@_xBoVw}@wK}`@{VsfAgQav@}Nkt@iEsTqEySsSyt@gB_IiBaK{AgK_LcdAyAsKwF{d@iB{LoLez@{Hmf@Ik@eCmRuA{Kc@_C{@{E}AgGeC}IuCaJoDeHoCoEkEaGaDqDaD}CwDyCaF_DiH}DwKuCaIm@_E[kHJkEX_Gp@wHhBeI~CmFdDuCpBmJxGoHjImQ~QcJjHyYhYeK|KaWnUsMnUmr@~n@sj@lj@s\\v\\cPhOoJfK{j@vj@wvAvkAiiAn{@ke@h^cXlS_\\xVc~BllB_h@vb@sf@h_@ygC`fBwStMkN|HqRdJqJpD{NjEgNzCmN|BkKhAoLz@mOp@q^r@{Yr@qw@rAuoBfMib@xCyPt@ex@tEclFnGar@l@_~ArAk~@jCasC~@e\\g@kVeAmPgA{l@gFgUmBkX}@sQg@qQUue@HsNNoW`@oI\\uAF{G\\up@p@mu@|AqWh@ytAdD{g@pAiLPaq@n@{eAn@mXxAo_@fEwK`C_GzA{YvJ}RrIyOhJcSjMq\\v[}NvPwLfOsFnJgFzJyJbRmOlYaO~\\yJrYqMnj@sC|OmGn]}Glb@yLdy@kLts@_DhNgHtX}KzXmMdYoKrQoOrTyOxSwTtQoOdJiNzHmj@dQgu@hUqQpEe_AxVob@jMyXlJ_uAre@_`A|\\ixBrr@aw@bTekA|XeSd@qc@fH{d@vEwI|@eOvAkIv@aM\\i]y@uJ}BqSuByOuDePaIgMmIgMcNuG{KcIcRc@{AoJ_Z}Da[{Kcy@cAyF}@_TwBep@e@oQSeJOoJQwLQiQkCmd@Gix@?}ZMybAOkvAAuKGed@e@mfDc@i`CQygAM}Pc@aPq@{P}AyVyBqUqC}UiDgT{C{OkDsOeDeNiDkLoDaL}EiNcFcMcGqMaFmKsHiNgKmP}KqOoSgVaMyLuHiGoHcGaf@m[_d@}YshAeu@cbAgo@mVwOeWiPceAgr@eqBgrA}w@ch@iSwMqLiIcJwHoJcIyG_HuF{FoKoMmIcLwEaHqEkHeH_MgG}L{FoMsEiLgEwKgE}NcFaRgEuQyCgOqBoL{A}J}AgLoAgLwAqPcAiN{@uQg@eQW{QIoRmAmmBgAclB_AemBa@ukA_@{s@w@mnA]gp@sAwzB}AapCkAihBe@i|@C{K?oKL{MX{MZiKr@{OhA{QlBsS~AkOxAiLpBoMnBgLnCcNdCcLvCoLzCuKpD}LbE{LhEkLrRmf@dI}R~H_StC}GzMq[xIySbIgSpIyUrFgQpFcRjEaQrD{OhEkSzDaT|CkRxBgOnB{OhB{P`BmQfBcTrAeTr@qQn@aR`@_RLiRAsQMqYMaQ_@mPg@kQw@mS{AaU{AgSiBwQ{AgOaCmR}CuS{DyTiEqTgEiR}DePkGyTaGcS}G_SeIcTiHePqJaTuKsTiO_]oQ}]eO}Z}IcSgDkJkDwKkEmNaDmLeCeKgCsKyE_YiAgJeC}RaAkK}@aLeCa[m@kRScPMoQUoe@]km@y@q{Ag@_bAaAmfBQaXUcWyAkoBuAihBmAmuAMe]Qcp@C}TBqTJoc@Hec@p@ifBA{hAa@}bAq@{o@y@ks@Yya@{@k~@_B{dBmB{tBo@icAY{n@WitAWuoAQ{kAUq|@O_rAk@ekCO}Zk@cq@aAoy@i@}`@cC{wByBwmBo@qe@UwWsAyeAaBivAqA_z@qCkeAeCcv@yG_kBcBef@gAsZ{DagAcDq_AmFc{AwBsl@_B}_@qAwd@aCybAqEodBeCm_AcC{`AiDupAmBqu@{@c_@cAe\\eAec@m@s]e@uZ]g[[ii@]{i@{@ghBc@_iAgAumBYor@_@ujAa@ky@i@{lAGiPy@wdBy@emBY{h@YcQi@}Ou@wRcAmRyAaVyCkc@mEcq@aC__@eAgQs@mOe@aNg@cSWaRWuMg@oSk@qq@QkQ}@}bAs@w|@GwP@iQRwR`@iRh@{Pr@wOjIc|AlCgf@x@{NxAgZz@}YZuOHiOF}OAeRSeW{@chA{@}hAa@_h@c@ce@Q}RMiq@K}Vg@{e@_AyhAU}Ng@kR}@uUUoGaAaT`@md@]wSs@i\\y@ic@JePf@gPl@kKr@}JfAwKtA}NjAqNTaIEwHe@yIyBm^eBiHqAcFaMci@iAoFmAwHcAuGSsBe@eFo@{J_@oIa@us@EeFaA}rBEqIMw`@KaRGmGYie@KkRsBqO]in@KwPKuMW_MAgK}Bgx@a@kYWgf@Mg]Yge@[gh@k@aqAm@ujASol@IcSCaIEsIAoCAu@EcII{Kk@o_@KoHKyFyA_f@]_d@nCsL^wMLoKAwOuCmzAw@cg@m@}^eFyxBcAsn@YsRe@g\\SwIQuGiAme@Q}Gk@mPBoEy@oYo@}TkDgoAiAkf@y@_^e@oSg@aUsAqk@}Ce}@{AyMoBwUyCcGg@qLa@sNeAka@y@q[aAw]{@mS`Q|G|@VzC|@lJnAlF\\hBLrJhAtC\\dRjCt\\rD|G|@lNpAvD\\nVhCbMz@jt@rDrETp\\`@~TGxECfGLlv@m@xd@GvSCpNGn[M~d@g@r\\InCArIIfJI|v@c@bQMvKEbOE|GQzDK~CDb`@KnN@vQLvIFxOEvTf@|REx@Cl\\XtBBnHFrY_@~MHdEAtRCpMAtKL~DHbG?zBAdB?~F?pD?tZAbI?hl@VxLFtQAp^AlD?dWBrNAhQ`@vABzI?zD@zB@t@?lL@|MFjP?xVBxE@bGFhK?|E?pJCvBA~D?zFIx@C`Rm@lDQjEWjM{@dL}@|_@{C`QgArGa@jHm@nMgAxHeAtJ{A`HiAxDi@zDy@~G}AdEaAvHkBfEmA`KsCdZwI~DiAxYoIvF]z@YfJ{C`IkClTiHzM{Gxm@}Z~@k@hKcFpBaAzBiAr@[rQkIdCmAbLiF`[oNlNwG|TiK|FmCbAg@bGqCfOcHhIwD`FqC~PcHdAc@jDeBvFsCdS_Kp^yR|NaKzDoChOwK\\WvL_JnKcIxFiElk@yb@b[eU`NuKzLyJhl@oe@dHgErGcDhH_DrI{ChMwCx@SfHoBrEVvZiC|e@eIdj@mM|RcI~KiHtEuChLwIp\\e]pMgRjM}TdMaZnGoRbQsj@~Xu~@vGqTbFuPhQko@`FmTtAkJ~BmOlDiPdJih@_G}EuRsGiBWwUmDqLa@k^bAeNw@qPkBwLuGiJ_NmD{Ky@wNdCuPrPcX~^_l@vNgd@rLo\\rImNdVgP`LuHzMyH",
116+
}
117+
],
118+
"summary": {
119+
"has_time_restrictions": False,
120+
"has_toll": False,
121+
"has_highway": True,
122+
"has_ferry": False,
123+
"min_lat": 42.356887,
124+
"min_lon": -83.275885,
125+
"max_lat": 42.496507,
126+
"max_lon": -82.869245,
127+
"time": 2837.547,
128+
"length": 54.324,
129+
"cost": 4493.543,
130+
},
131+
"status_message": "Found route between points",
132+
"status": 0,
133+
"units": "kilometers",
134+
"language": "en-US",
135+
}
136+
}
137+
],
138+
"id": "some_route",
139+
},
51140
"isochrones": {
52141
"type": "FeatureCollection",
53142
"bbox": [8.688474, 8.681829, 49.42577, 49.420176],
@@ -1166,6 +1255,12 @@
11661255
"somerandom": "option",
11671256
"units": "kilometers",
11681257
},
1258+
"alternatives": {
1259+
"locations": [[-83.271400, 42.358528], [-82.749855, 42.43892]],
1260+
"profile": "auto",
1261+
"id": "some_route",
1262+
"alternatives": 1,
1263+
},
11691264
"isochrones": {
11701265
"locations": PARAM_POINT,
11711266
"options": {
@@ -1303,6 +1398,14 @@
13031398
"somerandom": "option",
13041399
"units": "kilometers",
13051400
},
1401+
"alternatives": {
1402+
"locations": [{"lat": 42.358528, "lon": -83.271400}, {"lat": 42.43892, "lon": -82.749855}],
1403+
"costing": "auto",
1404+
"units": "kilometers",
1405+
"id": "some_route",
1406+
"narrative": False,
1407+
"alternates": 1,
1408+
},
13061409
"isochrones": {
13071410
"locations": [{"lat": PARAM_POINT[1], "lon": PARAM_POINT[0]}],
13081411
"costing": "auto",

0 commit comments

Comments
 (0)