/
directions.js
125 lines (109 loc) · 3.33 KB
/
directions.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
var credentials = require('./credentials');
var Promise = require('bluebird');
var https = require('https');
function buildURL (orig,dest,waypoints) {
var base = "https://maps.googleapis.com/maps/api/directions/json";
var apiKey = credentials.gmapsApi;
var origin = encodeURIComponent(orig);
var destination = encodeURIComponent(dest);
wayptStr = '';
for (var i in waypoints){
wayptStr += "|" + encodeURIComponent(waypoints[i]);
}
var apiUrl =
base +
"?units=imperial&origin=" + origin +
"&destination=" + destination +
"&waypoints=optimize:true" + wayptStr +
"&key=" + apiKey;
return apiUrl;
}
function getRouteData(origin,dest,waypoints,personInfo){
var apiUrl = buildURL(origin,dest,waypoints);
return new Promise(function(resolve, reject) {
var request = https.request(apiUrl, function (res) {
var data = '';
res.on('data', function (chunk) {
data += chunk;
});
res.on('end', function () {
// parse the returned data
var obj = JSON.parse(data);
// add in details about people from user data
obj.personInfo = personInfo;
resolve(parseApiData(obj));
});
});
request.on('error', function (e) {
console.log(e.message);
reject(e.message);
});
request.end();
});
}
function parseApiData (data) {
//return data;
//console.log(data);
var obj = {};
var distance = 0; //meters
var duration = 0; // seconds
var legs = data.routes[0].legs;
var steps = [];
obj.waypoints = [];
obj.markers = [JSON.stringify(legs[0].start_location)];
obj.polylines = [];
obj.start = legs[0].start_address;
obj.end = legs[legs.length - 1].end_address;
obj.center = JSON.stringify(legs[0].start_location);
var stopOrder = data.routes[0].waypoint_order;
obj.bounds_ne = JSON.stringify(data.routes[0].bounds.northeast);
obj.bounds_sw = JSON.stringify(data.routes[0].bounds.southwest);
for (var i in legs){
steps.push(legs[i].steps);
obj.markers.push(JSON.stringify(legs[i].end_location));
distance += legs[i].distance.value;
duration += legs[i].duration.value;
var num = stopOrder[i];
var pObj = {};
// to get just the stops (not start/end pts), get end address for all but last leg
if (i < legs.length - 1){
// put location data back with person data in correct order
pObj.name = data.personInfo[num].name;
pObj.apt = data.personInfo[num].apt;
pObj.phone = data.personInfo[num].phone;
pObj.address = legs[i].end_address;
obj.waypoints.push(pObj);
}
}
obj.distance = convertMetersToMiles(distance);
obj.duration = convertSecToMin(duration);
obj.est_time = convertMinutesToText(obj.duration + (10 * legs.length));
for (var i in steps){
steps[i].forEach(function(step){
obj.polylines.push(escape(step.polyline.points));
});
}
return obj;
}
// ======= helper functions ======= //
function convertMetersToMiles(meters) {
return Math.round(meters * 0.000621371192);
}
function convertSecToMin(sec){
return Math.round(sec/60);
}
function convertMinutesToText (m) {
var hours = Math.floor(m / 60);
var minutes = Math.round(m - (hours * 60));
minutes = (minutes < 10 ? '0' : '') + minutes;
output = '';
if (hours){
output += hours + " hour";
}
if (hours > 1){
output += "s";
}
return output + ' ' + minutes + ' minutes';
}
// ===== export ===== //
module.exports = getRouteData;