Giter VIP home page Giter VIP logo

osrm-text-instructions.swift's Introduction

Open Source Routing Machine

osrm-backend CI Codecov Discord

High performance routing engine written in C++ designed to run on OpenStreetMap data.

The following services are available via HTTP API, C++ library interface and NodeJs wrapper:

  • Nearest - Snaps coordinates to the street network and returns the nearest matches
  • Route - Finds the fastest route between coordinates
  • Table - Computes the duration or distances of the fastest route between all pairs of supplied coordinates
  • Match - Snaps noisy GPS traces to the road network in the most plausible way
  • Trip - Solves the Traveling Salesman Problem using a greedy heuristic
  • Tile - Generates Mapbox Vector Tiles with internal routing metadata

To quickly try OSRM use our demo server which comes with both the backend and a frontend on top.

For a quick introduction about how the road network is represented in OpenStreetMap and how to map specific road network features have a look at this guide about mapping for navigation.

Related Project-OSRM repositories:

Documentation

Full documentation

Contact

  • Discord: join
  • IRC: irc.oftc.net, channel: #osrm (Webchat)
  • Mailinglist: https://lists.openstreetmap.org/listinfo/osrm-talk

Quick Start

The easiest and quickest way to setup your own routing engine is to use Docker images we provide.

There are two pre-processing pipelines available:

  • Contraction Hierarchies (CH)
  • Multi-Level Dijkstra (MLD)

we recommend using MLD by default except for special use-cases such as very large distance matrices where CH is still a better fit for the time being. In the following we explain the MLD pipeline. If you want to use the CH pipeline instead replace osrm-partition and osrm-customize with a single osrm-contract and change the algorithm option for osrm-routed to --algorithm ch.

Using Docker

We base our Docker images (backend, frontend) on Debian and make sure they are as lightweight as possible. Older backend versions can be found on Docker Hub.

Download OpenStreetMap extracts for example from Geofabrik

wget http://download.geofabrik.de/europe/germany/berlin-latest.osm.pbf

Pre-process the extract with the car profile and start a routing engine HTTP server on port 5000

docker run -t -v "${PWD}:/data" ghcr.io/project-osrm/osrm-backend osrm-extract -p /opt/car.lua /data/berlin-latest.osm.pbf || echo "osrm-extract failed"

The flag -v "${PWD}:/data" creates the directory /data inside the docker container and makes the current working directory "${PWD}" available there. The file /data/berlin-latest.osm.pbf inside the container is referring to "${PWD}/berlin-latest.osm.pbf" on the host.

docker run -t -v "${PWD}:/data" ghcr.io/project-osrm/osrm-backend osrm-partition /data/berlin-latest.osrm || echo "osrm-partition failed"
docker run -t -v "${PWD}:/data" ghcr.io/project-osrm/osrm-backend osrm-customize /data/berlin-latest.osrm || echo "osrm-customize failed"

Note there is no berlin-latest.osrm file, but multiple berlin-latest.osrm.* files, i.e. berlin-latest.osrm is not file path, but "base" path referring to set of files and there is an option to omit this .osrm suffix completely(e.g. osrm-partition /data/berlin-latest).

docker run -t -i -p 5000:5000 -v "${PWD}:/data" ghcr.io/project-osrm/osrm-backend osrm-routed --algorithm mld /data/berlin-latest.osrm

Make requests against the HTTP server

curl "http://127.0.0.1:5000/route/v1/driving/13.388860,52.517037;13.385983,52.496891?steps=true"

Optionally start a user-friendly frontend on port 9966, and open it up in your browser

docker run -p 9966:9966 osrm/osrm-frontend
xdg-open 'http://127.0.0.1:9966'

In case Docker complains about not being able to connect to the Docker daemon make sure you are in the docker group.

sudo usermod -aG docker $USER

After adding yourself to the docker group make sure to log out and back in again with your terminal.

We support the following images in the Container Registry:

Name Description
latest master compiled with release flag
latest-assertions master compiled with with release flag, assertions enabled and debug symbols
latest-debug master compiled with debug flag
<tag> specific tag compiled with release flag
<tag>-debug specific tag compiled with debug flag

Building from Source

The following targets Ubuntu 22.04. For instructions how to build on different distributions, macOS or Windows see our Wiki.

Install dependencies

sudo apt install build-essential git cmake pkg-config \
libbz2-dev libxml2-dev libzip-dev libboost-all-dev \
lua5.2 liblua5.2-dev libtbb-dev

Compile and install OSRM binaries

mkdir -p build
cd build
cmake ..
cmake --build .
sudo cmake --build . --target install

