server-side-google-maps 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,122 @@
1
+ require 'spec'
2
+
3
+ module ServerSideGoogleMaps
4
+ describe(Directions) do
5
+ describe('#get') do
6
+ it('should use proper URL') do
7
+ Server.should_receive(:get).with('/maps/api/directions/json', :query => { :origin => 'Montreal,QC', :destination => 'Ottawa,ON', :sensor => false })
8
+ Directions.get(:origin => 'Montreal,QC', :destination => 'Ottawa,ON')
9
+ end
10
+ end
11
+
12
+ describe('#initialize') do
13
+ it('should query with :origin and :destination when given strings') do
14
+ Directions.should_receive(:get).with(:origin => 'Montreal,QC', :destination => 'Ottawa,ON', :mode => :driving)
15
+ Directions.new('Montreal,QC', 'Ottawa,ON')
16
+ end
17
+
18
+ it('should query with :origin and :destination when given points') do
19
+ Directions.should_receive(:get).with(:origin => '45.50867,-73.55368', :destination => '45.4119,-75.69846', :mode => :driving)
20
+ Directions.new([45.5086700,-73.5536800], [45.4119000,-75.6984600])
21
+ end
22
+
23
+ it('should pass :mode') do
24
+ Directions.should_receive(:get).with(:origin => '1', :destination => '2', :mode => :bicycling)
25
+ Directions.new('1', '2', :mode => :bicycling)
26
+ end
27
+
28
+ it('should not query Google with :direct and lat-lng string inputs') do
29
+ Directions.should_not_receive(:get)
30
+ Directions.new('45.5086700,-73.5536800', '45.4119000,-75.6984600', :mode => :direct)
31
+ end
32
+
33
+ it('should not query Google with :direct and lat-lng inputs') do
34
+ Directions.should_not_receive(:get)
35
+ Directions.new([45.5086700,-73.5536800], [45.4119000,-75.6984600], :mode => :direct)
36
+ end
37
+ end
38
+
39
+ context('with lat-lng string inputs and :mode => :direct') do
40
+ it('should calculate proper distance') do
41
+ directions = Directions.new('45.5086700,-73.5536800', '45.4119000,-75.6984600', :mode => :direct)
42
+ directions.distance.should == 167512
43
+ end
44
+ end
45
+
46
+ context('with a mocked return value') do
47
+ class Parser < HTTParty::Parser
48
+ public_class_method(:new)
49
+ end
50
+
51
+ before(:each) do
52
+ Directions.stub(:get) do
53
+ data = File.read(File.dirname(__FILE__) + '/files/directions-Montreal,QC-to-Ottawa,ON.txt')
54
+ parser = Parser.new(data, :json)
55
+ parser.parse
56
+ end
57
+
58
+ directions = Directions.new('Montreal,QC', 'Ottawa,ON')
59
+ end
60
+
61
+ it('should have origin_input and destination_input') do
62
+ directions = Directions.new('Montreal,QC', 'Ottawa,ON')
63
+ directions.origin_input.should == 'Montreal,QC'
64
+ directions.destination_input.should == 'Ottawa,ON'
65
+ end
66
+
67
+ it('should have (server-supplied) origin_address and destination_input') do
68
+ directions = Directions.new('Montreal,QC', 'Ottawa,ON')
69
+ directions.origin_address.should == 'Montreal, QC, Canada'
70
+ directions.destination_address.should == 'Ottawa, ON, Canada'
71
+ end
72
+
73
+ it('should have origin_point and destination_point') do
74
+ directions = Directions.new('Montreal,QC', 'Ottawa,ON')
75
+ directions.origin_point.should == [ 45.5086700, -73.5536800 ]
76
+ directions.destination_point.should == [ 45.4119000, -75.6984600 ]
77
+ end
78
+
79
+ it('should have an "OK" status') do
80
+ directions = Directions.new('Montreal,QC', 'Ottawa,ON')
81
+ directions.status.should == 'OK'
82
+ end
83
+
84
+ it('should have the proper points') do
85
+ directions = Directions.new('Montreal,QC', 'Ottawa,ON')
86
+ points = directions.points
87
+ points.length.should == 138
88
+ points[0].should == [45.50867, -73.55368]
89
+ points[1].should == [45.50623, -73.55569]
90
+ points[-1].should == [45.4119, -75.69846]
91
+ end
92
+
93
+ it('should have the proper distance') do
94
+ directions = Directions.new('Montreal,QC', 'Ottawa,ON')
95
+ distance = directions.distance
96
+ distance.should == 199901
97
+ end
98
+
99
+ it('should suggest a straight line, with :direct') do
100
+ directions = Directions.new('Montreal,QC', 'Ottawa,ON', :mode => :direct)
101
+ directions.points.should == [[45.50867, -73.55368], [45.4119, -75.69846]]
102
+ directions.distance.should == 167512
103
+ end
104
+
105
+ it('should suggest normal route if :find_shortcuts shortcuts are not short enough') do
106
+ directions = Directions.new('Montreal,QC', 'Ottawa,ON', :find_shortcuts => [{ :factor => 0.5, :mode => :direct }])
107
+ directions.points.length.should > 2
108
+ directions.distance.should == 199901
109
+ end
110
+
111
+ it('should suggest a shortcut if :find_shortcuts finds a shortcut') do
112
+ directions = Directions.new('Montreal,QC', 'Ottawa,ON', :find_shortcuts => [{ :factor => 0.95, :mode => :direct }])
113
+ directions.points.length.should == 2
114
+ directions.distance.should == 167512
115
+ end
116
+
117
+ it('should correct the user if :find_shortcuts is not an Array') do
118
+ lambda { Directions.new('Montreal,QC', 'Ottawa,ON', :find_shortcuts => { :factor => 0.5, :mode => :direct }) }.should(raise_error(ArgumentError))
119
+ end
120
+ end
121
+ end
122
+ end
@@ -0,0 +1,344 @@
1
+ {
2
+ "status": "OK",
3
+ "routes": [ {
4
+ "summary": "Autoroute 40 W and ON-417 W",
5
+ "legs": [ {
6
+ "steps": [ {
7
+ "travel_mode": "DRIVING",
8
+ "start_location": {
9
+ "lat": 45.5086700,
10
+ "lng": -73.5536800
11
+ },
12
+ "end_location": {
13
+ "lat": 45.5062300,
14
+ "lng": -73.5556900
15
+ },
16
+ "polyline": {
17
+ "points": "elwtGn}|_MfNpK",
18
+ "levels": "BB"
19
+ },
20
+ "duration": {
21
+ "value": 20,
22
+ "text": "1 min"
23
+ },
24
+ "html_instructions": "Head \u003cb\u003esouthwest\u003c/b\u003e on \u003cb\u003eRue Notre-Dame E\u003c/b\u003e toward \u003cb\u003ePlace Jacques Cartier\u003c/b\u003e",
25
+ "distance": {
26
+ "value": 313,
27
+ "text": "0.3 km"
28
+ }
29
+ }, {
30
+ "travel_mode": "DRIVING",
31
+ "start_location": {
32
+ "lat": 45.5062300,
33
+ "lng": -73.5556900
34
+ },
35
+ "end_location": {
36
+ "lat": 45.5068900,
37
+ "lng": -73.5572800
38
+ },
39
+ "polyline": {
40
+ "points": "}|vtG`j}_McC|H",
41
+ "levels": "BB"
42
+ },
43
+ "duration": {
44
+ "value": 25,
45
+ "text": "1 min"
46
+ },
47
+ "html_instructions": "Take the 1st \u003cb\u003eright\u003c/b\u003e onto \u003cb\u003eBoulevard Saint-Laurent\u003c/b\u003e",
48
+ "distance": {
49
+ "value": 144,
50
+ "text": "0.1 km"
51
+ }
52
+ }, {
53
+ "travel_mode": "DRIVING",
54
+ "start_location": {
55
+ "lat": 45.5068900,
56
+ "lng": -73.5572800
57
+ },
58
+ "end_location": {
59
+ "lat": 45.5082100,
60
+ "lng": -73.5563400
61
+ },
62
+ "polyline": {
63
+ "points": "aawtG~s}_MgG{D",
64
+ "levels": "BB"
65
+ },
66
+ "duration": {
67
+ "value": 40,
68
+ "text": "1 min"
69
+ },
70
+ "html_instructions": "Take the 1st \u003cb\u003eright\u003c/b\u003e onto \u003cb\u003eRue Saint Antoine E\u003c/b\u003e",
71
+ "distance": {
72
+ "value": 164,
73
+ "text": "0.2 km"
74
+ }
75
+ }, {
76
+ "travel_mode": "DRIVING",
77
+ "start_location": {
78
+ "lat": 45.5082100,
79
+ "lng": -73.5563400
80
+ },
81
+ "end_location": {
82
+ "lat": 45.5071400,
83
+ "lng": -73.5585500
84
+ },
85
+ "polyline": {
86
+ "points": "iiwtGbn}_MuA]g@P}@xBAn@^d@fHnEjAd@",
87
+ "levels": "B???@??B"
88
+ },
89
+ "duration": {
90
+ "value": 61,
91
+ "text": "1 min"
92
+ },
93
+ "html_instructions": "Take the \u003cb\u003eAutoroute 720 O\u003c/b\u003e ramp on the \u003cb\u003eleft\u003c/b\u003e",
94
+ "distance": {
95
+ "value": 404,
96
+ "text": "0.4 km"
97
+ }
98
+ }, {
99
+ "travel_mode": "DRIVING",
100
+ "start_location": {
101
+ "lat": 45.5071400,
102
+ "lng": -73.5585500
103
+ },
104
+ "end_location": {
105
+ "lat": 45.4728800,
106
+ "lng": -73.5967400
107
+ },
108
+ "polyline": {
109
+ "points": "sbwtG|{}_M`TtPjMlIpCnAz@TvJ`@dBXjC`AfBjAfA`AzAtB~@fBr@lBtHhYvClH|DbG~StYrHhLvSj`@|_@~r@lEjErF|BdU`H",
110
+ "levels": "B?@??????@????@??@?@??B"
111
+ },
112
+ "duration": {
113
+ "value": 202,
114
+ "text": "3 mins"
115
+ },
116
+ "html_instructions": "Merge onto \u003cb\u003eAutoroute 720 W\u003c/b\u003e",
117
+ "distance": {
118
+ "value": 5006,
119
+ "text": "5.0 km"
120
+ }
121
+ }, {
122
+ "travel_mode": "DRIVING",
123
+ "start_location": {
124
+ "lat": 45.4728800,
125
+ "lng": -73.5967400
126
+ },
127
+ "end_location": {
128
+ "lat": 45.5019000,
129
+ "lng": -73.6638100
130
+ },
131
+ "polyline": {
132
+ "points": "olptGrje`MPPrD~A|A|AtAhBhAdC~@`Dv@nGFjEIzAg@nDiAnEeFnPsDpKeA~ByKx[uEjKoErIaCdDwGzFaClC{AbCyAjDmJ~WcJrXqItUiFrOOLwWrv@uGlSGp@eDtKqA|CeZbj@QHyG~LqApBuCnD{DjD",
133
+ "levels": "B???@??@????@???@?????@?????????@?????B"
134
+ },
135
+ "duration": {
136
+ "value": 378,
137
+ "text": "6 mins"
138
+ },
139
+ "html_instructions": "Take exit \u003cb\u003e1N\u003c/b\u003e to merge onto \u003cb\u003eAutoroute Décarie/Autoroute 15 N\u003c/b\u003e toward \u003cb\u003eSaint-Jérôme\u003c/b\u003e",
140
+ "distance": {
141
+ "value": 6611,
142
+ "text": "6.6 km"
143
+ }
144
+ }, {
145
+ "travel_mode": "DRIVING",
146
+ "start_location": {
147
+ "lat": 45.5019000,
148
+ "lng": -73.6638100
149
+ },
150
+ "end_location": {
151
+ "lat": 45.5026400,
152
+ "lng": -73.6676900
153
+ },
154
+ "polyline": {
155
+ "points": "{avtGxmr`McAz@uFdDsAlBa@~A@xBXlA\\n@VXl@XzCj@",
156
+ "levels": "B???@??@??B"
157
+ },
158
+ "duration": {
159
+ "value": 30,
160
+ "text": "1 min"
161
+ },
162
+ "html_instructions": "Take exit \u003cb\u003e70O\u003c/b\u003e on the \u003cb\u003eleft\u003c/b\u003e for \u003cb\u003eAutoroute 40 O\u003c/b\u003e toward \u003cb\u003eHull/Ottawa/Autoroute 520/Pierre Elliott Trudeau\u003c/b\u003e",
163
+ "distance": {
164
+ "value": 542,
165
+ "text": "0.5 km"
166
+ }
167
+ }, {
168
+ "travel_mode": "DRIVING",
169
+ "start_location": {
170
+ "lat": 45.5026400,
171
+ "lng": -73.6676900
172
+ },
173
+ "end_location": {
174
+ "lat": 45.5390400,
175
+ "lng": -74.3889100
176
+ },
177
+ "polyline": {
178
+ "points": "ofvtG`fs`MxAp@|AvAjXl^xEfHhAxBxA`Ep@hCl@dDn@bHNvF`@xl@ZvIt@xIfBdLlCfMdA~DtQnz@nAbIl@hG`@~JEpNsIrsDWfOAzN\\tVpB~t@b@pWfAla@d@tHrAfMhBfKlBbIlDzKni@bvAxl@|~A~gAlnCzR|f@pBvGn@lC~AbJjQduAnAdHfBbHrFhOx}@r~BvFlOvAnEfCxIhChKfEpT`J`l@nArGxChMxAlErBzFlG`Od[rs@xRdc@rOf^`C`FhBdFnBpIv@bHT|DPfHMzGeG`hBiCzp@a@xM@bHlQzyEvEpp@vArWnB|UjEpl@l@pGnBtMhD`OrBnGfNl_@vD`Jzh@btA|DzKlGnWjA`JN`GC`Dc@hGiBtI{AzDeC`EcBhBsCbCy@f@k^tYcSnQi{@r_AsChEg@fAgAlCeBhGs@bEc@rEaCzl@_@lTwAb{AWlGiAtKw@rDwChK_p@tvBiB|GwAvIw@xH[`JCvJ~DhhAT|PAhp@YpIuAnSmBxNyLht@iEhRaEbNuBrFgExJ{IpP}d@f~@m`@~p@qL~T}EpM}\\pmAcRnh@gQ`t@uBjLa\\`vCiAfFsAvD}D~GuR|VmR~U{CvF{CpI_Jfh@gL|s@q@xGUvFDbJpOxfDKhGc@`FqBpIwCfGkzA|kBgJvLeg@pr@wC|CkAbAuF~C_DfAgdBbe@mDd@yC?qHo@{C@cEz@wCpA}DdDaE|G{AtEsGj`@",
179
+ "levels": "B??@???@?????@?????A????@???@??A???@?@?????@???@??????@???????A???@???@@???A???@???@???A???@????@@???A??????@??@??@????@???A???@????@??@??@????@??A??@@??A????@???@???@?@?@?B"
180
+ },
181
+ "duration": {
182
+ "value": 2666,
183
+ "text": "44 mins"
184
+ },
185
+ "html_instructions": "Merge onto \u003cb\u003eAutoroute 40 W\u003c/b\u003e\u003cdiv style=\"font-size:0.9em\"\u003eEntering Ontario\u003c/div\u003e",
186
+ "distance": {
187
+ "value": 66555,
188
+ "text": "66.6 km"
189
+ }
190
+ }, {
191
+ "travel_mode": "DRIVING",
192
+ "start_location": {
193
+ "lat": 45.5390400,
194
+ "lng": -74.3889100
195
+ },
196
+ "end_location": {
197
+ "lat": 45.4124300,
198
+ "lng": -75.6833000
199
+ },
200
+ "polyline": {
201
+ "points": "_j}tGta`eMoRzmAab@vcCu\\|nCuF~]uThiAeE~VyR`wAcSfzA}AjLgA|J[|FK|FTpHp@nIfApGtBxHvBrFfGtIfj@`l@fHjJfGzJhKrVdSzs@pD|KdHxOfGdKvF`IxcAbmAtJ~IvJrH|GfEbb@nUpn@v\\tIpHnClDxCfF|ChHzBdHxD|TvMt`AbD`QbD`M`ElNxHzSnPl_@xGlRnCjJpBdIpJdd@pE`RfGfTjIpTnVzj@pFrObErNhFjU~E~[~D~_@nDbXlGdX|HbSbJjQnMdUlGlNhFnN~I`YzBhGzF|MxEpJlFnJ~JbOlOnPjOhNvLjLlFxHzEdJjFhN`D|LzDpUpAhVjAf]~@jNvB~PlC~NxDvN|DxKzFxMfG`Kt^bd@pF`IxEbIxIpQnSbk@hJzTpGbMpIdNfNzPdMfM`JrG|IhFzP|GfRbEj^zCnUtF~IhDvHjEjNjKjKxKvKnN|FtJ~FvLt^l}@bGnRtEpSjBfLdClUpAbSx@|b@n@`g@`AbTbDd^tDhUpDjQrFlSjSjk@bHhTvJh_@bGpXhH~]xGvWfOrg@vJfWpIjPvI`LvIpHbKrGxNrIdG~DfGpFvF|FlEtFvFhIfDfGlEhKxBfGhSlo@fe@`~A~H`[lEnXfCjXz@rV?fZc@dj@Zpc@fAt_@~B`c@nCj\\z]jtDv@zGnC~QzDrRrDrN~R|p@|Qxr@lQhy@rTbiAzEjYrEh^|A`ObD~`@vAvXf@bQxBpi@r@tM`@~LR~JBxJKtKg@dLk@rIy@rH}@bHeCnNaBzKcAdIy@bJmAvQk@lTCvTf@fT`ArPjCdYrBxQ~@lUMzToBhVqEfUwEhPcJtQkKlOmUp[cCvDuC~FqCnHaClJWxAyAlLk@xNRlLb@tJbDtg@nBte@`Cpz@fCzc@fJpfAp@~MXnPk@pZoAlQgDhY}@dJc@fNH~Kd@pK`F|y@d@`R?pIQvM{@tPuAjNsCbR_ElPcDjKeGhOuGlLio@x~@iDzFyDxI_CjHeAbE}BhNy@pI_@|HKdK?n_@K~I[dJkAvPeBxNuCvOwCrLeIlZ_DzOu@|EqAxKw@`Ke@lJS|ICdKlBxaC@vLMrQQ`JkArY_A|MeBfRiK`x@mDv\\kh@hzFaFxv@sIn}AcFp{@m@vGsAdJoAjGeBxGgCdIop@j_BmBnG}@zDu@vE]zC[~EmIxnBeF|gAiBb\\yBn\\aEne@}e@v_FwBlNiA|EoBvGsBlFyA|CmDfG}OdTgFhI}EnJwKpWkBtDwDnGoGhIeE`EoDvCiHjE{F`CiGhBkHpAyF^}Oj@qC`@kDz@yChAeFtCsNxK_C~AeCrAkE~AqMdDeBx@aBfA{BxBsAfBkCdFoArDcArFk@lGq@zKk@rE}@fEcAdDkBzDqCtD_CpBkBjAgBr@eCn@mM~AqAf@sBnAwBlB{B|C_B`EsA|FS~AYvFDrEZhE^fCrEdRfBdJvA~JjAhMt@vRnEr`Bb@lIXxCh@~CjE|Pd@vCZhDnB`k@ExE{@xLOxEF`GP|Cz@rGpAhFrQdg@rEnQ",
202
+ "levels": "B?@@??@?@???@??A??@??@??@??@?@???@??A?@???@???@????@???@????@???@????@?@??@??@?@???@???A???@??@??@??@?@?@??@??@?A???@???@?@???@????A??@????@???@????A??@??@?@?@??@??@?@????B??????@???????@??@?????A??@????@??@?A????????@????@???@???A???@??@???A??????@????@???@???@??@????@??@????@???@?????@??A???@???????@???@?????@????@???@???@??????@??@????@???A???@????@??@????@?????@???B"
203
+ },
204
+ "duration": {
205
+ "value": 4744,
206
+ "text": "1 hour 19 mins"
207
+ },
208
+ "html_instructions": "Continue onto \u003cb\u003eON-417 W\u003c/b\u003e",
209
+ "distance": {
210
+ "value": 118628,
211
+ "text": "119 km"
212
+ }
213
+ }, {
214
+ "travel_mode": "DRIVING",
215
+ "start_location": {
216
+ "lat": 45.4124300,
217
+ "lng": -75.6833000
218
+ },
219
+ "end_location": {
220
+ "lat": 45.4112800,
221
+ "lng": -75.6874000
222
+ },
223
+ "polyline": {
224
+ "points": "urdtGr{|lMNzAvAjGf@fFtAbF",
225
+ "levels": "B???B"
226
+ },
227
+ "duration": {
228
+ "value": 27,
229
+ "text": "1 min"
230
+ },
231
+ "html_instructions": "Take exit \u003cb\u003e119\u003c/b\u003e for \u003cb\u003eCatherine Street\u003c/b\u003e",
232
+ "distance": {
233
+ "value": 346,
234
+ "text": "0.3 km"
235
+ }
236
+ }, {
237
+ "travel_mode": "DRIVING",
238
+ "start_location": {
239
+ "lat": 45.4112800,
240
+ "lng": -75.6874000
241
+ },
242
+ "end_location": {
243
+ "lat": 45.4088400,
244
+ "lng": -75.6937300
245
+ },
246
+ "polyline": {
247
+ "points": "okdtGfu}lM|@jF`AjDfJxY",
248
+ "levels": "B??B"
249
+ },
250
+ "duration": {
251
+ "value": 108,
252
+ "text": "2 mins"
253
+ },
254
+ "html_instructions": "Slight \u003cb\u003eleft\u003c/b\u003e at \u003cb\u003eCatherine St/Regional Road 60\u003c/b\u003e",
255
+ "distance": {
256
+ "value": 565,
257
+ "text": "0.6 km"
258
+ }
259
+ }, {
260
+ "travel_mode": "DRIVING",
261
+ "start_location": {
262
+ "lat": 45.4088400,
263
+ "lng": -75.6937300
264
+ },
265
+ "end_location": {
266
+ "lat": 45.4125400,
267
+ "lng": -75.6968900
268
+ },
269
+ "polyline": {
270
+ "points": "g|ctGx|~lMU^}ElDoNhL",
271
+ "levels": "B??B"
272
+ },
273
+ "duration": {
274
+ "value": 56,
275
+ "text": "1 min"
276
+ },
277
+ "html_instructions": "Turn \u003cb\u003eright\u003c/b\u003e at \u003cb\u003eKent St/Hwy 17B/Regional Road 83\u003c/b\u003e",
278
+ "distance": {
279
+ "value": 480,
280
+ "text": "0.5 km"
281
+ }
282
+ }, {
283
+ "travel_mode": "DRIVING",
284
+ "start_location": {
285
+ "lat": 45.4125400,
286
+ "lng": -75.6968900
287
+ },
288
+ "end_location": {
289
+ "lat": 45.4119000,
290
+ "lng": -75.6984600
291
+ },
292
+ "polyline": {
293
+ "points": "ksdtGpp_mM~BxH",
294
+ "levels": "BB"
295
+ },
296
+ "duration": {
297
+ "value": 38,
298
+ "text": "1 min"
299
+ },
300
+ "html_instructions": "Turn \u003cb\u003eleft\u003c/b\u003e at \u003cb\u003eJames St\u003c/b\u003e",
301
+ "distance": {
302
+ "value": 142,
303
+ "text": "0.1 km"
304
+ }
305
+ } ],
306
+ "duration": {
307
+ "value": 8395,
308
+ "text": "2 hours 20 mins"
309
+ },
310
+ "distance": {
311
+ "value": 199900,
312
+ "text": "200 km"
313
+ },
314
+ "start_location": {
315
+ "lat": 45.5086700,
316
+ "lng": -73.5536800
317
+ },
318
+ "end_location": {
319
+ "lat": 45.4119000,
320
+ "lng": -75.6984600
321
+ },
322
+ "start_address": "510 Rue Gosford, Montreal, QC H2Y 3Z2, Canada",
323
+ "end_address": "105 James St, Ottawa, ON K1R 5X1, Canada",
324
+ "via_waypoint": [ ]
325
+ } ],
326
+ "copyrights": "Map data ©2011 Google",
327
+ "overview_polyline": {
328
+ "points": "elwtGn}|_MfNpKcC|H}IyE}AlEvn@lc@f^pJ|Sbm@fyAndCli@|U~IbSo@dTg\\xaAqb@rp@soAhuDah@t_AeWdXrt@bdA`FlxAn_@jnBsIngFbHdyCxMnp@fuDzoJb^j}B|oAzeD~b@bvBpvAxgDpAd`@oLzqDlQzyEjRtmCzLxn@xcAnlCdJto@oJ|]a|@zt@i{@r_AiJhTsLh`Ei~@bfDrDjbDwSdcBiUzt@weBjfDibAblDab@tjDqs@ldAc\\vgBaAtZpOxfDaD|XuyCp|D}pBjl@y]r@wOtOibC|kO{i@t_EyAjd@fJnc@~cA~mA`e@lxAdX`f@noAbxAjfBbcA~RfUrf@fiCdi@dwAla@`bBpn@t`Bfa@teCzoAnwC~`AxhAtThc@|Inc@tI|uA`Wjz@hu@jdAri@psAja@dn@dc@d]~yArZbc@`W``@~f@tf@dkAjUvjA|FftBxInt@|_BvaG``@tu@bv@ji@dZda@xmAb_EpKniA~DvnDjb@vqErfBtbItMjpAbJb~BsT|{CdL`_C}Bdl@iLpf@iw@noA_K|p@n^n~GkJfsBvHpfBmA~i@sYroAi}@btA}Nrh@yEbhB_b@vdCS~~Ei_AhsJyWzqE_Mhn@qw@ntBqYf~Fmm@tlGqM`d@}aAhcBg`@bVsq@nIc|@bd@sKfR{Lzs@}JrJg\\zIuKjWfOrpAhHx~BpIxd@jA`wAnr@fgCcVvR~BxH",
329
+ "levels": "B@@@@@@@@@A@@@@@A@@A@A@@@@@A@@@A@@B@@@A@@@A@@@@@A@@AA@@A@@B@@@@@@A@@@@@@@@@@A@@@@@@@A@@@A@@@A@@@@@B@@A@@A@@@A@@A@@@@@@@@A@@@@@@@@@A@@@@@@B"
330
+ },
331
+ "warnings": [ ],
332
+ "waypoint_order": [ ],
333
+ "bounds": {
334
+ "southwest": {
335
+ "lat": 45.3026900,
336
+ "lng": -75.6984600
337
+ },
338
+ "northeast": {
339
+ "lat": 45.5655200,
340
+ "lng": -73.5536800
341
+ }
342
+ }
343
+ } ]
344
+ }