From 614398ed6cb8bc37d727c0c76ee766519a834819 Mon Sep 17 00:00:00 2001 From: Patrick Niklaus Date: Fri, 17 Mar 2017 15:19:56 +0000 Subject: [PATCH] Integrate MLD in node bindings --- docs/nodejs/api.md | 237 +++++++++++++-------------- include/nodejs/node_osrm_support.hpp | 29 ++++ package.json | 36 ++-- scripts/build_api_docs.sh | 2 + src/nodejs/CMakeLists.txt | 2 +- src/nodejs/node_osrm.cpp | 144 +++++++--------- test/nodejs/index.js | 40 ++++- test/nodejs/osrm-data-path.js | 4 + test/nodejs/route.js | 26 +++ 9 files changed, 293 insertions(+), 227 deletions(-) diff --git a/docs/nodejs/api.md b/docs/nodejs/api.md index bbe8fcb45..fd6ab418e 100644 --- a/docs/nodejs/api.md +++ b/docs/nodejs/api.md @@ -1,18 +1,30 @@ -# OSRM + -The `OSRM` method is the main constructor for creating an OSRM instance. An OSRM instance requires a `.osrm` network, -which is prepared by the OSRM Backend C++ library. +### Table of Contents -You can create such a `.osrm` file by running the OSRM binaries we ship in `node_modules/osrm/lib/binding/` and default -profiles (e.g. for setting speeds and determining road types to route on) in `node_modules/osrm/profiles/`: +- [OSRM](#osrm) + - - [Methods](#methods) + - [General Options](#general-options) + - [route](#route) + - [nearest](#nearest) + - [table](#table) + - [tile](#tile) + - [match](#match) + - [trip](#trip) +- [Responses](#responses) + - [Route](#route-1) + - [RouteLeg](#routeleg) + - [RouteStep](#routestep) + - [StepManeuver](#stepmaneuver) + - [Waypoint](#waypoint) - node_modules/osrm/lib/binding/osrm-extract data.osm.pbf -p node_modules/osrm/profiles/car.lua - node_modules/osrm/lib/binding/osrm-contract data.osrm +## OSRM -Consult the [osrm-backend](https://github.com/Project-OSRM/osrm-backend) documentation or further details. - -Once you have a complete `network.osrm` file, you can calculate networks in javascript with this library using the -methods below. To create an OSRM instance with your network you need to construct an instance like this: +The `OSRM` method is the main constructor for creating an OSRM instance. +An OSRM instance requires a `.osrm` dataset, which is prepared by the OSRM toolchain. +The documentation on `osrm-extract` and `osrm-contract` for more information. +Once you have a complete `network.osrm` file, you can calculate routes in javascript with this library using the methods below. +To create an OSRM instance with your network you need to construct an instance like this: ```javascript var osrm = new OSRM('network.osrm'); @@ -26,41 +38,44 @@ var osrm = new OSRM('network.osrm'); | [`osrm.nearest`](#nearest) | returns the nearest street segment for a given coordinate | | [`osrm.table`](#table) | computes distance tables for given coordinates | | [`osrm.match`](#match) | matches given coordinates to the road network | -| [`osrm.trip`](#trip) | Compute the shortest trip between given coordinates | +| [`osrm.trip`](#trip) | computes the shortest trip between given coordinates | | [`osrm.tile`](#tile) | Return vector tiles containing debugging info | #### General Options -Each OSRM method (except for `OSRM.tile()`) has set of general options as well as unique options, outlined below. +Each OSRM method (except for `OSRM.tile()`) has set of general options as well as unique options, +outlined below. -| Option | Values | Description | Format | -| --------------- | ------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | -| coordinates | `array` of `coordinate` elements: `[{coordinate}, ...]` | The coordinates this request will use. | `array` with `[{lon},{lat}]` values, in decimal degrees | -| bearings | `array` of `bearing` elements: `[{bearing}, ...]` | Limits the search to segments with given bearing in degrees towards true north in clockwise direction. | `null` or `array` with `[{value},{range}]` `integer 0 .. 360,integer 0 .. 180` | -| radiuses | `array` of `radius` elements: `[{radius}, ...]` | Limits the search to given radius in meters. | `null` or `double >= 0` or `unlimited` (default) | -| hints | `array` of `hint` elements: `[{hint}, ...]` | Hint to derive position in street network. | Base64 `string` | -| generate\_hints | `true` (default) or `false` | Adds a Hint to the response which can be used in subsequent requests, see `hints` parameter. | `Boolean` | +| Option | Values | Description | Format | +| ----------- | ------------------------------------------------------- | ------------------------------------------------------------------------------------------------------ | ------------------------------------------------------------------------------ | +| coordinates | `array` of `coordinate` elements: `[{coordinate}, ...]` | The coordinates this request will use. | `array` with `[{lon},{lat}]` values, in decimal degrees | +| bearings | `array` of `bearing` elements: `[{bearing}, ...]` | Limits the search to segments with given bearing in degrees towards true north in clockwise direction. | `null` or `array` with `[{value},{range}]` `integer 0 .. 360,integer 0 .. 180` | +| radiuses | `array` of `radius` elements: `[{radius}, ...]` | Limits the search to given radius in meters. | `null` or `double >= 0` or `unlimited` (default) | +| hints | `array` of `hint` elements: `[{hint}, ...]` | Hint to derive position in street network. | Base64 `string` | -## route +### route Returns the fastest route between two or more coordinates while visiting the waypoints in order. **Parameters** - `options` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** Object literal containing parameters for the route query. - - `options.alternatives` **\[[Boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)]** Search for alternative routes and return as well. _Please note that even if an alternative route is requested, a result cannot be guaranteed._ (optional, default `false`) - - `options.steps` **\[[Boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)]** Return route steps for each route leg. (optional, default `false`) - - `options.annotations` **\[[Boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)] or \[[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)>]** Return annotations for each route leg for duration, nodes, distance, weight, datasources and/or speed. Annotations can be `false` or `true` (no/full annotations) or an array of strings with `duration`, `nodes`, `distance`, `weight`, `datasources`, `speed`. (optional, default `false`) - - `options.geometries` **\[[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)]** Returned route geometry format (influences overview and per step). Can also be `geojson`. (optional, default `polyline`) - - `options.overview` **\[[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)]** Add overview geometry either `full`, `simplified` according to highest zoom level it could be display on, or not at all (`false`). (optional, default `simplified`) - - `options.continue_straight` **\[[Boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)]** Forces the route to keep going straight at waypoints and don't do a uturn even if it would be faster. Default value depends on the profile. `null`/`true`/`false` + - `options.alternatives` **[Boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)?** Search for alternative routes and return as well. + _Please note that even if an alternative route is requested, a result cannot be guaranteed._ (optional, default `false`) + - `options.steps` **[Boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)?** Return route steps for each route leg. (optional, default `false`) + - `options.geometries` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)?** Returned route geometry format (influences overview and per step). Can also be `geojson`. (optional, default `polyline`) + - `options.overview` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)?** Add overview geometry either `full`, `simplified` according to highest zoom level it could be display on, or not at all (`false`). (optional, default `simplified`) + - `options.continue_straight` **[Boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)?** Forces the route to keep going straight at waypoints and don't do a uturn even if it would be faster. Default value depends on the profile. + `null`/`true`/`false` +- `or` **[Boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** {Array} [options.annotations=false] Return annotations for each route leg. + Can be `false`, `true` or an array with strings of `duration`, `nodes`, `distance`, `weight`, `datasources`, `speed`. - `callback` **[Function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function)** **Examples** ```javascript var osrm = new OSRM("berlin-latest.osrm"); -osrm.route({coordinates: [[13.438640,52.519930], [13.415852, 52.513191]]}, function(err, result) { +osrm.route({coordinates: [[52.519930,13.438640], [52.513191,13.415852]]}, function(err, result) { if(err) throw err; console.log(result.waypoints); // array of Waypoint objects representing all waypoints in order console.log(result.routes); // array of Route objects ordered by descending recommendation rank @@ -69,7 +84,7 @@ osrm.route({coordinates: [[13.438640,52.519930], [13.415852, 52.513191]]}, funct Returns **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** An array of [Waypoint](#waypoint) objects representing all waypoints in order AND an array of [`Route`](#route) objects ordered by descending recommendation rank. -## nearest +### nearest Snaps a coordinate to the street network and returns the nearest n matches. @@ -78,7 +93,7 @@ Note: `coordinates` in the general options only supports a single `{longitude},{ **Parameters** - `options` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** Object literal containing parameters for the nearest query. - - `options.number` **\[[Number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)]** Number of nearest segments that should be returned. + - `options.number` **[Number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)?** Number of nearest segments that should be returned. Must be an integer greater than or equal to `1`. (optional, default `1`) - `callback` **[Function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function)** @@ -98,19 +113,21 @@ osrm.nearest(options, function(err, response) { Returns **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** containing `waypoints`. **`waypoints`**: array of [`Ẁaypoint`](#waypoint) objects sorted by distance to the input coordinate. -Each object has an additional `distance` property, which is the distance in meters to the supplied -input coordinate. + Each object has an additional `distance` property, which is the distance in meters to the supplied input coordinate. -## table +### table -Computes duration tables for the given locations. Allows for both symmetric and asymmetric tables. +Computes duration tables for the given locations. Allows for both symmetric and asymmetric +tables. **Parameters** - `options` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** Object literal containing parameters for the table query. - - `options.sources` **\[[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)]** An array of `index` elements (`0 <= integer < #coordinates`) to use + - `options.sources` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)?** An array of `index` elements (`0 <= integer < #coordinates`) to + use location with given index as source. Default is to use all. - - `options.destinations` **\[[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)]** An array of `index` elements (`0 <= integer < #coordinates`) to use location with given index as destination. Default is to use all. + - `options.destinations` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)?** An array of `index` elements (`0 <= integer < + #coordinates`) to use location with given index as destination. Default is to use all. - `callback` **[Function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function)** **Examples** @@ -132,24 +149,25 @@ osrm.table(options, function(err, response) { ``` Returns **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** containing `durations`, `sources`, and `destinations`. -**`durations`**: array of arrays that stores the matrix in row-major order. `durations[i][j]` -gives the travel time from the i-th waypoint to the j-th waypoint. Values are given in seconds. +**`durations`**: array of arrays that stores the matrix in row-major order. `durations[i][j]` gives the travel time from the i-th waypoint to the j-th waypoint. + Values are given in seconds. **`sources`**: array of [`Ẁaypoint`](#waypoint) objects describing all sources in order. **`destinations`**: array of [`Ẁaypoint`](#waypoint) objects describing all destinations in order. -## tile +### tile This generates [Mapbox Vector Tiles](https://mapbox.com/vector-tiles) that can be viewed with a vector-tile capable slippy-map viewer. The tiles contain road geometries and metadata that can be used to examine the routing graph. The tiles are generated directly from the data in-memory, -so are in sync with actual routing results, and let you examine which roads are actually routable, +so are in sync with actual routing results, and let you examine which roads are actually +routable, and what weights they have applied. **Parameters** - `ZXY` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)** an array consisting of `x`, `y`, and `z` values representing tile coordinates like - [wiki.openstreetmap.org/wiki/Slippy_map_tilenames](https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames) - and are supported by vector tile viewers like [Mapbox GL JS]\(. + [wiki.openstreetmap.org/wiki/Slippy_map_tilenames](https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames) + and are supported by vector tile viewers like [Mapbox GL JS](https://www.mapbox.com/mapbox-gl-js/api/). - `callback` **[Function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function)** **Examples** @@ -164,7 +182,7 @@ osrm.tile([0, 0, 0], function(err, response) { Returns **[Buffer](https://nodejs.org/api/buffer.html)** contains a Protocol Buffer encoded vector tile. -## match +### match Map matching matches given GPS points to the road network in the most plausible way. Please note the request might result multiple sub-traces. Large jumps in the timestamps @@ -175,15 +193,13 @@ if they can not be matched successfully. **Parameters** - `options` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** Object literal containing parameters for the match query. - - `options.steps` **\[[Boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)]** Return route steps for each route. (optional, default `false`) - - `options.annotations` **\[[Boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)] or \[[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)>]** Return annotations for each route leg for duration, nodes, distance, weight, datasources and/or speed. Annotations can be `false` or `true` (no/full annotations) or an array of strings with `duration`, `nodes`, `distance`, `weight`, `datasources`, `speed`. (optional, default `false`) - - `options.geometries` **\[[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)]** Returned route geometry format (influences overview - and per step). Can also be `geojson`. (optional, default `polyline`) - - `options.overview` **\[[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)]** Add overview geometry either `full`, `simplified` - according to highest zoom level it could be display on, or not at all (`false`). (optional, default `simplified`) - - `options.timestamps` **\[[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<[Number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)>]** Timestamp of the input location (integers, UNIX-like timestamp). - - `options.radiuses` **\[[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)]** Standard deviation of GPS precision used for map matching. - If applicable use GPS accuracy (`double >= 0`, default `5m`). + - `options.steps` **[Boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)?** Return route steps for each route. (optional, default `false`) + - `options.geometries` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)?** Returned route geometry format (influences overview and per step). Can also be `geojson`. (optional, default `polyline`) + - `options.overview` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)?** Add overview geometry either `full`, `simplified` according to highest zoom level it could be display on, or not at all (`false`). (optional, default `simplified`) + - `options.timestamps` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<[Number](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Number)>?** Timestamp of the input location (integers, UNIX-like timestamp). + - `options.radiuses` **[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)?** Standard deviation of GPS precision used for map matching. If applicable use GPS accuracy (`double >= 0`, default `5m`). +- `or` **[Boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** {Array} [options.annotations=false] Return annotations for each route leg. + Can be `false`, `true` or an array with strings of `duration`, `nodes`, `distance`, `weight`, `datasources`, `speed`. - `callback` **[Function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function)** **Examples** @@ -203,53 +219,36 @@ osrm.match(options, function(err, response) { Returns **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** containing `tracepoints` and `matchings`. **`tracepoints`** Array of [`Ẁaypoint`](#waypoint) objects representing all points of the trace in order. -If the trace point was ommited by map matching because it is an outlier, the entry will be null. Each -`Waypoint` object includes two additional properties, 1) `matchings_index`: Index to the -[`Route`](#route) object in matchings the sub-trace was matched to, 2) `waypoint_index`: Index of -the waypoint inside the matched route. -**`matchings`** is an array of [`Route`](#route) objects that -assemble the trace. Each `Route` object has an additional `confidence` property, which is the confidence of -the matching. float value between `0` and `1`. `1` is very confident that the matching is correct. + If the trace point was ommited by map matching because it is an outlier, the entry will be null. + Each `Waypoint` object includes two additional properties, 1) `matchings_index`: Index to the + [`Route`](#route) object in matchings the sub-trace was matched to, 2) `waypoint_index`: Index of + the waypoint inside the matched route. +**`matchings`** is an array of [`Route`](#route) objects that assemble the trace. Each `Route` object has an additional `confidence` property, + which is the confidence of the matching. float value between `0` and `1`. `1` is very confident that the matching is correct. -## trip +### trip -The trip plugin solves the Traveling Salesman Problem using a greedy heuristic (farthest-insertion algorithm). The returned path does not have to be the fastest path, as TSP is NP-hard it is only an approximation. Note that all input coordinates have to be connected for the trip service to work. +The trip plugin solves the Traveling Salesman Problem using a greedy heuristic +(farthest-insertion algorithm) for 10 or _ more waypoints and uses brute force for less than 10 +waypoints. The returned path does not have to be the shortest path, _ as TSP is NP-hard it is +only an approximation. +Note that all input coordinates have to be connected for the trip service to work. + +**Parameters** -**Parameters** - `options` **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** Object literal containing parameters for the trip query. - - `options.roundtrip` **\[[Boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)]** Return route is a roundtrip. (optional, default `true`) - - `options.source` **\[[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)]** Return route starts at `any` coordinate. Can also be `first`. (optional, default `any`) - - `options.destination` **\[[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)]** Return route ends at `any` coordinate. Can also be `last`. (optional, default `any`) - - `options.steps` **\[[Boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)]** Return route steps for each route. (optional, default `false`) - - `options.annotations` **\[[Boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)] or \[[Array](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array)<[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)>]** Return annotations for each route leg for duration, nodes, distance, weight, datasources and/or speed. Annotations can be `false` or `true` (no/full annotations) or an array of strings with `duration`, `nodes`, `distance`, `weight`, `datasources`, `speed`. (optional, default `false`) - - `options.geometries` **\[[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)]** Returned route geometry format (influences overview - and per step). Can also be `geojson`. (optional, default `polyline`) - - `options.overview` **\[[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)]** Add overview geometry either `full`, `simplified` (optional, default `simplified`) + - `options.steps` **[Boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)?** Return route steps for each route. (optional, default `false`) + - `options.geometries` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)?** Returned route geometry format (influences overview and per step). Can also be `geojson`. (optional, default `polyline`) + - `options.overview` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)?** Add overview geometry either `full`, `simplified` (optional, default `simplified`) + - `options.roundtrip` **[Boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)?** Return route is a roundtrip. (optional, default `true`) + - `options.source` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)?** Return route starts at `any` or `first` coordinate. (optional, default `any`) + - `options.destination` **[String](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String)?** Return route ends at `any` or `last` coordinate. (optional, default `any`) +- `or` **[Boolean](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Boolean)** {Array} [options.annotations=false] Return annotations for each route leg. Can be `false`, + `true` or an array with strings of `duration`, `nodes`, `distance`, `weight`, `datasources`, `speed`. - `callback` **[Function](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Statements/function)** -**Fixing Start and End Points** - -It is possible to explicitly set the start or end coordinate of the trip. When source is set to `first`, the first coordinate is used as start coordinate of the trip in the output. When destination is set to `last`, the last coordinate will be used as destination of the trip in the returned output. If you specify `any`, any of the coordinates can be used as the first or last coordinate in the output. - -However, if `source=any&destination=any` the returned round-trip will still start at the first input coordinate by default. - -Currently, not all combinations of `roundtrip`, `source` and `destination` are supported. -Right now, the following combinations are possible: - -| roundtrip | source | destination | supported | -| :-- | :-- | :-- | :-- | -| true | first | last | **yes** | -| true | first | any | **yes** | -| true | any | last | **yes** | -| true | any | any | **yes** | -| false | first | last | **yes** | -| false | first | any | no | -| false | any | last | no | -| false | any | any | no | - **Examples** -Roundtrip Request ```javascript var osrm = new OSRM('network.osrm'); var options = { @@ -265,69 +264,57 @@ osrm.trip(options, function(err, response) { }); ``` -Non Roundtrip Request -```javascript -var osrm = new OSRM('network.osrm'); -var options = { - coordinates: [ - [13.36761474609375, 52.51663871100423], - [13.374481201171875, 52.506191342034576] - ], - source: "first", - destination: "last", - roundtrip: false -} -osrm.trip(options, function(err, response) { - if (err) throw err; - console.log(response.waypoints); // array of Waypoint objects - console.log(response.trips); // array of Route objects -}); -``` - Returns **[Object](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object)** containing `waypoints` and `trips`. -**`waypoints`**: an array of [`Ẁaypoint`](#waypoint) objects representing all waypoints in input order. -Each Waypoint object has the following additional properties, 1) `trips_index`: index to trips of the -sub-trip the point was matched to, and 2) `waypoint_index`: index of the point in the trip. +**`waypoints`**: an array of [`Waypoint`](#waypoint) objects representing all waypoints in input order. + Each Waypoint object has the following additional properties, + 1) `trips_index`: index to trips of the sub-trip the point was matched to, + and 2) `waypoint_index`: index of the point in the trip. **`trips`**: an array of [`Route`](#route) objects that assemble the trace. -# Responses +## Responses Responses -## Route +### Route Represents a route through (potentially multiple) waypoints. **Parameters** -- `exteral` **documentation** in [`osrm-backend`](https://github.com/Project-OSRM/osrm-backend/blob/master/docs/http.md#route) +- `exteral` **documentation** in + [`osrm-backend`](../http.md#route) -## RouteLeg +### RouteLeg Represents a route between two waypoints. **Parameters** -- `exteral` **documentation** in [`osrm-backend`](https://github.com/Project-OSRM/osrm-backend/blob/master/docs/http.md#routeleg) +- `exteral` **documentation** in + [`osrm-backend`](../http.md#routeleg) -## RouteStep +### RouteStep -A step consists of a maneuver such as a turn or merge, followed by a distance of travel along a single way to the subsequent step. +A step consists of a maneuver such as a turn or merge, followed by a distance of travel along a +single way to the subsequent step. **Parameters** -- `exteral` **documentation** in [`osrm-backend`](https://github.com/Project-OSRM/osrm-backend/blob/master/docs/http.md#routestep) +- `exteral` **documentation** in + [`osrm-backend`](https://github.com/Project-OSRM/osrm-backend/blob/master/docs/http.md#routestep) -## StepManeuver +### StepManeuver **Parameters** -- `exteral` **documentation** in [`osrm-backend`](https://github.com/Project-OSRM/osrm-backend/blob/master/docs/http.md#stepmanuever) +- `exteral` **documentation** in + [`osrm-backend`](https://github.com/Project-OSRM/osrm-backend/blob/master/docs/http.md#stepmaneuver) -## Waypoint +### Waypoint Object used to describe waypoint on a route. **Parameters** -- `exteral` **documentation** in [`osrm-backend`](https://github.com/Project-OSRM/osrm-backend/blob/master/docs/http.md#waypoint) +- `exteral` **documentation** in + [`osrm-backend`](https://github.com/Project-OSRM/osrm-backend/blob/master/docs/http.md#waypoint) diff --git a/include/nodejs/node_osrm_support.hpp b/include/nodejs/node_osrm_support.hpp index 2ddde9a36..adf128674 100644 --- a/include/nodejs/node_osrm_support.hpp +++ b/include/nodejs/node_osrm_support.hpp @@ -117,6 +117,7 @@ inline engine_config_ptr argumentsToEngineConfig(const Nan::FunctionCallbackInfo { engine_config->storage_config = osrm::StorageConfig(*v8::String::Utf8Value(Nan::To(path).ToLocalChecked())); + engine_config->use_shared_memory = false; } if (!shared_memory->IsUndefined()) { @@ -138,6 +139,34 @@ inline engine_config_ptr argumentsToEngineConfig(const Nan::FunctionCallbackInfo return engine_config_ptr(); } + auto algorithm = params->Get(Nan::New("algorithm").ToLocalChecked()); + if (algorithm->IsString()) + { + auto algorithm_str = Nan::To(algorithm).ToLocalChecked(); + if (*v8::String::Utf8Value(algorithm_str) == std::string("CH")) + { + engine_config->algorithm = osrm::EngineConfig::Algorithm::CH; + } + else if (*v8::String::Utf8Value(algorithm_str) == std::string("CoreCH")) + { + engine_config->algorithm = osrm::EngineConfig::Algorithm::CoreCH; + } + else if (*v8::String::Utf8Value(algorithm_str) == std::string("MLD")) + { + engine_config->algorithm = osrm::EngineConfig::Algorithm::MLD; + } + else + { + Nan::ThrowError("algorithm option must be one of 'CH', 'CoreCH', or 'MLD'."); + return engine_config_ptr(); + } + } + else if (!algorithm->IsUndefined()) + { + Nan::ThrowError("algorithm option must be a string and one of 'CH', 'CoreCH', or 'MLD'."); + return engine_config_ptr(); + } + return engine_config; } diff --git a/package.json b/package.json index bc65c0b7b..1d4ebe478 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "osrm", - "version": "5.7.0", + "version": "5.7.0-latest", "private": true, "description": "The Open Source Routing Machine is a high performance routing engine written in C++14 designed to run on OpenStreetMap data.", "dependencies": { @@ -8,15 +8,14 @@ "cucumber": "^1.2.1", "d3-queue": "^2.0.3", "mkdirp": "^0.5.1", + "nan": "^2.1.0", + "node-cmake": "^1.2.1", + "node-pre-gyp": "^0.6.34", "node-timeout": "0.0.4", "polyline": "^0.2.0", "request": "^2.69.0", "rimraf": "^2.5.4", - "xmlbuilder": "^4.2.1", - - "nan": "^2.1.0", - "node-cmake": "^1.2.1", - "node-pre-gyp": "~0.6.30" + "xmlbuilder": "^4.2.1" }, "bin": { "cucumber": "./node_modules/cucumber/bin/cucumber.js" @@ -32,17 +31,15 @@ "test": "npm run lint && node ./node_modules/cucumber/bin/cucumber.js features/ -p verify && node ./node_modules/cucumber/bin/cucumber.js features/ -p mld", "clean-test": "rm -rf test/cache", "cucumber": "./node_modules/cucumber/bin/cucumber.js", - "build-api-docs": "./scripts/build_api_docs.sh", - - "preinstall": "npm install node-pre-gyp", + "docs": "./scripts/build_api_docs.sh", "install": "node-pre-gyp install --fallback-to-build=false" }, "repository": { "type": "git", "url": "https://github.com/Project-OSRM/osrm-backend.git" }, - "author": "", - "license": "ISC", + "author": "Project OSRM Team", + "license": "BSD 2-Clause", "bugs": { "url": "https://github.com/Project-OSRM/osrm-backend/issues" }, @@ -51,12 +48,23 @@ "node": ">=4.0.0" }, "devDependencies": { + "aws-sdk": "~2.0.31", + "babel-cli": "^6.24.0", + "babel-polyfill": "^6.23.0", + "babel-preset-es2015": "^6.24.0", + "babel-preset-react": "^6.23.0", + "babel-preset-stage-0": "^6.22.0", + "babelify": "^7.3.0", + "brfs": "^1.4.3", + "browserify": "^14.1.0", "docbox": "^1.0.2", "eslint": "^2.4.0", - - "aws-sdk": "~2.0.31", - "tape": "^4.2.2" + "tape": "^4.2.2", + "uglifyjs": "^2.4.10" }, + "bundleDependencies": [ + "node-pre-gyp" + ], "main": "lib/index.js", "binary": { "module_name": "node-osrm", diff --git a/scripts/build_api_docs.sh b/scripts/build_api_docs.sh index 46a71c542..2d14bd402 100755 --- a/scripts/build_api_docs.sh +++ b/scripts/build_api_docs.sh @@ -14,6 +14,8 @@ babel -V >/dev/null 2>&1 || { echo >&2 "Can't find babel. Add node_modules/.bin browserify --help >/dev/null 2>&1 || { echo >&2 "Can't find browserify. Add node_modules/.bin to your path, or run via \"npm run\""; exit 1; } uglifyjs -V >/dev/null 2>&1 || { echo >&2 "Can't find uglifyjs. Add node_modules/.bin to your path, or run via \"npm run\""; exit 1; } +documentation build src/nodejs/node_osrm.cpp --polyglot -f md -o docs/nodejs/api.md + # Clean up previous version rm -rf build/docs diff --git a/src/nodejs/CMakeLists.txt b/src/nodejs/CMakeLists.txt index b21917fa7..fe39eee6c 100644 --- a/src/nodejs/CMakeLists.txt +++ b/src/nodejs/CMakeLists.txt @@ -20,7 +20,7 @@ target_link_libraries(node-osrm osrm) # node-osrm artifacts in ${BINDING_DIR} to depend targets on set(ARTIFACTS "") -set(OSRM_BINARIES osrm-extract osrm-contract osrm-routed osrm-datastore osrm-components) +set(OSRM_BINARIES osrm-extract osrm-contract osrm-routed osrm-datastore osrm-components osrm-partition osrm-customize) foreach(binary ${OSRM_BINARIES}) add_custom_command(OUTPUT ${BINDING_DIR}/${binary} COMMAND ${CMAKE_COMMAND} -E copy $ ${BINDING_DIR} diff --git a/src/nodejs/node_osrm.cpp b/src/nodejs/node_osrm.cpp index d70af09e9..fce2eaf4e 100644 --- a/src/nodejs/node_osrm.cpp +++ b/src/nodejs/node_osrm.cpp @@ -48,15 +48,14 @@ NAN_MODULE_INIT(Engine::Init) Nan::Set(target, whoami, fn); } +// clang-format off /** * - * The `OSRM` method is the main constructor for creating an OSRM instance. An OSRM instance - * requires a `.osrm` network, - * which is prepared by the OSRM Backend C++ library. Once you have a complete `network.osrm` file, - * you can calculate - * networks in javascript with this library using the methods below. To create an OSRM instance with - * your network - * you need to construct an instance like this: + * The `OSRM` method is the main constructor for creating an OSRM instance. + * An OSRM instance requires a `.osrm` dataset, which is prepared by the OSRM toolchain. + * The documentation on `osrm-extract` and `osrm-contract` for more information. + * Once you have a complete `network.osrm` file, you can calculate routes in javascript with this library using the methods below. + * To create an OSRM instance with your network you need to construct an instance like this: * * ```javascript * var osrm = new OSRM('network.osrm'); @@ -78,27 +77,18 @@ NAN_MODULE_INIT(Engine::Init) * Each OSRM method (except for `OSRM.tile()`) has set of general options as well as unique options, * outlined below. * - * | Option | Values | Description - * | Format | - * | ----------- | ------------------------------------------------------- | - * ------------------------------------------------------------------------------------------------------ - * | ------------------------------------------------------------------------------ | - * | coordinates | `array` of `coordinate` elements: `[{coordinate}, ...]` | The coordinates this - * request will use. | `array` with - * `[{lon},{lat}]` values, in decimal degrees | - * | bearings | `array` of `bearing` elements: `[{bearing}, ...]` | Limits the search to - * segments with given bearing in degrees towards true north in clockwise direction. | `null` or - * `array` with `[{value},{range}]` `integer 0 .. 360,integer 0 .. 180` | - * | radiuses | `array` of `radius` elements: `[{radius}, ...]` | Limits the search to - * given radius in meters. | `null` or - * `double >= 0` or `unlimited` (default) | - * | hints | `array` of `hint` elements: `[{hint}, ...]` | Hint to derive position - * in street network. | Base64 `string` - * | + * | Option | Values | Description | Format | + * | ----------- | -----------------| ------------ | -------| + * | coordinates | `array` of `coordinate` elements: `[{coordinate}, ...]` | The coordinates this request will use. | `array` with `[{lon},{lat}]` values, in decimal degrees | + * | bearings | `array` of `bearing` elements: `[{bearing}, ...]` | Limits the search to segments with given bearing in degrees towards true north in clockwise direction. | `null` or `array` with `[{value},{range}]` `integer 0 .. 360,integer 0 .. 180` | + * | radiuses | `array` of `radius` elements: `[{radius}, ...]` | Limits the search to given radius in meters. | `null` or `double >= 0` or `unlimited` (default) | + * | hints | `array` of `hint` elements: `[{hint}, ...]` | Hint to derive position in street network. | Base64 `string` | * * @class OSRM * + * */ +// clang-format on NAN_METHOD(Engine::New) { if (info.IsConstructCall()) @@ -195,6 +185,7 @@ inline void async(const Nan::FunctionCallbackInfo &info, Nan::AsyncQueueWorker(new Worker{self->this_, std::move(params), service, callback}); } +// clang-format off /** * Returns the fastest route between two or more coordinates while visiting the waypoints in order. * @@ -205,19 +196,14 @@ inline void async(const Nan::FunctionCallbackInfo &info, * *Please note that even if an alternative route is requested, a result cannot be guaranteed.* * @param {Boolean} [options.steps=false] Return route steps for each route leg. * @param {Boolean} or {Array} [options.annotations=false] Return annotations for each route leg. - * Can be `false`, `true` or an array with strings of `duration`, `nodes`, `distance`, `weight`, - * `datasources`, `speed`. - * @param {String} [options.geometries=polyline] Returned route geometry format (influences overview - * and per step). Can also be `geojson`. - * @param {String} [options.overview=simplified] Add overview geometry either `full`, `simplified` - * according to highest zoom level it could be display on, or not at all (`false`). - * @param {Boolean} [options.continue_straight] Forces the route to keep going straight at waypoints - * and don't do a uturn even if it would be faster. Default value depends on the profile. - * `null`/`true`/`false` + * Can be `false`, `true` or an array with strings of `duration`, `nodes`, `distance`, `weight`, `datasources`, `speed`. + * @param {String} [options.geometries=polyline] Returned route geometry format (influences overview and per step). Can also be `geojson`. + * @param {String} [options.overview=simplified] Add overview geometry either `full`, `simplified` according to highest zoom level it could be display on, or not at all (`false`). + * @param {Boolean} [options.continue_straight] Forces the route to keep going straight at waypoints and don't do a uturn even if it would be faster. Default value depends on the profile. + * `null`/`true`/`false` * @param {Function} callback * - * @returns {Object} An array of [Waypoint](#waypoint) objects representing all waypoints in order - * AND an array of [`Route`](#route) objects ordered by descending recommendation rank. + * @returns {Object} An array of [Waypoint](#waypoint) objects representing all waypoints in order AND an array of [`Route`](#route) objects ordered by descending recommendation rank. * * @example * var osrm = new OSRM("berlin-latest.osrm"); @@ -227,11 +213,13 @@ inline void async(const Nan::FunctionCallbackInfo &info, * console.log(result.routes); // array of Route objects ordered by descending recommendation rank * }); */ +// clang-format on NAN_METHOD(Engine::route) // { async(info, &argumentsToRouteParameter, &osrm::OSRM::Route, true); } +// clang-format off /** * Snaps a coordinate to the street network and returns the nearest n matches. * @@ -245,11 +233,8 @@ NAN_METHOD(Engine::route) // * @param {Function} callback * * @returns {Object} containing `waypoints`. - * **`waypoints`**: array of [`Ẁaypoint`](#waypoint) objects sorted by distance to the input - * coordinate. - * Each object has an additional `distance` property, which is the distance in meters to the - * supplied - * input coordinate. + * **`waypoints`**: array of [`Ẁaypoint`](#waypoint) objects sorted by distance to the input coordinate. + * Each object has an additional `distance` property, which is the distance in meters to the supplied input coordinate. * * @example * var osrm = new OSRM('network.osrm'); @@ -262,11 +247,13 @@ NAN_METHOD(Engine::route) // * console.log(response.waypoints); // array of Waypoint objects * }); */ +// clang-format on NAN_METHOD(Engine::nearest) // { async(info, &argumentsToNearestParameter, &osrm::OSRM::Nearest, false); } +// clang-format off /** * Computes duration tables for the given locations. Allows for both symmetric and asymmetric * tables. @@ -282,11 +269,10 @@ NAN_METHOD(Engine::nearest) // * @param {Function} callback * * @returns {Object} containing `durations`, `sources`, and `destinations`. - * **`durations`**: array of arrays that stores the matrix in row-major order. `durations[i][j]` - * gives the travel time from the i-th waypoint to the j-th waypoint. Values are given in seconds. + * **`durations`**: array of arrays that stores the matrix in row-major order. `durations[i][j]` gives the travel time from the i-th waypoint to the j-th waypoint. + * Values are given in seconds. * **`sources`**: array of [`Ẁaypoint`](#waypoint) objects describing all sources in order. - * **`destinations`**: array of [`Ẁaypoint`](#waypoint) objects describing all destinations in - * order. + * **`destinations`**: array of [`Ẁaypoint`](#waypoint) objects describing all destinations in order. * * @example * var osrm = new OSRM('network.osrm'); @@ -303,11 +289,13 @@ NAN_METHOD(Engine::nearest) // * console.log(response.destinations); // array of Waypoint objects * }); */ +// clang-format on NAN_METHOD(Engine::table) // { async(info, &argumentsToTableParameter, &osrm::OSRM::Table, true); } +// clang-format off /** * This generates [Mapbox Vector Tiles](https://mapbox.com/vector-tiles) that can be viewed with a * vector-tile capable slippy-map viewer. The tiles contain road geometries and metadata that can @@ -318,11 +306,9 @@ NAN_METHOD(Engine::table) // * * @name tile * @memberof OSRM - * @param {Array} ZXY - an array consisting of `x`, `y`, and `z` values representing tile - * coordinates like - * [wiki.openstreetmap.org/wiki/Slippy_map_tilenames](https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames) - * and are supported by vector tile viewers like [Mapbox GL - * JS](https://www.mapbox.com/mapbox-gl-js/api/. + * @param {Array} ZXY - an array consisting of `x`, `y`, and `z` values representing tile coordinates like + * [wiki.openstreetmap.org/wiki/Slippy_map_tilenames](https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames) + * and are supported by vector tile viewers like [Mapbox GL JS](https://www.mapbox.com/mapbox-gl-js/api/). * @param {Function} callback * * @returns {Buffer} contains a Protocol Buffer encoded vector tile. @@ -334,11 +320,13 @@ NAN_METHOD(Engine::table) // * fs.writeFileSync('./tile.vector.pbf', response); // write the buffer to a file * }); */ +// clang-format on NAN_METHOD(Engine::tile) { async(info, &argumentsToTileParameters, &osrm::OSRM::Tile, {/*unused*/}); } +// clang-format off /** * Map matching matches given GPS points to the road network in the most plausible way. * Please note the request might result multiple sub-traces. Large jumps in the timestamps @@ -351,31 +339,21 @@ NAN_METHOD(Engine::tile) * @param {Object} options - Object literal containing parameters for the match query. * @param {Boolean} [options.steps=false] Return route steps for each route. * @param {Boolean} or {Array} [options.annotations=false] Return annotations for each route leg. - * Can be `false`, `true` or an array with strings of `duration`, `nodes`, `distance`, `weight`, - * `datasources`, `speed`. - * @param {String} [options.geometries=polyline] Returned route geometry format (influences overview - * and per step). Can also be `geojson`. - * @param {String} [options.overview=simplified] Add overview geometry either `full`, `simplified` - * according to highest zoom level it could be display on, or not at all (`false`). - * @param {Array} [options.timestamps] Timestamp of the input location (integers, UNIX-like - * timestamp). - * @param {Array} [options.radiuses] Standard deviation of GPS precision used for map matching. - * If applicable use GPS accuracy (`double >= 0`, default `5m`). + * Can be `false`, `true` or an array with strings of `duration`, `nodes`, `distance`, `weight`, `datasources`, `speed`. + * @param {String} [options.geometries=polyline] Returned route geometry format (influences overview and per step). Can also be `geojson`. + * @param {String} [options.overview=simplified] Add overview geometry either `full`, `simplified` according to highest zoom level it could be display on, or not at all (`false`). + * @param {Array} [options.timestamps] Timestamp of the input location (integers, UNIX-like timestamp). + * @param {Array} [options.radiuses] Standard deviation of GPS precision used for map matching. If applicable use GPS accuracy (`double >= 0`, default `5m`). * @param {Function} callback * * @returns {Object} containing `tracepoints` and `matchings`. - * **`tracepoints`** Array of [`Ẁaypoint`](#waypoint) objects representing all points of the trace - * in order. - * If the trace point was ommited by map matching because it is an outlier, the entry will be null. - * Each - * `Waypoint` object includes two additional properties, 1) `matchings_index`: Index to the - * [`Route`](#route) object in matchings the sub-trace was matched to, 2) `waypoint_index`: Index of - * the waypoint inside the matched route. - * **`matchings`** is an array of [`Route`](#route) objects that - * assemble the trace. Each `Route` object has an additional `confidence` property, which is the - * confidence of - * the matching. float value between `0` and `1`. `1` is very confident that the matching is - * correct. + * **`tracepoints`** Array of [`Ẁaypoint`](#waypoint) objects representing all points of the trace in order. + * If the trace point was ommited by map matching because it is an outlier, the entry will be null. + * Each `Waypoint` object includes two additional properties, 1) `matchings_index`: Index to the + * [`Route`](#route) object in matchings the sub-trace was matched to, 2) `waypoint_index`: Index of + * the waypoint inside the matched route. + * **`matchings`** is an array of [`Route`](#route) objects that assemble the trace. Each `Route` object has an additional `confidence` property, + * which is the confidence of the matching. float value between `0` and `1`. `1` is very confident that the matching is correct. * * @example * var osrm = new OSRM('network.osrm'); @@ -390,11 +368,13 @@ NAN_METHOD(Engine::tile) * }); * */ +// clang-format on NAN_METHOD(Engine::match) // { async(info, &argumentsToMatchParameter, &osrm::OSRM::Match, true); } +// clang-format off /** * The trip plugin solves the Traveling Salesman Problem using a greedy heuristic * (farthest-insertion algorithm) for 10 or * more waypoints and uses brute force for less than 10 @@ -406,11 +386,9 @@ NAN_METHOD(Engine::match) // * @memberof OSRM * @param {Object} options - Object literal containing parameters for the trip query. * @param {Boolean} [options.steps=false] Return route steps for each route. - * @param {Boolean} or {Array} [options.annotations=false] Return annotations for each route leg. - * Can be `false`, `true` or an array with strings of `duration`, `nodes`, `distance`, `weight`, - * `datasources`, `speed`. - * @param {String} [options.geometries=polyline] Returned route geometry format (influences overview - * and per step). Can also be `geojson`. + * @param {Boolean} or {Array} [options.annotations=false] Return annotations for each route leg. Can be `false`, + * `true` or an array with strings of `duration`, `nodes`, `distance`, `weight`, `datasources`, `speed`. + * @param {String} [options.geometries=polyline] Returned route geometry format (influences overview and per step). Can also be `geojson`. * @param {String} [options.overview=simplified] Add overview geometry either `full`, `simplified` * @param {Function} callback * @param {Boolean} [options.roundtrip=true] Return route is a roundtrip. @@ -418,11 +396,10 @@ NAN_METHOD(Engine::match) // * @param {String} [options.destination=any] Return route ends at `any` or `last` coordinate. * * @returns {Object} containing `waypoints` and `trips`. - * **`waypoints`**: an array of [`Waypoint`](#waypoint) objects representing all waypoints in input - * order. - * Each Waypoint object has the following additional properties, 1) `trips_index`: index to trips of - * the - * sub-trip the point was matched to, and 2) `waypoint_index`: index of the point in the trip. + * **`waypoints`**: an array of [`Waypoint`](#waypoint) objects representing all waypoints in input order. + * Each Waypoint object has the following additional properties, + * 1) `trips_index`: index to trips of the sub-trip the point was matched to, + * and 2) `waypoint_index`: index of the point in the trip. * **`trips`**: an array of [`Route`](#route) objects that assemble the trace. * * @example @@ -439,6 +416,7 @@ NAN_METHOD(Engine::match) // * console.log(response.trips); // array of Route objects * }); */ +// clang-format on NAN_METHOD(Engine::trip) // { async(info, &argumentsToTripParameter, &osrm::OSRM::Trip, true); @@ -456,7 +434,7 @@ NAN_METHOD(Engine::trip) // * @memberof Responses * * @param {documentation} exteral in - * [`osrm-backend`](https://github.com/Project-OSRM/osrm-backend/blob/master/docs/http.md#route) + * [`osrm-backend`](../http.md#route) * */ @@ -467,7 +445,7 @@ NAN_METHOD(Engine::trip) // * @memberof Responses * * @param {documentation} exteral in - * [`osrm-backend`](https://github.com/Project-OSRM/osrm-backend/blob/master/docs/http.md#routeleg) + * [`osrm-backend`](../http.md#routeleg) * */ diff --git a/test/nodejs/index.js b/test/nodejs/index.js index 7cca6f93c..2ea1b859c 100644 --- a/test/nodejs/index.js +++ b/test/nodejs/index.js @@ -1,6 +1,8 @@ var OSRM = require('../../'); var test = require('tape'); var berlin_path = require('./osrm-data-path').data_path; +var berlin_mld_path = require('./osrm-data-path').mld_data_path; +var berlin_corech_path = require('./osrm-data-path').corech_data_path; test('constructor: throws if new keyword is not used', function(assert) { assert.plan(1); @@ -23,7 +25,7 @@ test('constructor: does not accept more than one parameter', function(assert) { test('constructor: throws if necessary files do not exist', function(assert) { assert.plan(1); assert.throws(function() { new OSRM("missing.osrm"); }, - /Invalid file paths/); + /Error opening missing.osrm.names/); }); test('constructor: takes a shared memory argument', function(assert) { @@ -34,22 +36,52 @@ test('constructor: takes a shared memory argument', function(assert) { test('constructor: throws if shared_memory==false with no path defined', function(assert) { assert.plan(1); - assert.throws(function() { var osrm = new OSRM({shared_memory: false}); }, + assert.throws(function() { new OSRM({shared_memory: false}); }, /Shared_memory must be enabled if no path is specified/); }); test('constructor: throws if given a non-bool shared_memory option', function(assert) { assert.plan(1); - assert.throws(function() { var osrm = new OSRM({path: berlin_path, shared_memory: "a"}); }, + assert.throws(function() { new OSRM({path: berlin_path, shared_memory: 'a'}); }, /Shared_memory option must be a boolean/); }); test('constructor: throws if given a non-string/obj argument', function(assert) { assert.plan(1); - assert.throws(function() { var osrm = new OSRM(true); }, + assert.throws(function() { new OSRM(true); }, /Parameter must be a path or options object/); }); +test('constructor: throws if given an unkown algorithm', function(assert) { + assert.plan(1); + assert.throws(function() { new OSRM({algorithm: 'Foo', shared_memory: true}); }, + /algorithm option must be one of 'CH', 'CoreCH', or 'MLD'/); +}); + +test('constructor: throws if given an invalid algorithm', function(assert) { + assert.plan(1); + assert.throws(function() { new OSRM({algorithm: 3, shared_memory: true}); }, + /algorithm option must be a string and one of 'CH', 'CoreCH', or 'MLD'/); +}); + +test('constructor: loads MLD if given as algorithm', function(assert) { + assert.plan(1); + var osrm = new OSRM({algorithm: 'MLD', path: berlin_mld_path}); + assert.ok(osrm); +}); + +test('constructor: loads CH if given as algorithm', function(assert) { + assert.plan(1); + var osrm = new OSRM({algorithm: 'CH', path: berlin_path}); + assert.ok(osrm); +}); + +test('constructor: loads CoreCH if given as algorithm', function(assert) { + assert.plan(1); + var osrm = new OSRM({algorithm: 'CoreCH', path: berlin_corech_path}); + assert.ok(osrm); +}); + require('./route.js'); require('./trip.js'); require('./match.js'); diff --git a/test/nodejs/osrm-data-path.js b/test/nodejs/osrm-data-path.js index b6220b764..d443e8e8a 100644 --- a/test/nodejs/osrm-data-path.js +++ b/test/nodejs/osrm-data-path.js @@ -2,7 +2,11 @@ var path = require('path'); if (process.env.OSRM_DATA_PATH !== undefined) { exports.data_path = path.join(path.resolve(process.env.OSRM_DATA_PATH), "ch/berlin.osrm"); + exports.mld_data_path = path.join(path.resolve(process.env.OSRM_DATA_PATH), "mld/berlin.osrm"); + exports.corech_data_path = path.join(path.resolve(process.env.OSRM_DATA_PATH), "corech/berlin.osrm"); console.log('Setting custom data path to ' + exports.data_path); } else { exports.data_path = path.resolve(path.join(__dirname, "../data/ch/berlin.osrm")); + exports.mld_data_path = path.resolve(path.join(__dirname, "../data/mld/berlin.osrm")); + exports.corech_data_path = path.resolve(path.join(__dirname, "../data/corech/berlin.osrm")); } diff --git a/test/nodejs/route.js b/test/nodejs/route.js index e83920678..8cc26f57c 100644 --- a/test/nodejs/route.js +++ b/test/nodejs/route.js @@ -1,6 +1,8 @@ var OSRM = require('../../'); var test = require('tape'); var berlin_path = require('./osrm-data-path').data_path; +var berlin_mld_path = require('./osrm-data-path').mld_data_path; +var berlin_corech_path = require('./osrm-data-path').corech_data_path; test('route: routes Berlin', function(assert) { assert.plan(5); @@ -14,6 +16,30 @@ test('route: routes Berlin', function(assert) { }); }); +test('route: routes Berlin on MLD', function(assert) { + assert.plan(5); + var osrm = new OSRM({path: berlin_mld_path, algorithm: 'MLD'}); + osrm.route({coordinates: [[13.43864,52.51993],[13.415852,52.513191]]}, function(err, route) { + assert.ifError(err); + assert.ok(route.waypoints); + assert.ok(route.routes); + assert.ok(route.routes.length); + assert.ok(route.routes[0].geometry); + }); +}); + +test('route: routes Berlin on CoreCH', function(assert) { + assert.plan(5); + var osrm = new OSRM({path: berlin_corech_path, algorithm: 'CoreCH'}); + osrm.route({coordinates: [[13.43864,52.51993],[13.415852,52.513191]]}, function(err, route) { + assert.ifError(err); + assert.ok(route.waypoints); + assert.ok(route.routes); + assert.ok(route.routes.length); + assert.ok(route.routes[0].geometry); + }); +}); + test('route: throws with too few or invalid args', function(assert) { assert.plan(3); var osrm = new OSRM(berlin_path);