Name | URL | Description |
---|---|---|
score | / | Returns the Walk Score for a given location. |
Name | URL | Description |
---|---|---|
score | /transit/score/ | Returns the Transit Score for a given location. |
stop search | /transit/search/stops/ | Returns information about stops near a given location. |
network search | /transit/search/network/ | Returns connected stops and routes near a given location. |
stop detail | /transit/stop/ID/ | Returns details for a single stop. |
route detail | /transit/route/ID/ | Returns details for a single route. |
supported cities | /transit/supported/cities/ | Returns a list of cities for which scores are available. |
Name | URL | Description |
---|---|---|
traveltime | /api/v1/traveltime/json | Returns the travel time for a given location. |
1function getWalkScore(address, location) {
2 let deferred = Q.defer();
3 let url = 'http://api.walkscore.com/score?format=json&address='
4 + address + '&lat=' + location.lat + '&lon=' + location.lng
5 + '&wsapikey=' + globalKeys.walkScoreApiKey;
6
7 http.get(url, deferred.resolve);
8
9 return deferred.promise;
10}
11
12router.get('/api/walk/:address', function *(next) {
13 let address = this.params.address;
14 let location = ???
15 let walkScore = yield getWalkScore(address, location);
16
17 this.body = walkScore;
18});
1function getLocationFromGoogle(address) {
2 let deferred = Q.defer();
3 let url = 'https://maps.googleapis.com/maps/api/geocode/json?address='
4 + address + '&key=' + globalKeys.googleApiKey;
5
6 https.get(url, getJsonBody(function(payload) {
7 let location = payload.results[0].geometry.location;
8 deferred.resolve(location);
9 }));
10
11 return deferred.promise;
12}
13// Example usage:
14router.get('/api/walk/:address', function *(next) {
15 let address = this.params.address;
16 let location = yield getLocationFromGoogle(address);
17 let walkScore = yield getWalkScore(location);
18
19 this.body = walkScore;
20});
1function getJsonBody(callback) {
2 return function(response) {
3 let body = '';
4
5 response.on('data', function(data) {
6 body += data;
7 });
8
9 response.on('end', function() {
10 let payload = JSON.parse(body);
11 callback(payload);
12 });
13 }
14}
1» curl localhost:3000/api/walk/2025%201st%20Avenue%20Suite%20500,%20Seattle,%20WA%2098121
2{
3 "status": 1,
4 "walkscore": 96,
5 "description": "Walker's Paradise",
6 "updated": "2015-06-01 19:14:17.776200",
7 "logo_url": "https://cdn.walk.sc/images/api-logo.png",
8 "more_info_icon": "https://cdn.walk.sc/images/api-more-info.gif",
9 "more_info_link": "https://www.redfin.com/how-walk-score-works",
10 "ws_link": "https://www.walkscore.com/score/2025-1st-Avenue-Suite-500-Seattle-WA-98121/lat=47.6114682/lng=-122.3438233/?utm_source=redfin.com&utm_medium=ws_api&utm_campaign=ws_api",
11 "help_link": "https://www.redfin.com/how-walk-score-works",
12 "snapped_lat": 47.6115,
13 "snapped_lon": -122.3445
14}
1// Example usage:
2// curl localhost:3000/api/stop/fb1522a4c2ba626561...
3let http = require('http');
4
5function getStop(id) {
6 let deferred = Q.defer();
7 let url = 'http://transit.walkscore.com/transit/stop/' + id +
8 '?format=json&wsapikey=' + walkScoreApiKey;
9
10 http.get(url, deferred.resolve);
11
12 return deferred.promise;
13}
14
15router.get('/api/stop/:id', function *() {
16 let id = this.params.id;
17 let stop = yield getStop(id);
18
19 this.body = stop;
20});
1» curl localhost:3000/api/stops/> 2025%201st%20Avenue%20Suite%20500,%20Seattle,%20WA%2098121
2[{
3 "distance": 0.0437115618187228
4 , "name": "1ST AVE & LENORA ST"
5 , "summary_text": "1ST AVE & LENORA ST (0.0 mi) 99, 121"
6 , "summary_html": "<span class="walkscore"><span class="stop">1ST AVE & LENORA ST</span> <span class="distance">(0.0 mi)</span> <span class="Bus">99, 121</span></span>"
7 , "route_summary": [
8 {
9 "category": "Bus"
10 , "agency_url": "http://metro.kingcounty.gov"
11 , "agency": "Metro Transit"
12 , "id": "6fffc9e7af7a9a444b12fd2ae2685281ab42bc1e"
13 , "name": "99"
14 } ...
15 ]
16 , "lon": -122.3442
17 , "lat": 47.6120987
18 , "id": "fb1522a4c2ba6265619b2e7054a9f4c74ea11479"
19}, ...
1» curl localhost:3000/api/stop/fb1522a4c2ba6265619b2e7054a9f4c74ea11479
2{
3 "lat": 47.612098699999997,
4 "route_ids": [
5 "6fffc9e7af7a9a444b12fd2ae2685281ab42bc1e",
6 "4044a2ef14d364ccd302c29cbe1357fda79190f7"
7 ],
8 "lon": -122.3442,
9 "id": "fb1522a4c2ba6265619b2e7054a9f4c74ea11479",
10 "name": "1ST AVE & LENORA ST"
11}
1» curl localhost:3000/api/route/6fffc9e7af7a9a444b12fd2ae2685281ab42bc1e
2{
3 "category": "Bus",
4 "agency": "Metro Transit",
5 "name": "99",
6 "geometry_wkt": "LINESTRING(-122.322449 47.598351,-122.323097 47.598351,-122.323761 47.598351,-122.323753 47.599190,-122.324394 47.599194,-122.325058 47.599194,-122.326363 47.599194,-122.327011 47.599194,-122.327667 47.599201,-122.327927 47.599194,-122.328064 47.599201,-122.328995 47.599201,-122.329102 47.599201,-122.329216 47.599201,-122.329681 47.599201,-122.330223 47.599205,-122.330276 47.599201,-122.331581 47.599205,-122.332886 47.599205,-122.333023 47.599205,-122.334183 47.599205,-122.334183 47.599270,-122.334183 47.599339,-122.334183 47.600044,-122.334183 47.600079,-122.334183 47.600887,-122.334183 47.601513,-122.334183 47.601726,-122.334175 47.602440,-122.334282 47.602558,-122.334351 47.602627,-122.334801 47.603119,-122.334885 47.603203,-122.334938 47.603275,-122.335228 47.603577,-122.335281 47.603638,-122.335594 47.603981,-122.336235 47.604691,-122.336891 47.605404,-122.337479 47.606049,-122.337547 47.606117,-122.338203 47.606834,-122.339104 47.607826,-122.340019 47.608822,-122.340088 47.608898,-122.340919 47.609817,-122.340973 47.609867,-122.341347 47.610272,-122.341423 47.610371,-122.342613 47.611072,-122.343910 47.611839,-122.345207 47.612606,-122.346519 47.613373,-122.347710 47.614078,-122.347809 47.614136,-122.347832 47.614155,-122.348747 47.614697,-122.349693 47.615246,-122.350616 47.615799,-122.351547 47.616352,-122.352509 47.616920,-122.352928 47.616589,-122.353363 47.616253,-122.354225 47.615585,-122.354790 47.615158,-122.354843 47.615101,-122.354866 47.615055,-122.354881 47.615013,-122.354858 47.614952,-122.354797 47.614883,-122.354019 47.614429)",
7 "agency_url": "http://metro.kingcounty.gov",
8 "stop_ids": [
9 "4acb42872963cfc997727e58fba6bdf43d2fbf2d",
10 ...
11 "82ce6a3d3c303dd8368b3e5de9d5791636e3b01b"
12 ],
13 "id": "6fffc9e7af7a9a444b12fd2ae2685281ab42bc1e"
14}
1function initMap() {
2 map = new google.maps.Map(document.getElementById('map'), {
3 center: { lat: 47.61, lng: -122.34 },
4 zoom: 14
5 });
6
7 getRoute().then(function(payload) {
8 var routeCoords = linestringToCoordinates(payload.geometry_wkt);
9 var route = new google.maps.Polyline({
10 path: routeCoords,
11 geodesic: true,
12 strokeColor: '#FF0000',
13 strokeOpacity: 0.8,
14 strokeWeight: 2
15 });
16 route.setMap(map);
17 });
18}
1function getRoute() {
2 var url = "/api/route/6fffc9e7af7a9a444b12fd2ae2685281ab42bc1e";
3 var deferred = Q.defer();
4 var xhr = new XMLHttpRequest();
5
6 xhr.addEventListener('load', function() {
7 deferred.resolve(JSON.parse(this.responseText));
8 });
9 xhr.open("get", url, true);
10 xhr.send();
11
12 return deferred.promise;
13}
1function linestringToCoordinates(linestring) {
2 return linestring
3 .replace(/LINESTRING(/i, '')
4 .replace(/)/i, '')
5 .split(',')
6 .map(function(coord) {
7 var parts = coord.split(' ');
8 return { lat: parseFloat(parts[1]), lng: parseFloat(parts[0]) };
9 });
10}
1// Example usage:
2// curl localhost:3001/api/travel/2025%201st%20Avenue%20Suite%20500,%20Seattle,%20WA%2098121
3function getTravelTimePolygon(origin) {
4 let deferred = Q.defer();
5 let url = 'http://api2.walkscore.com/api/v1/traveltime_polygon/json?wsapikey=' + globalKeys.walkScoreApiKey
6 + '&origin=' + origin.lat + '%2C' + origin.lng + '&mode=bike&time=20';
7
8 http.get(url, deferred.resolve);
9
10 return deferred.promise;
11}
12router.get('/api/travel/:address', function *(next) {
13 let address = this.params.address;
14 let origin = yield getLocationFromGoogle(address);
15 let polygon = yield getTravelTimePolygon(origin);
16
17 this.body = polygon;
18 this.set({ "Content-Type": "application/json" });
19})
1» curl localhost:3000/api/travel/ 2025%201st%20Avenue%20Suite%20500,%20Seattle,%20WA%2098121
2{
3 "status": "OK"
4 , "response": {
5 "origin": "47.6114682,-122.3438233"
6 , "geometry": {
7 "type": "MultiPolygon"
8 , "coordinates": [[[
9 [
10 -122.35287965477173
11 , 47.65320077612875
12 ]
13 ...
14 ]]]
15 }
16 , "mode": "bike"
17 , "precision": 3
18 , "time": 20
19 }
20}
1function initMap() {
2 map = new google.maps.Map(document.getElementById('map'), {
3 center: { lat: 47.61, lng: -122.34 },
4 zoom: 13
5 });
6
7 getTravelTimePolygon().then(function(payload) {
8 var polyCoords = convertCoordinates(payload.response.geometry.coordinates);
9 var polygon = new google.maps.Polyline({
10 path: polyCoords,
11 geodesic: true,
12 strokeColor: '#FF0000',
13 strokeOpacity: 0.8,
14 strokeWeight: 2
15 });
16 polygon.setMap(map);
17 });
18}
1function getTravelTimePolygon() {
2 var url = "/api/travel/2025%201st%20Avenue%20Suite%20500,%20Seattle,%20WA%2098121";
3 var deferred = Q.defer();
4 var xhr = new XMLHttpRequest();
5
6 xhr.addEventListener('load', function() {
7 deferred.resolve(JSON.parse(this.responseText));
8 });
9 xhr.open("get", url, true);
10 xhr.send();
11
12 return deferred.promise;
13}
1function convertCoordinates(walkscoreCoords) {
2 var coords = walkscoreCoords[0][0];
3 return coords
4 .map(function(coord) {
5 console.log(coord);
6 return { lat: parseFloat(coord[1]), lng: parseFloat(coord[0]) };
7 });
8}
1git clone https://github.com/doug-wade/WalkScoreApi.git
1git clone https://github.com/doug-wade/slides