` with the ID of 'sidebar' that contains a couple of other nodes, that's our overlay. We've also included a little css to position and style it to our liking:
8 |
9 | ```css
10 | #sidebar {
11 | position:absolute; top: 10px; right: 10px; bottom: 10px; width: 260px;
12 | background:#333; color: #fff;
13 | padding:20px;
14 | font-family: Arial, Helvetica, sans-serif;
15 | opacity:0.9;
16 | filter:alpha(opacity=80); /* For IE8 and earlier */
17 | }
18 | ```
19 | ## Clean up from earlier
20 |
21 | Unless we want popups _and_ the overlay box, we should either delete or comment out the first click handler that we added to our layer in the last exercise:
22 |
23 | ```javascript
24 | //featureLayer.on('ready', function(){
25 | // this.eachLayer(function(layer){
26 | // layer.bindPopup('Welcome to ' + layer.feature.properties.name);
27 | // });
28 | //});
29 | ```
30 |
31 | Rather than use the out-of-the-box popup binding, we're going to write a little more code to handle the click ourselves.
32 |
33 | Start by adding a click handler function that takes the click event as a variable called 'e':
34 |
35 | ```javascript
36 | var clickHandler = function(e){
37 |
38 | };
39 | ```
40 |
41 | When the user clicks on a new feature we want to make sure any old data is removed, we're going to use [jQuery](https://jquery.com/) to do any of the actual DOM interaction because they make it super easy. Everywhere you see a `$` we're using the jQuery library.
42 |
43 | Using the jQuery selector for any node with the ID of 'info' (that's where we're going to put some info about the point that the user clicks on) we make sure to remove any child elements.
44 |
45 | ```javascript
46 | var clickHandler = function(e){
47 | $('#info').empty();
48 | };
49 | ```
50 |
51 | Now we want to get a reference to the feature that the user clicked on. Lucky for us, the click event `e` references the target of the click and we can access the feature object from there and assign it to a variable called `feature`:
52 |
53 | ```javascript
54 | var clickHandler = function(e){
55 | $('#info').empty();
56 |
57 | var feature = e.target.feature;
58 | };
59 | ```
60 |
61 | Now we can show our info element and add text from the attributes of our feature. jQuery lets us fade an element in over time to make it a little more pleasing of an interaction so rather than just use the `.show()` function, we'll use `.fadeIn()` to make it appear in 400 milliseconds.
62 |
63 | ```javascript
64 | var clickHandler = function(e){
65 | $('#info').empty();
66 |
67 | var feature = e.target.feature;
68 |
69 | $('#sidebar').fadeIn(400, function(){
70 |
71 | }
72 | };
73 | ```
74 |
75 | The `.fadeIn()` function allows us to provide a callback that we can use to add elements to the panel once it's ready. We're going to create a string variable and populate it using properties from our feature, if you used a dataset other than restaurants.geojson the feature names will need to be changed.
76 |
77 | ```javascript
78 | var clickHandler = function(e){
79 | $('#info').empty();
80 |
81 | var feature = e.target.feature;
82 |
83 | $('#sidebar').fadeIn(400,function(){
84 | var info = '';
85 |
86 | info += '
'
87 | info += '
' + feature.properties.name + '
'
88 | if(feature.properties.phone) info += '
' + feature.properties.cuisine + '
'
89 | if(feature.properties.phone) info += '
' + feature.properties.phone + '
'
90 | if(feature.properties.phone) info += '
' + feature.properties.website + '
'
91 | if(feature.properties.phone) info += '
' + feature.properties.website + '
'
92 | info += '
'
93 |
94 | $('#info').append(info);
95 | });
96 | };
97 | ```
98 |
99 | As the last step we append the string content to our info panel using the `.append()` function.
100 |
101 | To register our click handler so that it is actually called when a user clicks on a feature we're going to add a listener to the click event on each of the features in our featureLayer once it's been fully registered.
102 |
103 | ```javascript
104 | var clickHandler = function(e){
105 | $('#info').empty();
106 |
107 | var feature = e.target.feature;
108 |
109 | $('#sidebar').fadeIn(400,function(){
110 | var info = '';
111 |
112 | info += '
'
113 | info += '
' + feature.properties.name + '
'
114 | if(feature.properties.phone) info += '
' + feature.properties.cuisine + '
'
115 | if(feature.properties.phone) info += '
' + feature.properties.phone + '
'
116 | if(feature.properties.phone) info += '
' + feature.properties.website + '
'
117 | if(feature.properties.phone) info += '
' + feature.properties.website + '
'
118 | info += '
'
119 |
120 | $('#info').append(info);
121 | });
122 | };
123 |
124 | featureLayer.on('ready', function(){
125 | this.eachLayer(function(layer){
126 | layer.on('click', clickHandler);
127 | });
128 | });
129 | ```
130 |
131 | Nice! Now we have an overlay that is populated with properties from the feature that the user clicked on, how do we get rid of it when we're done?
132 |
133 | We need to add on more little bit of code so that the info panel is hidden when a user clicks anywhere else on the map so that it can be dismissed by fading it out and emptying it of any content.
134 |
135 | ```javascript
136 | var clickHandler = function(e){
137 | $('#info').empty();
138 |
139 | var feature = e.target.feature;
140 |
141 | $('#sidebar').fadeIn(400,function(){
142 | var info = '';
143 |
144 | info += '
'
145 | info += '
' + feature.properties.name + '
'
146 | if(feature.properties.phone) info += '
' + feature.properties.cuisine + '
'
147 | if(feature.properties.phone) info += '
' + feature.properties.phone + '
'
148 | if(feature.properties.phone) info += '
' + feature.properties.website + '
'
149 | if(feature.properties.phone) info += '
' + feature.properties.website + '
'
150 | info += '
'
151 |
152 | $('#info').append(info);
153 | });
154 | };
155 |
156 | featureLayer.on('ready', function(){
157 | this.eachLayer(function(layer){
158 | layer.on('click', clickHandler);
159 | });
160 | });
161 |
162 | map.on('click',function(e){
163 | $('#info').fadeOut(200);
164 | $('#info').empty();
165 | });
166 | ```
167 |
168 | ## Web Map Success!!
169 |
170 | Let's have some more fun, how about putting a point on the map based on our users location? If you've got time, check out [exercise 8](/exercise8_bonus_locate_me.md)
171 |
--------------------------------------------------------------------------------
/exercise9_super_bonus_add_directions.md:
--------------------------------------------------------------------------------
1 | # Exercise 9, Super Bonus Round! Directions API
2 |
3 | We already have a nice mapping application, but what if we added some even fancier functionality. We're mapping restaurants, and our location, seems reasonable that we would want to figure out how to get from where we are now, to the restaurant of our choice!
4 |
5 | This is going to be a more complex exercise, but if you made it this far, I know you're gonna do great!
6 |
7 | ## Mapzen Directions API
8 |
9 | Mapzen is a spatial software and service company that's doing some awesome work with open datasets. They've put together a few API's that make it super easy to do geocoding and direction finding. We're going to use their [Mapzen Turn-by-Turn](https://mapzen.com/projects/turn-by-turn) project to get directions to our restaurants.
10 |
11 | In order to access their API, you need to register for an API Key. You can register with Mapzen by authorizing access through your GitHub account, which makes it super easy. I've created an API key for this exercise, it's on the free tier and won't every be upgraded, and might be removed by the time you get here... so you should get your own key if you want to use this or any of their other services in the future.
12 |
13 | ## Requesting Directions
14 |
15 | By reading the documentation we found out that to request directions, we need to make a call to `http://valhalla.mapzen.com/route` (best name ever in my opinion) with some query parameters describing what kind of information we're looking for.
16 |
17 | Let's start by creating a function that we can call with from and to locations that will eventually add our route to the map.
18 |
19 | So at the end of our JS file, let's start to add some code:
20 |
21 | ```javascript
22 | function getDirections(frm, to){
23 |
24 | }
25 | ```
26 |
27 | We know that to get our directions, we need to make a GET request with a JSON payload describing our query. Since we're using JQuery in our project we can leverage their AJAX request functionality to make the request, but first, let's build our JSON query object:
28 |
29 | ```javascript
30 | function getDirections(frm, to){
31 | var jsonPayload = JSON.stringify({
32 | locations:[
33 | {lat: frm[1], lon: frm[0]},
34 | {lat: to[1], lon: to[0]}
35 | ],
36 | costing: 'pedestrian',
37 | units: 'miles'
38 | })
39 | }
40 | ```
41 |
42 | We have to run `JSON.stringify()` on the JSON to convert it to a string that can be sent as a query parameter in the URL string.
43 |
44 | Now let's add the AJAX code that will make our request for us:
45 |
46 | ```javascript
47 | function getDirections(frm, to){
48 | var jsonPayload = JSON.stringify({
49 | locations:[
50 | {lat: frm[1], lon: frm[0]},
51 | {lat: to[1], lon: to[0]}
52 | ],
53 | costing: 'pedestrian',
54 | units: 'miles'
55 | })
56 | $.ajax({
57 | url:'http://valhalla.mapzen.com/route',
58 | data:{
59 | json: jsonPayload,
60 | api_key: 'valhalla-gwtf3x2'
61 | }
62 | })
63 | }
64 | ```
65 |
66 | ## Parsing the Response
67 |
68 | The code above will make the request, but nothing will happen unless we tell JQuery what to do with the response, we do that by chaining on a handler function using the `.done()` function of the promise-like object returned by the `$.ajax` function:
69 |
70 | ```javascript
71 | function getDirections(frm, to){
72 | var jsonPayload = JSON.stringify({
73 | locations:[
74 | {lat: frm[1], lon: frm[0]},
75 | {lat: to[1], lon: to[0]}
76 | ],
77 | costing: 'pedestrian',
78 | units: 'miles'
79 | })
80 | $.ajax({
81 | url:'http://valhalla.mapzen.com/route',
82 | data:{
83 | json: jsonPayload,
84 | api_key: 'valhalla-gwtf3x2'
85 | }
86 | }).done(function(data){
87 |
88 | })
89 | }
90 | ```
91 |
92 | ## Add our route to the map
93 |
94 | Wait, what do we want to do with our directions data? Let's create a route feature layer so that we can display the route line on the map, to do that we want to create the feature layer before we create our `getDirections()` function, and add the empty featureLayer to the map so when we add data to it later, it will automatically show up for our user:
95 |
96 | ```javascript
97 | var routeLine = L.mapbox.featureLayer().addTo(map);
98 | function getDirections(frm, to){
99 | var jsonPayload = JSON.stringify({
100 | locations:[
101 | {lat: frm[1], lon: frm[0]},
102 | {lat: to[1], lon: to[0]}
103 | ],
104 | costing: 'pedestrian',
105 | units: 'miles'
106 | })
107 | $.ajax({
108 | url:'http://valhalla.mapzen.com/route',
109 | data:{
110 | json: jsonPayload,
111 | api_key: 'valhalla-gwtf3x2'
112 | }
113 | }).done(function(data){
114 |
115 | })
116 | }
117 | ```
118 |
119 | Ok, now we can do something with the response data. The turn-by-turn API returns our route in an encoded geometry to save bandwidth rather than in straight-up GeoJSON. This means we have to decode it before we can use it. Luckily, Mapzen provides a [decode function](https://mapzen.com/documentation/turn-by-turn/decoding/) that we can borrow to do this for us, reading the docs FTW!:
120 |
121 | ```javascript
122 | var routeLine = L.mapbox.featureLayer().addTo(map);
123 | function getDirections(frm, to){
124 | var jsonPayload = JSON.stringify({
125 | locations:[
126 | {lat: frm[1], lon: frm[0]},
127 | {lat: to[1], lon: to[0]}
128 | ],
129 | costing: 'pedestrian',
130 | units: 'miles'
131 | })
132 | $.ajax({
133 | url:'http://valhalla.mapzen.com/route',
134 | data:{
135 | json: jsonPayload,
136 | api_key: 'valhalla-gwtf3x2'
137 | }
138 | }).done(function(data){
139 | var routeShape = polyline.decode(data.trip.legs[0].shape);
140 | routeLine.setGeoJSON({
141 | type:'Feature',
142 | geometry:{
143 | type:'LineString',
144 | coordinates: routeShape
145 | },
146 | properties:{
147 | "stroke": '#ed23f1',
148 | "stroke-opacity": 0.8,
149 | "stroke-width": 8
150 | }
151 | })
152 | })
153 | }
154 | ```
155 |
156 | Awesome, now we're adding our route from the API response to the routeLine featureLayer! But wait, how do we actually call the `getDirections()` function? We need to go back up to where we handle the click event on a restaurant feature and make sure that we call `getDirections()` to add the route to the map:
157 |
158 | ```javascript
159 | //Back in lines 53-56ish
160 | $('#info').append(info);
161 | });
162 |
163 | var myGeoJSON = myLocation.getGeoJSON();
164 |
165 | getDirections(myGeoJSON.geometry.coordinates, feature.geometry.coordinates);
166 | ```
167 |
168 | We're adding the call to `getDirections()` using the users location from `myGeoJSON` as the from location and the location of the restaurant that was clicked on as the to location.
169 |
170 | Time to test, go ahead and reload the application and see if you are seeing routes show up between your location and the restaurant that you click on.
171 |
172 | ## Add Directions to the Sidebar
173 |
174 | That's pretty cool and all, but what if we want to give the user a list of directions along with the route on the map? We've got a good place for it in the right sidebar, under the restaurant information.
175 |
176 | In this example app, I've already created a place for the directions to go, we just need to parse them out of the response and add them to the UI.
177 |
178 | To start, let's fade our directions region into being using JQuery, so inside our ajax data handler function, after we `setGeoJSON` on our featureLayer, let's add some code:
179 |
180 | ```javascript
181 | var routeLine = L.mapbox.featureLayer().addTo(map);
182 | function getDirections(frm, to){
183 | var jsonPayload = JSON.stringify({
184 | locations:[
185 | {lat: frm[1], lon: frm[0]},
186 | {lat: to[1], lon: to[0]}
187 | ],
188 | costing: 'pedestrian',
189 | units: 'miles'
190 | })
191 | $.ajax({
192 | url:'http://valhalla.mapzen.com/route',
193 | data:{
194 | json: jsonPayload,
195 | api_key: 'valhalla-gwtf3x2'
196 | }
197 | }).done(function(data){
198 | var routeShape = polyline.decode(data.trip.legs[0].shape);
199 | routeLine.setGeoJSON({
200 | type:'Feature',
201 | geometry:{
202 | type:'LineString',
203 | coordinates: routeShape
204 | },
205 | properties:{
206 | "stroke": '#ed23f1',
207 | "stroke-opacity": 0.8,
208 | "stroke-width": 8
209 | }
210 | })
211 |
212 | $('#directions').fadeIn(400, function(){
213 |
214 | })
215 |
216 | })
217 | }
218 | ```
219 |
220 | Inside our `fadeIn()` callback is where we'll actually add the information to the DOM, (remember to empty the section of any previous directions as the first step). Let's start by adding the distance and travel time for the route:
221 |
222 | ```javascript
223 | $('#directions').fadeIn(400, function(){
224 | $('#summary').empty();
225 | $('#distance').text((Math.round(data.trip.summary.length * 100) / 100) + data.trip.units);
226 | $('#time').text((Math.round(data.trip.summary.time / 60 * 100) / 100) + ' min');
227 | })
228 | ```
229 |
230 | That's pretty useful information, but what about each of the step-by-step directions? To add those, we'll loop over the maneuvers array and create a list item to add to our summary list that's already in the UI. We'll create the list item much like we create the DOM elements for the restaurant name and address we formatted earlier:
231 |
232 | ```javascript
233 | $('#directions').fadeIn(400, function(){
234 | $('#summary').empty();
235 | $('#distance').text((Math.round(data.trip.summary.length * 100) / 100) + data.trip.units);
236 | $('#time').text((Math.round(data.trip.summary.time / 60 * 100) / 100) + ' min');
237 |
238 | data.trip.legs[0].maneuvers.forEach(function(item){
239 | var direction = '';
240 | direction += '
';
241 | if(item.verbal_post_transition_instruction) direction += '' + item.verbal_post_transition_instruction + '
';
242 | if(item.verbal_pre_transition_instruction) direction += '' + item.verbal_pre_transition_instruction + '
';
243 | direction += '';
244 | $('#summary').append(direction);
245 | })
246 | })
247 | ```
248 |
249 | Now we should be seeing a list of turn-by-turn directions show up in our right sidebar when we click on a restaurant!
250 |
251 | The only problem that we're having right now is that our route never goes away, even when the sidebar is removed by clicking on a blank area in the map. To fix this, we just need to add another click handler to the very end of our file that clears all of the data from our routeLine featureLayer:
252 |
253 | ```javascript
254 | // all the way to the end of our file
255 | map.on('click', function(){
256 | routeLine.clearLayers();
257 | })
258 | ```
259 |
260 | ## Highlight the route parts
261 |
262 | As a super-duper bonus, let's highlight the regions of the route that correspond to each of the turn-by-turn directions in our sidebar if the user mouses over them.
263 |
264 | Back inside our `.done()` handler, below the `$('#directions').fadeIn()` function call, let's add a handler for the mouseover event on each of our instructions:
265 |
266 | ```javascript
267 | $('.instruction').on('mouseover', function(){
268 |
269 | })
270 | ```
271 |
272 | Each of our instructions contains references to the beginning and end index locations of the beginning and end coordinates for that section of the route in the overall coordinate array for the route. We added them as the `data-begin` and `data-end` attributes. Let's set those to variables that we can use to extract our small shape from the larger route:
273 |
274 | ```javascript
275 | $('.instruction').on('mouseover', function(){
276 | var begin = Number($(this).attr('data-begin'));
277 | var end = Number($(this).attr('data-end'));
278 | })
279 | ```
280 |
281 | Now, how do we display our sub-route data? We'll create another featureLayer to hold the moused-over section of the route and call it `routeHighlight`, so go back up to where we create the routeLine and add the following line to create our routeHighlight:
282 |
283 | ```javascript
284 | var routeLine = L.mapbox.featureLayer().addTo(map);
285 | var routeHighlight = L.mapbox.featureLayer().addTo(map); //<--
286 | function getDirections(frm, to){
287 | ```
288 |
289 | Awesome, now let's add our sub-route to the `routeHighlight` featureLayer on mouseover: (note that sometimes our sub-route is a single point so we should handle both points and line geometries)
290 |
291 | ```javascript
292 | $('.instruction').on('mouseover', function(){
293 | var begin = Number($(this).attr('data-begin'));
294 | var end = Number($(this).attr('data-end'));
295 |
296 | routeHighlight.setGeoJSON({
297 | type:'Feature',
298 | geometry:{
299 | type: begin === end ? 'Point' : 'LineString',
300 | coordinates: begin === end ? routeShape.slice(begin)[0] : routeShape.slice(begin,(end + 1))
301 | },
302 | properties:{
303 | "stroke": '#1ea6f2',
304 | "stroke-opacity": 0.9,
305 | "stroke-width": 10,
306 | "marker-color": '#1ea6f2',
307 | "marker-size": 'small',
308 | "marker-symbol": 'star'
309 | }
310 | })
311 | })
312 | ```
313 |
314 | The only other thing we need to do is a little clean up, when the user mouses out of the sidebar, we should remove the highlight from the map. Add the following handler after our mouseover code:
315 |
316 | ```javascript
317 | $('.instruction').on('mouseout', function(){
318 | routeHighlight.clearLayers()
319 | })
320 | ```
321 |
322 | Sweet, now see what else you can add to the application! Time to dig into the [docs and examples](https://www.mapbox.com/mapbox.js/api) and build away!
323 |
--------------------------------------------------------------------------------
/data/restaurants.geojson:
--------------------------------------------------------------------------------
1 | {
2 | "type": "FeatureCollection",
3 | "crs": { "type": "name", "properties": { "name": "urn:ogc:def:crs:OGC:1.3:CRS84" } },
4 |
5 | "features": [
6 | { "type": "Feature", "properties": { "@id": "node\/821918814", "name": "Shaba-Shabu", "phone": null, "website": null, "cuisine": "asian" }, "geometry": { "type": "Point", "coordinates": [ -78.6210263, 35.8237678 ] } },
7 | { "type": "Feature", "properties": { "@id": "node\/821918815", "name": "Melting Pot", "phone": null, "website": null, "cuisine": null }, "geometry": { "type": "Point", "coordinates": [ -78.621377, 35.824287 ] } },
8 | { "type": "Feature", "properties": { "@id": "node\/935419273", "name": "Jasmin Mediterranean Bistro", "phone": null, "website": null, "cuisine": null }, "geometry": { "type": "Point", "coordinates": [ -78.667869, 35.787874 ] } },
9 | { "type": "Feature", "properties": { "@id": "node\/1055457666", "name": "Big Ed's City Market Restaurant", "phone": "(919) 836-9909", "website": "http:\/\/www.bigedscitymarket.com\/", "cuisine": null }, "geometry": { "type": "Point", "coordinates": [ -78.6359932, 35.7760831 ] } },
10 | { "type": "Feature", "properties": { "@id": "node\/1055457679", "name": "Battistella's", "phone": "(919) 803-2501", "website": "http:\/\/battistellas.com\/", "cuisine": null }, "geometry": { "type": "Point", "coordinates": [ -78.6365233, 35.7767331 ] } },
11 | { "type": "Feature", "properties": { "@id": "node\/1055457691", "name": "Woody's at City Market", "phone": null, "website": "http:\/\/woodyscitymarket.com\/", "cuisine": null }, "geometry": { "type": "Point", "coordinates": [ -78.6364362, 35.7763657 ] } },
12 | { "type": "Feature", "properties": { "@id": "node\/1216186193", "name": "Solas", "phone": "+1 919 7550755", "website": "http:\/\/solasraleigh.com\/", "cuisine": null }, "geometry": { "type": "Point", "coordinates": [ -78.6475829, 35.7856609 ] } },
13 | { "type": "Feature", "properties": { "@id": "node\/1216186217", "name": "Sushi O Bistro", "phone": null, "website": null, "cuisine": "sushi" }, "geometry": { "type": "Point", "coordinates": [ -78.6472448, 35.7836279 ] } },
14 | { "type": "Feature", "properties": { "@id": "node\/1216186227", "name": "Sullivan's Steakhouse", "phone": null, "website": null, "cuisine": "steak_house" }, "geometry": { "type": "Point", "coordinates": [ -78.6471269, 35.786009 ] } },
15 | { "type": "Feature", "properties": { "@id": "node\/1216186232", "name": "Tobbaco Road Sports Cafe", "phone": null, "website": null, "cuisine": "american" }, "geometry": { "type": "Point", "coordinates": [ -78.6472426, 35.7837673 ] } },
16 | { "type": "Feature", "properties": { "@id": "node\/1216186268", "name": "Brooklyn Heights", "phone": null, "website": null, "cuisine": null }, "geometry": { "type": "Point", "coordinates": [ -78.6474541, 35.7876496 ] } },
17 | { "type": "Feature", "properties": { "@id": "node\/1216186366", "name": "Rockford", "phone": "+1 919 8219020", "website": "http:\/\/www.therockfordrestaurant.com\/", "cuisine": null }, "geometry": { "type": "Point", "coordinates": [ -78.6472066, 35.7847558 ] } },
18 | { "type": "Feature", "properties": { "@id": "node\/1216186384", "name": "Ciago's", "phone": null, "website": null, "cuisine": "italian" }, "geometry": { "type": "Point", "coordinates": [ -78.650629, 35.7872536 ] } },
19 | { "type": "Feature", "properties": { "@id": "node\/1216186394", "name": "Thaiphoon", "phone": "+1 919 7204034", "website": "http:\/\/www.thaiphoonbistro.com\/", "cuisine": "thai" }, "geometry": { "type": "Point", "coordinates": [ -78.6476259, 35.7845763 ] } },
20 | { "type": "Feature", "properties": { "@id": "node\/1216186407", "name": "Sushi Blues Cafe", "phone": "+1 919 6648061", "website": "http:\/\/sushibluescafe.com\/", "cuisine": "japanese" }, "geometry": { "type": "Point", "coordinates": [ -78.6476243, 35.7844382 ] } },
21 | { "type": "Feature", "properties": { "@id": "node\/1216186410", "name": "Sahara Mediterranean", "phone": null, "website": null, "cuisine": null }, "geometry": { "type": "Point", "coordinates": [ -78.6504037, 35.7884113 ] } },
22 | { "type": "Feature", "properties": { "@id": "node\/1216186416", "name": "Armadillo Grill", "phone": "+1 919 5460555", "website": "http:\/\/armadillogrill.com\/", "cuisine": "mexican" }, "geometry": { "type": "Point", "coordinates": [ -78.647497, 35.7861004 ] } },
23 | { "type": "Feature", "properties": { "@id": "node\/1216186442", "name": "Pho Pho Pho", "phone": null, "website": null, "cuisine": "asian" }, "geometry": { "type": "Point", "coordinates": [ -78.6470947, 35.7869622 ] } },
24 | { "type": "Feature", "properties": { "@id": "node\/1216186460", "name": "Tasca Brava", "phone": null, "website": null, "cuisine": "spanish" }, "geometry": { "type": "Point", "coordinates": [ -78.6474541, 35.7878021 ] } },
25 | { "type": "Feature", "properties": { "@id": "node\/1216186476", "name": "MoJoe's Burger Joint", "phone": null, "website": null, "cuisine": "burger" }, "geometry": { "type": "Point", "coordinates": [ -78.6469767, 35.7885286 ] } },
26 | { "type": "Feature", "properties": { "@id": "node\/1278590464", "name": "Fresh@Five Points", "phone": null, "website": null, "cuisine": null }, "geometry": { "type": "Point", "coordinates": [ -78.6464431, 35.8047438 ] } },
27 | { "type": "Feature", "properties": { "@id": "node\/1411329838", "name": "El Cerro", "phone": null, "website": null, "cuisine": "mexican" }, "geometry": { "type": "Point", "coordinates": [ -78.6767082, 35.7786023 ] } },
28 | { "type": "Feature", "properties": { "@id": "node\/1411329841", "name": "The Village Deli", "phone": null, "website": null, "cuisine": "sandwich" }, "geometry": { "type": "Point", "coordinates": [ -78.6607677, 35.7912635 ] } },
29 | { "type": "Feature", "properties": { "@id": "node\/1411329847", "name": "Moe's Southwest Grill", "phone": null, "website": null, "cuisine": "mexican" }, "geometry": { "type": "Point", "coordinates": [ -78.6607706, 35.7914964 ] } },
30 | { "type": "Feature", "properties": { "@id": "node\/1411329848", "name": "Baja Burrito", "phone": null, "website": null, "cuisine": "mexican" }, "geometry": { "type": "Point", "coordinates": [ -78.6755239, 35.7795584 ] } },
31 | { "type": "Feature", "properties": { "@id": "node\/1908757864", "name": "Dalat Oriental cuisine", "phone": null, "website": null, "cuisine": "vietnamese" }, "geometry": { "type": "Point", "coordinates": [ -78.6754514, 35.7795345 ] } },
32 | { "type": "Feature", "properties": { "@id": "node\/1908829780", "name": "Abyssinia", "phone": null, "website": null, "cuisine": null }, "geometry": { "type": "Point", "coordinates": [ -78.6753737, 35.779368 ] } },
33 | { "type": "Feature", "properties": { "@id": "node\/2072382353", "name": "Flying Saucer Draught Emporium", "phone": null, "website": null, "cuisine": "american" }, "geometry": { "type": "Point", "coordinates": [ -78.6447955, 35.7799487 ] } },
34 | { "type": "Feature", "properties": { "@id": "node\/2072382489", "name": "The Roast Grill", "phone": null, "website": null, "cuisine": "american" }, "geometry": { "type": "Point", "coordinates": [ -78.6457571, 35.780248 ] } },
35 | { "type": "Feature", "properties": { "@id": "node\/2072383501", "name": "Second Empire Restaurant and Tavern", "phone": null, "website": null, "cuisine": null }, "geometry": { "type": "Point", "coordinates": [ -78.6446923, 35.7808964 ] } },
36 | { "type": "Feature", "properties": { "@id": "node\/2098187833", "name": "Babylon Restaurant", "phone": null, "website": null, "cuisine": "Moroccan" }, "geometry": { "type": "Point", "coordinates": [ -78.6435513, 35.7845575 ] } },
37 | { "type": "Feature", "properties": { "@id": "node\/2144920174", "name": "The Pit", "phone": "+1 919 890 4500", "website": "www.thepit-bbq.com", "cuisine": "barbecue" }, "geometry": { "type": "Point", "coordinates": [ -78.6447083, 35.7759121 ] } },
38 | { "type": "Feature", "properties": { "@id": "node\/2147107893", "name": "Sitti Authentic Lebanese", "phone": null, "website": null, "cuisine": "lebanese" }, "geometry": { "type": "Point", "coordinates": [ -78.6380771, 35.7783596 ] } },
39 | { "type": "Feature", "properties": { "@id": "node\/2198231992", "name": "Mecca Restaurant", "phone": "+1-919-832-5714", "website": "http:\/\/www.mecca-restaurant.com\/", "cuisine": "american" }, "geometry": { "type": "Point", "coordinates": [ -78.6386608, 35.7770398 ] } },
40 | { "type": "Feature", "properties": { "@id": "node\/2566339186", "name": "Bida Manda", "phone": null, "website": null, "cuisine": "Laotion,_Thai" }, "geometry": { "type": "Point", "coordinates": [ -78.6367789, 35.7772541 ] } },
41 | { "type": "Feature", "properties": { "@id": "node\/2566377007", "name": "El Rodeo Mexican Restaurant", "phone": "(919) 829-0777", "website": "http:\/\/elrodeonc.com\/downtown-raleigh\/locations\/", "cuisine": "mexican" }, "geometry": { "type": "Point", "coordinates": [ -78.6365704, 35.7756429 ] } },
42 | { "type": "Feature", "properties": { "@id": "node\/2566388184", "name": "42nd Street Oyster Bar", "phone": null, "website": null, "cuisine": null }, "geometry": { "type": "Point", "coordinates": [ -78.64624, 35.7831205 ] } },
43 | { "type": "Feature", "properties": { "@id": "node\/2566771653", "name": "Bolt Bistro & Bar", "phone": "+1-919-821-0011", "website": "http:\/\/www.boltbistro.com", "cuisine": null }, "geometry": { "type": "Point", "coordinates": [ -78.6390375, 35.7776225 ] } },
44 | { "type": "Feature", "properties": { "@id": "node\/2729883319", "name": "Bu Ku", "phone": null, "website": null, "cuisine": null }, "geometry": { "type": "Point", "coordinates": [ -78.6382131, 35.7754027 ] } },
45 | { "type": "Feature", "properties": { "@id": "node\/2731382547", "name": "Caffe Luna", "phone": null, "website": null, "cuisine": "italian" }, "geometry": { "type": "Point", "coordinates": [ -78.6367632, 35.7780662 ] } },
46 | { "type": "Feature", "properties": { "@id": "node\/2734428056", "name": "Dickey's Barbecue Pit", "phone": null, "website": null, "cuisine": "regional" }, "geometry": { "type": "Point", "coordinates": [ -78.637703, 35.7754236 ] } },
47 | { "type": "Feature", "properties": { "@id": "node\/2782524126", "name": "Chuck's", "phone": null, "website": null, "cuisine": "burger" }, "geometry": { "type": "Point", "coordinates": [ -78.638187, 35.77711 ] } },
48 | { "type": "Feature", "properties": { "@id": "node\/2782526003", "name": "Beasley's Chicken and Honey", "phone": null, "website": null, "cuisine": "chicken" }, "geometry": { "type": "Point", "coordinates": [ -78.6382, 35.777028 ] } },
49 | { "type": "Feature", "properties": { "@id": "node\/2782527413", "name": "Gravy Italian-American Kitchen", "phone": "+1 919-896-8513", "website": "http:\/\/www.gravyraleigh.com\/", "cuisine": "italian" }, "geometry": { "type": "Point", "coordinates": [ -78.6380687, 35.7784984 ] } },
50 | { "type": "Feature", "properties": { "@id": "node\/2921397005", "name": "Blue Mango", "phone": "+1 919 3222760", "website": "http:\/\/www.bluemangoraleigh.com\/", "cuisine": "indian" }, "geometry": { "type": "Point", "coordinates": [ -78.6472129, 35.7840277 ] } },
51 | { "type": "Feature", "properties": { "@id": "node\/2921397017", "name": "Rye Bar & Southern Kitchen", "phone": "+1-919-227-3370", "website": "http:\/\/www.ryeraleigh.com", "cuisine": "american" }, "geometry": { "type": "Point", "coordinates": [ -78.6396822, 35.7736589 ] } },
52 | { "type": "Feature", "properties": { "@id": "node\/2921397020", "name": "Sam & Wally's", "phone": "+1 919 8297215", "website": "http:\/\/www.samandwallys.com\/", "cuisine": null }, "geometry": { "type": "Point", "coordinates": [ -78.6405676, 35.7744554 ] } },
53 | { "type": "Feature", "properties": { "@id": "node\/2921397021", "name": "Sono", "phone": "+1-919-521-5328", "website": "http:\/\/www.sonoraleigh.com\/", "cuisine": "japanese" }, "geometry": { "type": "Point", "coordinates": [ -78.6391293, 35.7759268 ] } },
54 | { "type": "Feature", "properties": { "@id": "node\/2941810252", "name": "Jet's Pizza", "phone": null, "website": "www.jetspizza.com", "cuisine": "pizza" }, "geometry": { "type": "Point", "coordinates": [ -78.6203969, 35.8225812 ] } },
55 | { "type": "Feature", "properties": { "@id": "node\/3011712773", "name": "On the Oval Culinary Creations", "phone": null, "website": null, "cuisine": null }, "geometry": { "type": "Point", "coordinates": [ -78.6744446, 35.7702302 ] } },
56 | { "type": "Feature", "properties": { "@id": "node\/3248742655", "name": "Twisted Mango", "phone": "+1-919-838-8700", "website": null, "cuisine": "caribbean" }, "geometry": { "type": "Point", "coordinates": [ -78.6391621, 35.7748818 ] } },
57 | { "type": "Feature", "properties": { "@id": "node\/3248742656", "name": "Jimmy V's Osteria + Bar", "phone": "+1-919-256-1451", "website": "http:\/\/jimmyvsraleigh.com\/", "cuisine": "italian,_bar" }, "geometry": { "type": "Point", "coordinates": [ -78.6395982, 35.7747799 ] } },
58 | { "type": "Feature", "properties": { "@id": "node\/3248742660", "name": "Zinda New Asian", "phone": "+1-919-825-0995", "website": "http:\/\/zindaraleigh.com", "cuisine": "asian" }, "geometry": { "type": "Point", "coordinates": [ -78.6390895, 35.776478 ] } },
59 | { "type": "Feature", "properties": { "@id": "node\/3248743362", "name": "ORO Restaurant & Lounge", "phone": "+1-919-239-4010", "website": "http:\/\/www.ororaleigh.com", "cuisine": "american" }, "geometry": { "type": "Point", "coordinates": [ -78.6385031, 35.7767563 ] } },
60 | { "type": "Feature", "properties": { "@id": "node\/3305442675", "name": "Berkeley Cafe", "phone": "+1 919-828-9190", "website": "https:\/\/www.facebook.com\/pages\/Berkeley-Cafe\/35414122239", "cuisine": null }, "geometry": { "type": "Point", "coordinates": [ -78.6428012, 35.7769453 ] } },
61 | { "type": "Feature", "properties": { "@id": "node\/3305442676", "name": "Brewmasters Bar & Grill", "phone": "919-836-9338", "website": "http:\/\/brewmastersbarandgrill.com\/", "cuisine": null }, "geometry": { "type": "Point", "coordinates": [ -78.6436982, 35.7769655 ] } },
62 | { "type": "Feature", "properties": { "@id": "node\/3307013373", "name": "Clyde Cooper's BBQ", "phone": "+1 919-832-7614", "website": "http:\/\/clydecoopersbbq.com\/", "cuisine": "regional" }, "geometry": { "type": "Point", "coordinates": [ -78.6381649, 35.7762672 ] } },
63 | { "type": "Feature", "properties": { "@id": "node\/3311658569", "name": "The Remedy Diner", "phone": "919.835.3553", "website": "http:\/\/www.theremedydiner.com\/", "cuisine": null }, "geometry": { "type": "Point", "coordinates": [ -78.6369163, 35.7783054 ] } },
64 | { "type": "Feature", "properties": { "@id": "node\/3311658570", "name": "Troy Mezze Lounge", "phone": "+1 919-834-8133", "website": "http:\/\/www.troymezze.com\/", "cuisine": "turkish" }, "geometry": { "type": "Point", "coordinates": [ -78.6356915, 35.7762867 ] } },
65 | { "type": "Feature", "properties": { "@id": "node\/3311658572", "name": "Vic's Italian Restaurant", "phone": "+1 919-829-7090", "website": "http:\/\/www.vicsitalianrestaurant.com\/", "cuisine": "italian" }, "geometry": { "type": "Point", "coordinates": [ -78.63571, 35.7758905 ] } },
66 | { "type": "Feature", "properties": { "@id": "node\/3311663688", "name": "Centro", "phone": "+1 919-835-3593", "website": "http:\/\/www.centroraleigh.com\/", "cuisine": "mexican" }, "geometry": { "type": "Point", "coordinates": [ -78.6383213, 35.7792709 ] } },
67 | { "type": "Feature", "properties": { "@id": "node\/3501372516", "name": "Bloomsbury Bistro", "phone": null, "website": null, "cuisine": null }, "geometry": { "type": "Point", "coordinates": [ -78.6446015, 35.8042192 ] } },
68 | { "type": "Feature", "properties": { "@id": "node\/3501375480", "name": "Lilly's Pizza", "phone": null, "website": null, "cuisine": "pizza" }, "geometry": { "type": "Point", "coordinates": [ -78.6466653, 35.8050808 ] } },
69 | { "type": "Feature", "properties": { "@id": "node\/3590210985", "name": "Ba-Da Wings", "phone": "+1-919-832-3902", "website": "http:\/\/www.badawings.com\/", "cuisine": "Wings" }, "geometry": { "type": "Point", "coordinates": [ -78.6758885, 35.7784182 ] } },
70 | { "type": "Feature", "properties": { "@id": "node\/3623985409", "name": "State of Beer", "phone": "+1-919-546-9116", "website": "http:\/\/stateof.beer\/", "cuisine": "sandwich" }, "geometry": { "type": "Point", "coordinates": [ -78.6453497, 35.7804078 ] } },
71 | { "type": "Feature", "properties": { "@id": "node\/3656191609", "name": "Jade Garden", "phone": "+1-919-594-1813", "website": null, "cuisine": "chinese" }, "geometry": { "type": "Point", "coordinates": [ -78.6556757, 35.7828092 ] } },
72 | { "type": "Feature", "properties": { "@id": "node\/3691460067", "name": "Shuckers Oyster Bar & Grill", "phone": null, "website": null, "cuisine": null }, "geometry": { "type": "Point", "coordinates": [ -78.6468158, 35.7871261 ] } },
73 | { "type": "Feature", "properties": { "@id": "node\/3691470161", "name": "Big Boom", "phone": null, "website": null, "cuisine": "italian" }, "geometry": { "type": "Point", "coordinates": [ -78.6470894, 35.7871021 ] } },
74 | { "type": "Feature", "properties": { "@id": "node\/3691476947", "name": "Carolina Ale House", "phone": null, "website": null, "cuisine": null }, "geometry": { "type": "Point", "coordinates": [ -78.6470814, 35.7865603 ] } },
75 | { "type": "Feature", "properties": { "@id": "node\/3691477972", "name": "Dos Taquitos", "phone": null, "website": null, "cuisine": "mexican" }, "geometry": { "type": "Point", "coordinates": [ -78.6471538, 35.7854833 ] } },
76 | { "type": "Feature", "properties": { "@id": "node\/3691491947", "name": "Plates Kitchen", "phone": null, "website": null, "cuisine": null }, "geometry": { "type": "Point", "coordinates": [ -78.6476301, 35.7843429 ] } },
77 | { "type": "Feature", "properties": { "@id": "node\/3796331874", "name": "Death & Taxes", "phone": "+1-984-242-0218", "website": "http:\/\/ac-restaurants.com\/death-taxes\/", "cuisine": null }, "geometry": { "type": "Point", "coordinates": [ -78.6404347, 35.7782232 ] } },
78 | { "type": "Feature", "properties": { "@id": "node\/3840045003", "name": "Gonza Tacos Y Tequila", "phone": "+1-919-268-8965", "website": "http:\/\/www.gonzatacosytequila.com", "cuisine": "mexican" }, "geometry": { "type": "Point", "coordinates": [ -78.663733, 35.7867649 ] } },
79 | { "type": "Feature", "properties": { "@id": "node\/3871422566", "name": "Noodles & Company", "phone": null, "website": null, "cuisine": null }, "geometry": { "type": "Point", "coordinates": [ -78.6616737, 35.7893909 ] } },
80 | { "type": "Feature", "properties": { "@id": "node\/3871422567", "name": "Cafe Carolina", "phone": null, "website": null, "cuisine": null }, "geometry": { "type": "Point", "coordinates": [ -78.6614989, 35.7891548 ] } }
81 | ]
82 | }
83 |
--------------------------------------------------------------------------------
/data/powercat.geojson:
--------------------------------------------------------------------------------
1 | {
2 | "type": "FeatureCollection",
3 | "features": [
4 | {
5 | "type": "Feature",
6 | "properties": {
7 | "Id": 0,
8 | "title": "",
9 | "description": ""
10 | },
11 | "geometry": {
12 | "type": "Polygon",
13 | "coordinates": [
14 | [
15 | [
16 | -96.661955,
17 | 39.252598
18 | ],
19 | [
20 | -96.593434,
21 | 39.248399
22 | ],
23 | [
24 | -96.593133,
25 | 39.245484
26 | ],
27 | [
28 | -96.593133,
29 | 39.242568
30 | ],
31 | [
32 | -96.594488,
33 | 39.239536
34 | ],
35 | [
36 | -96.596145,
37 | 39.236736
38 | ],
39 | [
40 | -96.599157,
41 | 39.23452
42 | ],
43 | [
44 | -96.602621,
45 | 39.232537
46 | ],
47 | [
48 | -96.607289,
49 | 39.230671
50 | ],
51 | [
52 | -96.612108,
53 | 39.229621
54 | ],
55 | [
56 | -96.617529,
57 | 39.229271
58 | ],
59 | [
60 | -96.621445,
61 | 39.229154
62 | ],
63 | [
64 | -96.626565,
65 | 39.229971
66 | ],
67 | [
68 | -96.632288,
69 | 39.231254
70 | ],
71 | [
72 | -96.636655,
73 | 39.23277
74 | ],
75 | [
76 | -96.642076,
77 | 39.235453
78 | ],
79 | [
80 | -96.647799,
81 | 39.238719
82 | ],
83 | [
84 | -96.652467,
85 | 39.242335
86 | ],
87 | [
88 | -96.657587,
89 | 39.247233
90 | ],
91 | [
92 | -96.661955,
93 | 39.252598
94 | ]
95 | ]
96 | ]
97 | },
98 | "id": "ci25vrn8c4c6ia7pcuhlehvb4"
99 | },
100 | {
101 | "type": "Feature",
102 | "properties": {
103 | "Id": 0,
104 | "title": "",
105 | "description": ""
106 | },
107 | "geometry": {
108 | "type": "Polygon",
109 | "coordinates": [
110 | [
111 | [
112 | -96.698248,
113 | 39.242685
114 | ],
115 | [
116 | -96.66587,
117 | 39.247816
118 | ],
119 | [
120 | -96.663009,
121 | 39.244901
122 | ],
123 | [
124 | -96.658943,
125 | 39.241402
126 | ],
127 | [
128 | -96.655328,
129 | 39.238603
130 | ],
131 | [
132 | -96.65066,
133 | 39.235337
134 | ],
135 | [
136 | -96.646293,
137 | 39.23277
138 | ],
139 | [
140 | -96.641624,
141 | 39.230671
142 | ],
143 | [
144 | -96.637408,
145 | 39.228454
146 | ],
147 | [
148 | -96.631986,
149 | 39.226588
150 | ],
151 | [
152 | -96.626565,
153 | 39.225538
154 | ],
155 | [
156 | -96.620993,
157 | 39.224838
158 | ],
159 | [
160 | -96.614668,
161 | 39.224838
162 | ],
163 | [
164 | -96.608343,
165 | 39.225538
166 | ],
167 | [
168 | -96.602771,
169 | 39.227171
170 | ],
171 | [
172 | -96.598705,
173 | 39.229388
174 | ],
175 | [
176 | -96.594037,
177 | 39.23242
178 | ],
179 | [
180 | -96.591326,
181 | 39.23557
182 | ],
183 | [
184 | -96.589218,
185 | 39.239186
186 | ],
187 | [
188 | -96.587712,
189 | 39.243151
190 | ],
191 | [
192 | -96.586959,
193 | 39.247233
194 | ],
195 | [
196 | -96.587109,
197 | 39.248983
198 | ],
199 | [
200 | -96.580935,
201 | 39.248749
202 | ],
203 | [
204 | -96.57461,
205 | 39.248399
206 | ],
207 | [
208 | -96.567984,
209 | 39.247933
210 | ],
211 | [
212 | -96.559852,
213 | 39.24735
214 | ],
215 | [
216 | -96.552473,
217 | 39.246533
218 | ],
219 | [
220 | -96.54419,
221 | 39.2456
222 | ],
223 | [
224 | -96.535606,
225 | 39.244318
226 | ],
227 | [
228 | -96.528378,
229 | 39.243151
230 | ],
231 | [
232 | -96.520396,
233 | 39.241402
234 | ],
235 | [
236 | -96.512716,
237 | 39.239652
238 | ],
239 | [
240 | -96.504885,
241 | 39.23732
242 | ],
243 | [
244 | -96.498108,
245 | 39.23452
246 | ],
247 | [
248 | -96.492687,
249 | 39.231954
250 | ],
251 | [
252 | -96.492687,
253 | 39.230904
254 | ],
255 | [
256 | -96.493139,
257 | 39.230671
258 | ],
259 | [
260 | -96.511662,
261 | 39.231721
262 | ],
263 | [
264 | -96.507295,
265 | 39.230904
266 | ],
267 | [
268 | -96.496301,
269 | 39.228688
270 | ],
271 | [
272 | -96.487717,
273 | 39.226471
274 | ],
275 | [
276 | -96.479435,
277 | 39.224138
278 | ],
279 | [
280 | -96.472809,
281 | 39.222271
282 | ],
283 | [
284 | -96.465881,
285 | 39.220055
286 | ],
287 | [
288 | -96.457448,
289 | 39.216788
290 | ],
291 | [
292 | -96.450521,
293 | 39.214104
294 | ],
295 | [
296 | -96.443443,
297 | 39.210837
298 | ],
299 | [
300 | -96.439226,
301 | 39.208504
302 | ],
303 | [
304 | -96.433654,
305 | 39.205236
306 | ],
307 | [
308 | -96.429739,
309 | 39.202552
310 | ],
311 | [
312 | -96.427179,
313 | 39.200452
314 | ],
315 | [
316 | -96.427028,
317 | 39.198118
318 | ],
319 | [
320 | -96.430944,
321 | 39.192399
322 | ],
323 | [
324 | -96.436365,
325 | 39.184579
326 | ],
327 | [
328 | -96.441334,
329 | 39.178859
330 | ],
331 | [
332 | -96.446455,
333 | 39.173255
334 | ],
335 | [
336 | -96.451274,
337 | 39.169052
338 | ],
339 | [
340 | -96.460912,
341 | 39.169869
342 | ],
343 | [
344 | -96.464074,
345 | 39.165783
346 | ],
347 | [
348 | -96.466785,
349 | 39.163097
350 | ],
351 | [
352 | -96.470098,
353 | 39.160762
354 | ],
355 | [
356 | -96.472056,
357 | 39.159828
358 | ],
359 | [
360 | -96.475068,
361 | 39.159945
362 | ],
363 | [
364 | -96.47326,
365 | 39.162046
366 | ],
367 | [
368 | -96.471754,
369 | 39.165082
370 | ],
371 | [
372 | -96.471604,
373 | 39.168585
374 | ],
375 | [
376 | -96.472658,
377 | 39.172788
378 | ],
379 | [
380 | -96.475971,
381 | 39.177341
382 | ],
383 | [
384 | -96.482145,
385 | 39.180726
386 | ],
387 | [
388 | -96.487567,
389 | 39.182361
390 | ],
391 | [
392 | -96.493591,
393 | 39.182361
394 | ],
395 | [
396 | -96.49856,
397 | 39.181894
398 | ],
399 | [
400 | -96.505487,
401 | 39.179793
402 | ],
403 | [
404 | -96.513017,
405 | 39.176407
406 | ],
407 | [
408 | -96.516933,
409 | 39.173489
410 | ],
411 | [
412 | -96.520547,
413 | 39.17057
414 | ],
415 | [
416 | -96.522655,
417 | 39.17057
418 | ],
419 | [
420 | -96.52642,
421 | 39.172438
422 | ],
423 | [
424 | -96.532594,
425 | 39.174773
426 | ],
427 | [
428 | -96.538618,
429 | 39.176407
430 | ],
431 | [
432 | -96.544761,
433 | 39.178513
434 | ],
435 | [
436 | -96.553226,
437 | 39.179676
438 | ],
439 | [
440 | -96.561659,
441 | 39.181077
442 | ],
443 | [
444 | -96.569791,
445 | 39.182244
446 | ],
447 | [
448 | -96.57717,
449 | 39.183061
450 | ],
451 | [
452 | -96.586658,
453 | 39.183761
454 | ],
455 | [
456 | -96.596898,
457 | 39.183761
458 | ],
459 | [
460 | -96.608945,
461 | 39.183178
462 | ],
463 | [
464 | -96.619336,
465 | 39.182361
466 | ],
467 | [
468 | -96.627318,
469 | 39.181077
470 | ],
471 | [
472 | -96.637709,
473 | 39.179442
474 | ],
475 | [
476 | -96.64569,
477 | 39.177691
478 | ],
479 | [
480 | -96.657286,
481 | 39.174889
482 | ],
483 | [
484 | -96.664515,
485 | 39.172788
486 | ],
487 | [
488 | -96.672647,
489 | 39.169753
490 | ],
491 | [
492 | -96.679574,
493 | 39.166717
494 | ],
495 | [
496 | -96.684995,
497 | 39.164031
498 | ],
499 | [
500 | -96.691019,
501 | 39.160529
502 | ],
503 | [
504 | -96.695989,
505 | 39.157142
506 | ],
507 | [
508 | -96.700808,
509 | 39.152705
510 | ],
511 | [
512 | -96.705476,
513 | 39.14815
514 | ],
515 | [
516 | -96.707886,
517 | 39.145698
518 | ],
519 | [
520 | -96.698248,
521 | 39.242685
522 | ]
523 | ]
524 | ]
525 | },
526 | "id": "ci25vrn8e4c6ja7pc2134p1ep"
527 | },
528 | {
529 | "type": "Feature",
530 | "properties": {
531 | "Id": 0,
532 | "title": "",
533 | "description": ""
534 | },
535 | "geometry": {
536 | "type": "Polygon",
537 | "coordinates": [
538 | [
539 | [
540 | -96.524462,
541 | 39.167534
542 | ],
543 | [
544 | -96.526269,
545 | 39.163681
546 | ],
547 | [
548 | -96.527775,
549 | 39.159127
550 | ],
551 | [
552 | -96.535907,
553 | 39.160529
554 | ],
555 | [
556 | -96.545696,
557 | 39.161813
558 | ],
559 | [
560 | -96.556238,
561 | 39.16263
562 | ],
563 | [
564 | -96.56452,
565 | 39.16263
566 | ],
567 | [
568 | -96.573556,
569 | 39.162163
570 | ],
571 | [
572 | -96.581688,
573 | 39.161229
574 | ],
575 | [
576 | -96.589519,
577 | 39.159478
578 | ],
579 | [
580 | -96.595844,
581 | 39.157259
582 | ],
583 | [
584 | -96.602169,
585 | 39.154106
586 | ],
587 | [
588 | -96.608343,
589 | 39.150135
590 | ],
591 | [
592 | -96.613162,
593 | 39.145464
594 | ],
595 | [
596 | -96.616927,
597 | 39.140442
598 | ],
599 | [
600 | -96.620089,
601 | 39.134017
602 | ],
603 | [
604 | -96.621897,
605 | 39.129228
606 | ],
607 | [
608 | -96.6228,
609 | 39.124088
610 | ],
611 | [
612 | -96.622047,
613 | 39.11848
614 | ],
615 | [
616 | -96.620993,
617 | 39.114273
618 | ],
619 | [
620 | -96.618734,
621 | 39.109483
622 | ],
623 | [
624 | -96.615572,
625 | 39.104224
626 | ],
627 | [
628 | -96.61271,
629 | 39.100368
630 | ],
631 | [
632 | -96.609698,
633 | 39.097446
634 | ],
635 | [
636 | -96.613915,
637 | 39.096277
638 | ],
639 | [
640 | -96.621746,
641 | 39.095225
642 | ],
643 | [
644 | -96.628673,
645 | 39.095108
646 | ],
647 | [
648 | -96.636655,
649 | 39.095576
650 | ],
651 | [
652 | -96.643281,
653 | 39.096628
654 | ],
655 | [
656 | -96.649907,
657 | 39.098498
658 | ],
659 | [
660 | -96.65563,
661 | 39.100835
662 | ],
663 | [
664 | -96.661352,
665 | 39.103523
666 | ],
667 | [
668 | -96.667075,
669 | 39.107262
670 | ],
671 | [
672 | -96.672195,
673 | 39.111352
674 | ],
675 | [
676 | -96.676713,
677 | 39.11661
678 | ],
679 | [
680 | -96.680026,
681 | 39.122686
682 | ],
683 | [
684 | -96.682586,
685 | 39.129111
686 | ],
687 | [
688 | -96.682736,
689 | 39.134134
690 | ],
691 | [
692 | -96.682285,
693 | 39.139157
694 | ],
695 | [
696 | -96.680779,
697 | 39.144179
698 | ],
699 | [
700 | -96.678369,
701 | 39.148851
702 | ],
703 | [
704 | -96.674454,
705 | 39.154106
706 | ],
707 | [
708 | -96.669785,
709 | 39.158543
710 | ],
711 | [
712 | -96.664515,
713 | 39.162163
714 | ],
715 | [
716 | -96.659545,
717 | 39.164966
718 | ],
719 | [
720 | -96.653672,
721 | 39.167651
722 | ],
723 | [
724 | -96.647196,
725 | 39.17022
726 | ],
727 | [
728 | -96.639667,
729 | 39.172671
730 | ],
731 | [
732 | -96.631986,
733 | 39.174422
734 | ],
735 | [
736 | -96.622047,
737 | 39.176057
738 | ],
739 | [
740 | -96.612409,
741 | 39.177224
742 | ],
743 | [
744 | -96.601265,
745 | 39.178041
746 | ],
747 | [
748 | -96.58982,
749 | 39.178275
750 | ],
751 | [
752 | -96.575815,
753 | 39.177341
754 | ],
755 | [
756 | -96.561659,
757 | 39.17559
758 | ],
759 | [
760 | -96.54916,
761 | 39.173255
762 | ],
763 | [
764 | -96.536058,
765 | 39.17057
766 | ],
767 | [
768 | -96.524462,
769 | 39.167534
770 | ]
771 | ]
772 | ]
773 | },
774 | "id": "ci25vrn8f4c6ka7pcyi2wqqn2"
775 | },
776 | {
777 | "type": "Feature",
778 | "properties": {
779 | "Id": 0,
780 | "title": "",
781 | "description": ""
782 | },
783 | "geometry": {
784 | "type": "Polygon",
785 | "coordinates": [
786 | [
787 | [
788 | -96.484254,
789 | 39.150369
790 | ],
791 | [
792 | -96.482898,
793 | 39.149668
794 | ],
795 | [
796 | -96.483049,
797 | 39.147333
798 | ],
799 | [
800 | -96.485007,
801 | 39.142427
802 | ],
803 | [
804 | -96.48847,
805 | 39.136587
806 | ],
807 | [
808 | -96.482145,
809 | 39.130863
810 | ],
811 | [
812 | -96.487115,
813 | 39.126074
814 | ],
815 | [
816 | -96.49344,
817 | 39.121167
818 | ],
819 | [
820 | -96.500367,
821 | 39.116961
822 | ],
823 | [
824 | -96.508048,
825 | 39.113105
826 | ],
827 | [
828 | -96.514824,
829 | 39.110067
830 | ],
831 | [
832 | -96.522806,
833 | 39.107496
834 | ],
835 | [
836 | -96.531088,
837 | 39.104925
838 | ],
839 | [
840 | -96.531992,
841 | 39.10773
842 | ],
843 | [
844 | -96.535456,
845 | 39.111586
846 | ],
847 | [
848 | -96.538769,
849 | 39.114157
850 | ],
851 | [
852 | -96.543738,
853 | 39.116844
854 | ],
855 | [
856 | -96.549913,
857 | 39.118129
858 | ],
859 | [
860 | -96.555635,
861 | 39.119064
862 | ],
863 | [
864 | -96.560605,
865 | 39.118713
866 | ],
867 | [
868 | -96.565876,
869 | 39.117662
870 | ],
871 | [
872 | -96.570695,
873 | 39.115909
874 | ],
875 | [
876 | -96.575062,
877 | 39.112988
878 | ],
879 | [
880 | -96.579128,
881 | 39.109483
882 | ],
883 | [
884 | -96.581387,
885 | 39.107029
886 | ],
887 | [
888 | -96.585754,
889 | 39.110184
890 | ],
891 | [
892 | -96.590272,
893 | 39.114858
894 | ],
895 | [
896 | -96.592983,
897 | 39.119765
898 | ],
899 | [
900 | -96.594639,
901 | 39.124204
902 | ],
903 | [
904 | -96.59494,
905 | 39.12806
906 | ],
907 | [
908 | -96.594187,
909 | 39.132032
910 | ],
911 | [
912 | -96.592681,
913 | 39.136237
914 | ],
915 | [
916 | -96.590121,
917 | 39.140675
918 | ],
919 | [
920 | -96.585905,
921 | 39.145347
922 | ],
923 | [
924 | -96.580182,
925 | 39.149435
926 | ],
927 | [
928 | -96.574008,
929 | 39.152121
930 | ],
931 | [
932 | -96.566478,
933 | 39.154223
934 | ],
935 | [
936 | -96.560454,
937 | 39.155274
938 | ],
939 | [
940 | -96.555183,
941 | 39.155858
942 | ],
943 | [
944 | -96.547804,
945 | 39.156091
946 | ],
947 | [
948 | -96.539221,
949 | 39.155624
950 | ],
951 | [
952 | -96.530185,
953 | 39.154456
954 | ],
955 | [
956 | -96.52883,
957 | 39.153289
958 | ],
959 | [
960 | -96.527474,
961 | 39.149084
962 | ],
963 | [
964 | -96.525366,
965 | 39.145814
966 | ],
967 | [
968 | -96.522806,
969 | 39.143478
970 | ],
971 | [
972 | -96.519192,
973 | 39.141026
974 | ],
975 | [
976 | -96.514674,
977 | 39.139624
978 | ],
979 | [
980 | -96.508499,
981 | 39.138923
982 | ],
983 | [
984 | -96.502777,
985 | 39.139274
986 | ],
987 | [
988 | -96.496151,
989 | 39.141726
990 | ],
991 | [
992 | -96.490428,
993 | 39.14523
994 | ],
995 | [
996 | -96.487416,
997 | 39.147449
998 | ],
999 | [
1000 | -96.484254,
1001 | 39.150369
1002 | ]
1003 | ]
1004 | ]
1005 | },
1006 | "id": "ci25vrn8h4c6la7pcl60u2hf3"
1007 | }
1008 | ]
1009 | }
1010 |
--------------------------------------------------------------------------------