Request Against the Demo Server

Read the API usage policy.

Simple query with instructions and alternatives on Berlin:

curl "https://router.project-osrm.org/route/v1/driving/13.388860,52.517037;13.385983,52.496891?steps=true&alternatives=true"

Using the Node.js Bindings

The Node.js bindings provide read-only access to the routing engine. We provide API documentation and examples here.

You will need a modern libstdc++ toolchain (>= GLIBCXX_3.4.26) for binary compatibility if you want to use the pre-built binaries. For older Ubuntu systems you can upgrade your standard library for example with:

sudo add-apt-repository ppa:ubuntu-toolchain-r/test
sudo apt-get update -y
sudo apt-get install -y libstdc++-9-dev

You can install the Node.js bindings via npm install @project-osrm/osrm or from this repository either via

npm install

which will check and use pre-built binaries if they're available for this release and your Node version, or via

npm install --build-from-source

to always force building the Node.js bindings from source.

Unscoped packages

Prior to v5.27.0, the osrm Node package was unscoped. If you are upgrading from an old package, you will need to do the following:

npm uninstall osrm --save
npm install @project-osrm/osrm --save

Package docs

For usage details have a look these API docs.

An exemplary implementation by a 3rd party with Docker and Node.js can be found here.

References in publications

When using the code in a (scientific) publication, please cite

