curl -s "https://maps.googleapis.com/maps/api/directions/json?origin=43.651070,-79.347015&destination=45.501690,-73.567253&mode=bicycling&key=YourKey"
#wget -qO- "https://maps.googleapis.com/maps/api/directions/json?origin=43.651070,-79.347015&destination=45.501690,-73.567253&mode=bicycling&key=YourKey"
origin
origin=纬度,经度
destination
destination=纬度,经度
mode
driving:驾车
walking:步行
bicycling:骑行
transit:公共交通
{
"geocoded_waypoints" :
[
{
"geocoder_status" : "OK",
"place_id" : "ChIJFe-LBhLL1IkRuVeTL_UvHtU",
"types" :
[
"street_address"
]
},
{
"geocoder_status" : "OK",
"place_id" : "ChIJDQhsvi44K4gR7ueA_1qaYPk",
"types" :
[
"street_address"
]
}
],
"routes" :
[
{
"bounds" :
{
"northeast" :
{
"lat" : 43.6555158,
"lng" : -79.3469623
},
"southwest" :
{
"lat" : 43.6146554,
"lng" : -79.56953109999999
}
},
"copyrights" : "Map data ©2024 Google",
"legs" :
[
{
"distance" :
{
"text" : "23.8 km",
"value" : 23807
},
"duration" :
{
"text" : "24 mins",
"value" : 1468
},
"end_address" : "75 Applewood Ln, Etobicoke, ON M9C 0C1, Canada",
"end_location" :
{
"lat" : 43.6510645,
"lng" : -79.56727619999999
},
"start_address" : "337 Gardiner Expy, Toronto, ON M4M, Canada",
"start_location" :
{
"lat" : 43.6510919,
"lng" : -79.3469623
},
"steps" :
[
{
"distance" :
{
"text" : "2.1 km",
"value" : 2056
},
"duration" :
{
"text" : "6 mins",
"value" : 331
},
"end_location" :
{
"lat" : 43.6457503,
"lng" : -79.37006649999999
},
"html_instructions" : "Head \u003cb\u003enorthwest\u003c/b\u003e on \u003cb\u003eLake Shore Blvd E\u003c/b\u003e toward \u003cb\u003eLake Shore Blvd E\u003c/b\u003e",
"polyline" :
{
"points" : "irliGnmhcNMJC@FRPj@Nf@@BNf@@@Rt@b@|ADR@BHVZz@@BHV@D^bAZx@f@xAPf@Rr@Xz@Vt@Jb@H\\DRHXh@nCBJBLFVNh@HR@BNb@f@zAHXDPBT@J@J@L?H?JAHAVANAPCLCLO\\Wh@QXSZKJY\\M\\O`@ITETGVCNAF?P@V?RBP@J^fBFXF\\BFHNNn@Ln@v@dDDN\\~AZlA?BLd@b@hBHZHZf@bCd@pBXzAb@`CRjBVbBH\\n@fGDTT|A\\dCHp@^jCR~A\\nCPtAD^"
},
"start_location" :
{
"lat" : 43.6510919,
"lng" : -79.3469623
},
"travel_mode" : "DRIVING"
},
{
"distance" :
{
"text" : "14.5 km",
"value" : 14543
},
"duration" :
{
"text" : "12 mins",
"value" : 743
},
"end_location" :
{
"lat" : 43.61581169999999,
"lng" : -79.5373113
},
"html_instructions" : "Turn \u003cb\u003eright\u003c/b\u003e to merge onto \u003cb\u003eFrederick G. Gardiner Expy\u003c/b\u003e/\u003cwbr/\u003e\u003cb\u003eGardiner Expy W\u003c/b\u003e",
"maneuver" : "ramp-right",
"polyline" :
{
"points" : "}pkiG|}lcNM\\?BAB?@?@?J@XR|ATdBZhCHn@R|AFf@P`BFn@@?Hn@F`@Lh@?@Jd@Rv@Rn@@Bd@pA@?d@nABF@DBBPJZz@Zz@HPHRjApC\\x@Zz@JTf@lAr@`BDPFNXr@JXHZd@bAL\\d@fARh@Rf@`@dA^~@j@jAN`@\\x@JZv@vC~@xEDXRtAV~ADTD\\Hd@Fh@Ff@DXJn@Hn@Hx@Hx@L`A@NDXBXD^LtA@FFn@Fn@B`@P`BJjAD\\BZFn@H~@Db@N|AN|AHv@Fn@JnAJdAJdAFr@@FBT`@lED^B^@LJdAB^Db@B^B`@Bl@Br@@Z@`@?X?f@?b@?f@Al@An@CzAC|AAVCbACxAAV?VA`@A\\?T?F?R?b@?`A@`@?XBv@@n@Bh@HlB@V@VBj@FhAD~@Dn@Bf@HfBD`AD~@FfBBx@Bd@@t@Bv@@`A@v@?v@@d@?t@?zA?z@?x@?t@@\\?`@@^@\\@Z@V@T?NBT@Z@L@LD`@B^BTFd@BRD\\Fb@N~@Nv@VxANv@Hf@RfAZ`BRfAZfB@BNv@`@xBBPRdAP~@DXLr@Hb@Hb@Hd@RbARhABLBNH\\BNF^H`@DXb@|BF\\RbAdBtJZhBJl@d@bC@FDXDRRfA?@Hb@P`ADNN~@Pz@VzAn@lDd@bCBLLt@NhA@@BXDZBVB^D`@@ZBX@P@h@@b@@f@@Z?h@?\\A`@AXAb@Cp@ATAPC\\I|@E^ANCNAJGd@Mp@Kp@CJGVKf@K^Qn@CHQl@M\\Sl@Qj@Sl@M\\EN_@hAOd@i@~AaAzCu@zB_@jAIRK\\ITGRELITMb@CFEJQh@ENIVABuAfEELu@|Bm@jBUr@Qh@CHCFITCLELKXMd@Ux@Of@Kd@IZIXMj@K`@Kh@Or@Q|@GZERQ`AMv@A?StAQlAGZ?BGd@G\\K~@AHIh@Eb@E`@OxAIt@Ed@IdAIbAEh@C\\C\\G`AGfAEfAGlACr@C~@AZ?LCr@ARAb@?VALAh@?TA`@?J?L?TArAAX?P?`@?Z?T?L@l@?f@?@@X?T?H@r@@N?R@P?H@T@T@X@R@RD~@@V@LDx@?H@PBT@L@VFv@DZ?F@JBTHz@D\\Fn@Fj@Hr@Db@BJ@LJv@Fb@BLBRDVFb@@HHd@Hh@RbABR@FBHNt@Ln@Jb@BPRz@Rv@Jb@BHPr@h@rBBJb@vA|AxEDJbAtCPh@Ph@FPJZJZFRFPDJHT@BTj@JTDJ@BDFl@tA@?Rb@LXXf@Nb@hAvBJTLVNVLVLVp@pABFZl@JVLVJVLVJVJVJXJVJVJXXp@HTLXJVLVJVDJFLLTJTLTNVLTNVLTNR\\j@\\h@NVl@|@l@|@z@rA^h@^h@NRNRX`@DF^f@NR^f@d@p@HJNRNRNT\\d@LPNRPTPVLRPTJRNTNVLTZj@JVLVTl@LXJZJXHXHXHZFXDNBJFZFZFZFXF\\Lv@DZFZJt@Lv@RtA@B@JV`Bb@rCRrAF\\Lv@T~APhAF\\ZpBFf@Jp@FZN`APhARtATtADVRrAhApHPlAHh@L|@DV@FN|@D\\t@|Eb@xC`@jCRrAFVBTTvA^fCRrARnAPpAJt@Jt@Jv@Lv@\\fCFf@BNDZJt@DZJv@Jv@BVDZJv@Jv@Jt@TlBJv@Jt@?BTdBFj@X|BHt@ZjCdAfJn@tFdCjTdAdJlAjKHz@PvAp@|FNrAdBjOfBlOFn@ZnCP|AJt@^bD^`Dz@vHJ~@L~@l@jFf@jEFb@Hv@v@~Gx@fHNnAVxB"
},
"start_location" :
{
"lat" : 43.6457503,
"lng" : -79.37006649999999
},
"travel_mode" : "DRIVING"
},
{
"distance" :
{
"text" : "1.5 km",
"value" : 1489
},
"duration" :
{
"text" : "1 min",
"value" : 65
},
"end_location" :
{
"lat" : 43.6187202,
"lng" : -79.5524764
},
"html_instructions" : "Take exit \u003cb\u003e139\u003c/b\u003e for \u003cb\u003eON-427\u003c/b\u003e toward \u003cb\u003eAirport\u003c/b\u003e/\u003cwbr/\u003e\u003cb\u003eON-401\u003c/b\u003e",
"maneuver" : "ramp-right",
"polyline" :
{
"points" : "yueiGdsmdNKh@?@JfAFr@L|ADl@NrBDd@Db@HhANhC@RXvEp@bKLzBLtBFhAH~ADz@FzAFdC@P?D?R?V?T?T?TARAJ?JAVCTE\\E`@EREVMd@GTGPITGNIRKPGNGHEHGJMNW\\MNKHEBKJIHSL[Tg@Xu@`@{@f@]Rg@Xq@^g@Vk@Xo@X[NOHMFOF]LOFKN"
},
"start_location" :
{
"lat" : 43.61581169999999,
"lng" : -79.5373113
},
"travel_mode" : "DRIVING"
},
{
"distance" :
{
"text" : "1.0 km",
"value" : 1030
},
"duration" :
{
"text" : "1 min",
"value" : 39
},
"end_location" :
{
"lat" : 43.627547,
"lng" : -79.5563578
},
"html_instructions" : "Continue onto \u003cb\u003eON-427 N\u003c/b\u003e",
"polyline" :
{
"points" : "_hfiG~qpdNeBl@WH]Lg@Pm@R_@Lg@PoAb@_AZSHSFi@Ri@Pc@NWJsC~@s@Vs@V_AZSHk@Pg@PUHUHSFQF}@ZUHSFUHUHe@NWHSHk@PsAb@i@N{@Xq@TODw@Tg@P"
},
"start_location" :
{
"lat" : 43.6187202,
"lng" : -79.5524764
},
"travel_mode" : "DRIVING"
},
{
"distance" :
{
"text" : "1.7 km",
"value" : 1720
},
"duration" :
{
"text" : "1 min",
"value" : 63
},
"end_location" :
{
"lat" : 43.6424748,
"lng" : -79.56157499999999
},
"html_instructions" : "Take the \u003cb\u003eBurnhamthorpe Rd\u003c/b\u003e/\u003cwbr/\u003e\u003cb\u003eRathburn Rd\u003c/b\u003e exit toward \u003cb\u003eDundas St\u003c/b\u003e/\u003cwbr/\u003e\u003cb\u003eValhalla Rd\u003c/b\u003e",
"maneuver" : "ramp-right",
"polyline" :
{
"points" : "e_hiGfjqdNWIoBh@MDQDOB}@V_@FODMDQDMBODOBODODKBUFi@LUDSDUFUDUDQDA?YFUBM@A?C?[DM@I?[BI?M@E?Y@_@@O@U@O@G?G?GAC?IFA?A@C@A?E?E@M@M@s@HWBA@YD[HUDIB_@Jo@N_@Je@Lw@Tk@NSHG@SH_@LKBYJ[J_@NE@o@Tc@PQFaA`@SFOFMDGBUHKDe@Ns@Tq@TGBEBEDGHcBf@MDwBl@a@Jc@JyBl@_Cp@kAZ[JC?SFSFYJa@JyBp@iA\\MB"
},
"start_location" :
{
"lat" : 43.627547,
"lng" : -79.5563578
},
"travel_mode" : "DRIVING"
},
{
"distance" :
{
"text" : "1.0 km",
"value" : 990
},
"duration" :
{
"text" : "1 min",
"value" : 39
},
"end_location" :
{
"lat" : 43.6510058,
"lng" : -79.56507239999999
},
"html_instructions" : "Take the \u003cb\u003eRathburn Road\u003c/b\u003e ramp",
"polyline" :
{
"points" : "m|jiGxjrdNKJODc@NeAZe@NoBn@}@Xm@PKD_@LkBl@{Ah@o@P_AXcBj@WDQFQFE@UHSF[FuDjAuAb@wBr@c@BODODo@PODcAZs@Ra@LE@k@N"
},
"start_location" :
{
"lat" : 43.6424748,
"lng" : -79.56157499999999
},
"travel_mode" : "DRIVING"
},
{
"distance" :
{
"text" : "0.7 km",
"value" : 734
},
"duration" :
{
"text" : "1 min",
"value" : 42
},
"end_location" :
{
"lat" : 43.6544871,
"lng" : -79.56674699999999
},
"html_instructions" : "Take the \u003cb\u003eRathburn Rd W\u003c/b\u003e ramp",
"polyline" :
{
"points" : "yqliGt`sdNmDxAKD_@Ps@ZKDQHSHWLQHWLq@Zi@VmDzAoAd@MDKBKBE@E@G@M@E?C?E?E?CAGAA?GCCACACCEECCCCAAAAAECCCE?AAECICK?EAC?A?EAC?E?E?E?E?I@I@E?E@E@E@G@C@C@E@CBEBCDEBEBABC@?BCDADCFADAD?B?B?D@@?B?DBH@@@BBHDDFFFBFDFDN@@HV@FFV@H@@NX"
},
"start_location" :
{
"lat" : 43.6510058,
"lng" : -79.56507239999999
},
"travel_mode" : "DRIVING"
},
{
"distance" :
{
"text" : "0.1 km",
"value" : 115
},
"duration" :
{
"text" : "1 min",
"value" : 8
},
"end_location" :
{
"lat" : 43.6541775,
"lng" : -79.56810999999999
},
"html_instructions" : "Merge onto \u003cb\u003eRathburn Rd\u003c/b\u003e",
"maneuver" : "merge",
"polyline" :
{
"points" : "qgmiGdksdNXfBBX@BDXVnB"
},
"start_location" :
{
"lat" : 43.6544871,
"lng" : -79.56674699999999
},
"travel_mode" : "DRIVING"
},
{
"distance" :
{
"text" : "0.8 km",
"value" : 754
},
"duration" :
{
"text" : "1 min",
"value" : 46
},
"end_location" :
{
"lat" : 43.6507224,
"lng" : -79.5661789
},
"html_instructions" : "Take the \u003cb\u003eON-427 S\u003c/b\u003e ramp",
"maneuver" : "ramp-right",
"polyline" :
{
"points" : "semiGtssdN?f@?F@BDl@Dd@?L?HC\\AHAHAFGJGJKLEFGDKFODK?G?IAGCGCGEGGEGEECGCGCIAGAEAGAK?K?K?C?E@G@I@I@GBKBG@ADKHIHKDEDEHIPKhBiAh@QVKTKFC^c@x@]j@U`@QDApAg@|Ak@pBu@dBm@"
},
"start_location" :
{
"lat" : 43.6541775,
"lng" : -79.56810999999999
},
"travel_mode" : "DRIVING"
},
{
"distance" :
{
"text" : "0.2 km",
"value" : 192
},
"duration" :
{
"text" : "1 min",
"value" : 16
},
"end_location" :
{
"lat" : 43.64975030000001,
"lng" : -79.56728489999999
},
"html_instructions" : "Take the \u003cb\u003eHoliday Drive\u003c/b\u003e exit",
"maneuver" : "ramp-right",
"polyline" :
{
"points" : "_pliGrgsdNTDH?NE^GBAB?BAHAJ?L?RBB@@?DBDBHFBB@BBBBFDL@D@F?D?@@H?HAHA`@CbA?V"
},
"start_location" :
{
"lat" : 43.6507224,
"lng" : -79.5661789
},
"travel_mode" : "DRIVING"
},
{
"distance" :
{
"text" : "0.2 km",
"value" : 184
},
"duration" :
{
"text" : "1 min",
"value" : 76
},
"end_location" :
{
"lat" : 43.6510645,
"lng" : -79.56727619999999
},
"html_instructions" : "Turn \u003cb\u003eright\u003c/b\u003e onto \u003cb\u003eApplewood Ln\u003c/b\u003e",
"maneuver" : "turn-right",
"polyline" :
{
"points" : "}iliGnnsdN?LOBKBGB{@ZG_@I_@CQCKCEEEE?G?A?C@QFIBOFQFSHWFCB"
},
"start_location" :
{
"lat" : 43.64975030000001,
"lng" : -79.56728489999999
},
"travel_mode" : "DRIVING"
}
],
"traffic_speed_entry" : [],
"via_waypoint" : []
}
],
"overview_polyline" :
{
"points" : "irliGnmhcNQLX~@b@tA~@jDp@nBdB|EvAlEd@nBx@`Ej@dBp@tBHf@Dd@A^IfASj@i@bA_@f@Y\\M\\Yv@Ml@EV@h@Bd@`@rBNv@LVzAtGfD|N~@lEb@`CRjB`@`Ct@|G|A`LhAdJOf@?LTvBnA|J`@xD`@zBr@nCnAdDDLTNjA|CpC|GhBpEtAlDzAvD|BrFh@tAv@vC~@xEXnB\\tB^tCd@rDx@|HbAxK`Dp]XhDL~C@fCG`FSbK?tADtDP~ERlEX`GTfGHfF@nF@hEDzBRlDRnBl@xDrCvOxBzLjH~`@hG~\\b@zCRtBHpBDpCE|BKvBU|Bc@tCc@jBu@dCgDdKkGpRoFnP_@jA_AlDm@bCu@vDuApIcAvIc@dFUfDYpGI|CIjEC`FBtDFhCVvFVrDt@nHn@rEbAxFp@`Dt@xCl@~B`CpHlBtF`AtCrBrEf@`AxAzCv@|A~A~Cr@~AjBzEzAfDz@zAxA~BfGbJ|HvK|@vAbApBz@|Bd@hBXrAd@jCvAlJfG|`@vItk@jCxQxA|KzAtLrEr`@bWnzBrFze@f@hEKj@`@xE`@jFt@~LtA~T^|J@bAAtAGdAWjBg@bBe@dAc@n@w@z@eAx@wDvBmDjBiBz@}@\\KNeBl@u@V}CdAwDpAkMlEwFlBsEzAkFbBgAZg@PWIoBh@_@J}Bh@yBh@}Dz@_ALo@FmCJe@BO?KAKFMBuANoAToBd@iD~@oAb@mE|AcEzAsBr@MNqBl@wHrBkFxAcBf@cEnAMBKJs@TkBj@gF`BwGvBcDdAi@LaAZ[FuDjAmEvAs@H_AViDbAq@PyD~AqB|@uAn@{Ar@}F`Ck@Na@DSAUGQOIMIQI_@Am@Jm@HSPQNIXGN@TFZXP`@T`APZ\\`CF\\VnB?f@@JJrA?VEf@CPOVQTSL[DG?QEOIW]K_@C_@@]Hg@T_@^a@zBuA`A]\\O^c@x@]lAg@vAi@nEaBdBm@TDXEb@I\\Cf@DXRN\\BTA~@CzA?LOBSF{@ZG_@Mq@GQKEI?o@TaA\\"
},
"summary" : "Frederick G. Gardiner Expy/Gardiner Expy W",
"warnings" : [],
"waypoint_order" : []
}
],
"status" : "OK"
}
解密:
public static List<LatLng> decode(final String encodePath) {
final List<LatLng> path = new ArrayList<LatLng>();
if (StringUtils.isEmpty(encodePath)) {
return path;
}
int len = encodePath.length();
int index = 0;
int lat = 0;
int lng = 0;
while (index < len) {
int result = 1;
int shift = 0;
int b;
do {
b = encodePath.charAt(index++) - 63 - 1;
result += b << shift;
shift += 5;
} while (b >= 0x1f);
lat += (result & 1) != 0 ? ~(result >> 1) : (result >> 1);
result = 1;
shift = 0;
do {
b = encodePath.charAt(index++) - 63 - 1;
result += b << shift;
shift += 5;
} while (b >= 0x1f);
lng += (result & 1) != 0 ? ~(result >> 1) : (result >> 1);
path.add(new LatLng(lat * 1e-5, lng * 1e-5));
}
return path;
}
加密:
public static String encode(final List<LatLng> path) {
long lastLat = 0;
long lastLng = 0;
final StringBuffer result = new StringBuffer();
for (final LatLng point : path) {
long lat = Math.round(point.getLat() * 1e5);
long lng = Math.round(point.getLng() * 1e5);
long dLat = lat - lastLat;
long dLng = lng - lastLng;
encode(dLat, result);
encode(dLng, result);
lastLat = lat;
lastLng = lng;
}
return result.toString();
}
public static String encode(final LatLng point) {
long lastLat = 0;
long lastLng = 0;
final StringBuffer result = new StringBuffer();
long lat = Math.round(point.getLat() * 1e5);
long lng = Math.round(point.getLng() * 1e5);
long dLat = lat - lastLat;
long dLng = lng - lastLng;
encode(dLat, result);
encode(dLng, result);
lastLat = lat;
lastLng = lng;
return result.toString();
}
private static void encode(long v, StringBuffer result) {
v = v < 0 ? ~(v << 1) : v << 1;
while (v >= 0x20) {
result.append(Character.toChars((int) ((0x20 | (v & 0x1f)) + 63)));
v >>= 5;
}
result.append(Character.toChars((int) (v + 63)));
}