-
Notifications
You must be signed in to change notification settings - Fork 87
/
RoutingService.js
166 lines (135 loc) · 4.54 KB
/
RoutingService.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
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
/**
* @module ngeo.routing.RoutingService
*/
/**
* Service to provide access to a [Open Source Routing Machine (OSRM) backend](https://github.com/Project-OSRM/osrm-backend)
* of version 5.8 and higher and its features.
* @param {angular.$http} $http Angular http service.
* @param {angular.$injector} $injector Main injector.
* @constructor
* @struct
* @ngdoc service
* @ngInject
* @export
* @ngname ngeoRoutingService
*/
const exports = function($http, $injector) {
/**
* @type {angular.$http}
* @private
*/
this.$http_ = $http;
/**
* @type {ngeox.RoutingOptions}
* @private
*/
this.routingOptions_ = $injector.has('ngeoRoutingOptions') ? $injector.get('ngeoRoutingOptions') : {};
/**
* URL for OSRM backend API.
* Defaults to demo backend.
* @type {string}
* @private
*/
this.ngeoOsrmBackendUrl_ = this.routingOptions_.backendUrl || 'https://router.project-osrm.org/';
// the url is expected to end with a slash
if (this.ngeoOsrmBackendUrl_.substr(-1) !== '/') {
this.ngeoOsrmBackendUrl_ += '/';
}
/**
* Version of the protocol implemented by the service.
* see: https://github.com/Project-OSRM/osrm-backend/blob/master/docs/http.md
* @type {string}
* @private
*/
this.protocolVersion_ = 'v1';
};
/**
* Route request
* @param {Array.<ol.Coordinate>} coordinates coordinates of the route (at least two!)
* @param {?Object} config optional configuration
* @return {!angular.$http.HttpPromise} promise of the OSRM API request
*/
exports.prototype.getRoute = function(coordinates, config) {
config = config || {};
// Service
// see: https://github.com/Project-OSRM/osrm-backend/blob/master/docs/http.md#requests
if (!config['service']) {
config['service'] = 'route'; // default to route
}
// Mode of transportation,
// can be: car, bike, foot
// see: https://github.com/Project-OSRM/osrm-backend/blob/master/docs/http.md#requests
//
// As of version 5.8.0, OSRM (server) does not support multiple profiles simultaneously.
// This means the value actually does not matter.
if (!config['profile']) {
config['profile'] = 'car'; // default to car
}
// build request URL
let url = this.ngeoOsrmBackendUrl_;
// Common workaround to provide multiple profiles (since it is not supported yet)
// Every profile runs on its own instance.
if (config['instance']) {
url += `${config['instance']}/`;
}
url += `${config['service']}/${this.protocolVersion_}/${config['profile']}/`;
// [ [a,b] , [c,d] ] -> 'a,b;c,d'
const coordinateString = coordinates.map(c => c.join(',')).join(';');
url += coordinateString;
// look for route service options
// see: https://github.com/Project-OSRM/osrm-backend/blob/master/docs/http.md#route-service
if (config.options) {
url += '?';
const options = [];
for (const option of Object.keys(config.options)) {
options.push(`${option}=${config.options[option]}`);
}
url += options.join('&');
}
return this.$http_.get(url);
};
/**
* Snaps a coordinate to the street network and returns the nearest match
* @param {ol.Coordinate} coordinate coordinate to query
* @param {?Object} config optional configuration
* @return {!angular.$http.HttpPromise} promise of the OSRM API request
* @see https://github.com/Project-OSRM/osrm-backend/blob/master/docs/http.md#nearest-service
*/
exports.prototype.getNearest = function(coordinate, config) {
config = config || {};
// service is always nearest
config['service'] = 'nearest';
// Mode of transportation
// If used in combination with a getRoute request, choose the same profile.
if (!config['profile']) {
config['profile'] = 'car'; // default to car
}
// build request URL
let url = this.ngeoOsrmBackendUrl_;
// Common workaround to provide multiple profiles (since it is not supported yet)
// Every profile runs on its own instance.
if (config['instance']) {
url += `${config['instance']}/`;
}
url += `${config['service']}/${this.protocolVersion_}/${config['profile']}/`;
// [a,b] -> 'a,b'
const coordinateString = coordinate.join(',');
url += coordinateString;
// look for nearest service options
if (config.options) {
url += '?';
const options = [];
for (const option of Object.keys(config.options)) {
options.push(`${option}=${config.options[option]}`);
}
url += options.join('&');
}
return this.$http_.get(url);
};
/**
* @type {!angular.Module}
*/
exports.module = angular.module('ngeoRoutingService', [
]);
exports.module.service('ngeoRoutingService', exports);
export default exports;