@inproceedings{luxen-vetter-2011,
 author = {Luxen, Dennis and Vetter, Christian},
 title = {Real-time routing with OpenStreetMap data},
 booktitle = {Proceedings of the 19th ACM SIGSPATIAL International Conference on Advances in Geographic Information Systems},
 series = {GIS '11},
 year = {2011},
 isbn = {978-1-4503-1031-4},
 location = {Chicago, Illinois},
 pages = {513--516},
 numpages = {4},
 url = {http://doi.acm.org/10.1145/2093973.2094062},
 doi = {10.1145/2093973.2094062},
 acmid = {2094062},
 publisher = {ACM},
 address = {New York, NY, USA},
}

osrm-text-instructions.swift's People

Contributors

1ec5 avatar frederoni avatar freenerd avatar mattrobmattrob avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

osrm-text-instructions.swift's Issues

Incorporate instructions for turn-by-turn navigation

The iOS navigation SDK currently defines its own format strings for situations that aren’t adequately covered by this library:

https://github.com/mapbox/mapbox-navigation-ios/blob/55417885cc87e9fa28a84780d35db3a737878a17/MapboxCoreNavigation/Resources/en.lproj/Localizable.strings#L1-L26

Project-OSRM/osrm-text-instructions#141 added analogous strings, so we should port that work to this library and remove the strings and the associated logic from the iOS navigation SDK.

/cc @mcwhittemore @bsudekum

Destination route number ignored in ramp steps

When an on- or off-ramp step includes both destinations and destinationCodes, string(for:) includes the first item in destinations and discards destinationCodes. For example, a route that proceeds onto this way would be announced as:

Take the ramp on the right towards San Francisco

instead, it should match the behavior of the JavaScript version:

Take the ramp on the right towards US 101 North: San Francisco

This discrepancy flew under the radar because only MapboxDirections.swift distinguishes between destinations and destinationCodes via its own parsing – a workaround for Project-OSRM/osrm-text-instructions#41 – and because the JavaScript project lacks a test for a step that includes both a destination route number and destination name.

/cc @bsudekum @ericrwolfe @MoKob

Build macOS, tvOS, watchOS targets

The podspec being added in #4 claims macOS, tvOS, and watchOS support, but we can’t really be sure those platforms are supported until we build a framework for each of them as part of the Xcode project.

/cc @frederoni

CocoaPods install does not include Instructions.plist

If you install using cocoa pods.

pod 'OSRMTextInstructions', :git => 'https://github.com/Project-OSRM/osrm-text-instructions.swift.git'

The Instructions.plist is not included and then you get a crash on the line.

let OSRMTextInstructionsStrings = NSDictionary(contentsOfFile: Bundle(for: OSRMInstructionFormatter.self).path(forResource: "Instructions", ofType: "plist")!)!

The temporary work around is to manually add the Instructions.plist to the pod folder manually. (which is obviously not a viable long term option)

I suspect it got introduced when you moved the plist files into localised folders so the s.resources no longer matches.

s.resources = ['OSRMTextInstructions/*.plist']

Incompatibility with `MapboxDirections` and `MapboxCoreNavigation`

I ran into a problem when I tried to use MapboxDirections, OSRMTextInstructions and MapboxCoreNavigation pods in one project.

The problem is caused by the fact that that there are API changes between MapboxDirections 0.13 and Mapbox Directions 0.16 which aren't backward compatible (despite the fact that according to semantic versioning 0.16 should be backward compatible with 0.13).

Any chance that you can release a new version of osrm text instructions that works with the newest release of MapboxDirections (0.16)?

Podfile

target 'Example' do
  use_frameworks!

  pod 'MapboxDirections.swift'
  pod 'OSRMTextInstructions'
  pod 'MapboxCoreNavigation' 
end

Podfile.lock

PODS:
  - MapboxCoreNavigation (0.13.0):
    - MapboxDirections.swift (~> 0.16.0)
    - MapboxMobileEvents (~> 0.2)
    - Turf (~> 0.0.4)
  - MapboxDirections.swift (0.16.0):
    - Polyline (~> 4.2)
  - MapboxMobileEvents (0.2.10)
  - OSRMTextInstructions (0.6.0):
    - MapboxDirections.swift (~> 0.13)
  - Polyline (4.2.0)
  - Turf (0.0.4)

DEPENDENCIES:
  - MapboxCoreNavigation
  - MapboxDirections.swift
  - OSRMTextInstructions

SPEC CHECKSUMS:
  MapboxCoreNavigation: 3c964ad1854179dc619b4cceb5f85f428b68fe14
  MapboxDirections.swift: 168cc83745b188d792c5482bfb0653c233d1455c
  MapboxMobileEvents: 9e48b59d0eed04508595dcb04a77b7632e1c3054
  OSRMTextInstructions: 7abc90eaf50ff1f7333c526daf360f6a2f1ea059
  Polyline: 3d69f75bb136357e27291d439d0436c6ebda57a4
  Turf: 6c169618fa671e3f8a7b764b5b3332053ad6110e

PODFILE CHECKSUM: 2451d9656bb36e932469bfba9f5797a86fca4499

COCOAPODS: 1.4.0

Provide CocoaPods subspecs for individual locales

The CocoaPods podspec should define subspecs for individual locales, so that a size-conscious developer can pick-and-choose the locales that their application supports.

To avoid hard-coding each supported locale in this repository – one of the goals of #14 – we could provide a subspec for English, one for the Chinese locales, one for Western European locales, and one for all remaining languages. By default, all the subspecs would be included.

In each subspec, json2plist.sh would accept locale codes as arguments and convert only the specified locales if provided.

/cc @frederoni @bsudekum @freenerd

Pull in translations from Transifex

This library should pull translations directly from Transifex and convert them into plist format to complement the existing English plist. This should be done as a build step to keep developers from having to access the Transifex API every time they run carthage bootstrap.

/cc @frederoni @freenerd

Warnings about deprecated String.characters usage

CocoaPods is issuing the following warnings when using Xcode 9.1:

 -> OSRMTextInstructions (0.5.0)
    - WARN  | xcodebuild:  OSRMTextInstructions/OSRMTextInstructions/OSRMTextInstructions.swift:18:23: warning: 'characters' is deprecated: Please use String or Substring directly
    - WARN  | xcodebuild:  OSRMTextInstructions/OSRMTextInstructions/OSRMTextInstructions.swift:18:67: warning: 'characters' is deprecated: Please use String or Substring directly
    - WARN  | xcodebuild:  OSRMTextInstructions/OSRMTextInstructions/OSRMTextInstructions.swift:100:102: warning: 'characters' is deprecated: Please use String or Substring directly

These issues would be resolved by migrating to Swift 4.

/cc @bsudekum

Swift 5.0

Hi guys,

I'm planning to use your library in a project of mine that's build with Swift5.x.
Your library doesn't compile with xCode 10.2.1 because of this.

Is there any chance to get an updated version of it?

I'm happy to submit a pull request if it's ok on your side. :-)

Thanks,
Alessandro

Deserialize JSON instructions into struct

OSRMInstructionFormatter should immediately deserialize the JSON instructions into a strongly typed struct. This change would sharply reduce the number of implicitly unwrapped optionals (!) that could cause crashes and clean up the code significantly. Once we migrate to Swift 4, we’ll be able to take advantage of the Codable protocol to reduce the code size even further.

/cc @frederoni @freenerd

Turn ignored

Hi guys,

in OSRMInstructionFormatter I found this:

if type != .depart && type != .arrive && modifier == .none { return nil }
it looks like if the step's type is, for instance, .turn the library doesn't return an attributed string that describes the step.
Can you enlighten me about the reasons behind this? :-)
In my use case it's important to explain the user the step-by-step instructions of the route it's gonna take.

Thanks,
Alessandro

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.