Compare commits
87 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| bab2887f8f | |||
| 4638e7c24d | |||
| fe420e5bfc | |||
| 93ae928236 | |||
| 3b485f1426 | |||
| 5165e01a5c | |||
| 7b4e923ec4 | |||
| 007dd19cec | |||
| fd3cf02af4 | |||
| 2bb51717b9 | |||
| 4fe6346146 | |||
| c5bd2b0b1d | |||
| 71426cf760 | |||
| 0ab287e707 | |||
| 49cc0bfb09 | |||
| e132ac5c53 | |||
| 1a9776cff9 | |||
| 342a0d22bd | |||
| 251a43980a | |||
| 41ba8b5e3e | |||
| 30df2aae10 | |||
| a6f00b1856 | |||
| af26c47052 | |||
| 0a774aeef2 | |||
| a89aa68686 | |||
| 4b93107415 | |||
| e0602934b2 | |||
| fdace26222 | |||
| bef41ed667 | |||
| 4e2e95cc27 | |||
| f4c6ec90ce | |||
| eed22b343a | |||
| 08ce748a37 | |||
| 69790eb8c7 | |||
| 97b9c65c97 | |||
| 92dbadebae | |||
| fe6d854e11 | |||
| 4615b01fdf | |||
| 276b023b05 | |||
| 350cacb2f3 | |||
| 25ec6105c5 | |||
| 3e4249ad41 | |||
| 13126ac0c1 | |||
| d51aee4fbe | |||
| f9877fd8ba | |||
| a39a35df73 | |||
| 2670dd68f3 | |||
| 9adb590ce7 | |||
| 9567a7e38c | |||
| d86eaa00a0 | |||
| 54c0d50b68 | |||
| 204189c326 | |||
| acdfa546a8 | |||
| 6a9216d6e4 | |||
| 9c2a1dc37f | |||
| 26c9d357f0 | |||
| 879d73c629 | |||
| 441146eeae | |||
| d453cadc8c | |||
| 74188206e8 | |||
| 700206099b | |||
| aa952df541 | |||
| b8944da9dc | |||
| 22dda2b285 | |||
| 0ee469c4e0 | |||
| a7eef27e99 | |||
| 4b40f1253f | |||
| 5ebe8080f9 | |||
| d92b28d2c3 | |||
| ec27881f39 | |||
| c5a8ec7c31 | |||
| afbd3347da | |||
| 41bcafc3a1 | |||
| 27d24885a9 | |||
| 805402b230 | |||
| 4918549bac | |||
| 784f417857 | |||
| 0bc3e098ac | |||
| dfd3a5d554 | |||
| 9dcc472c60 | |||
| c972e2cf41 | |||
| de9ab83cea | |||
| 174e388e2d | |||
| ee41fb45b7 | |||
| 93892b9806 | |||
| 749d83a69f | |||
| 8b109904c8 |
@@ -1,8 +0,0 @@
|
|||||||
{
|
|
||||||
"plugins": ["transform-class-properties"],
|
|
||||||
"presets": [
|
|
||||||
"stage-0",
|
|
||||||
"es2015",
|
|
||||||
"react"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
@@ -1,90 +0,0 @@
|
|||||||
---
|
|
||||||
Language: Cpp
|
|
||||||
# BasedOnStyle: LLVM
|
|
||||||
AccessModifierOffset: -2
|
|
||||||
AlignAfterOpenBracket: Align
|
|
||||||
AlignConsecutiveAssignments: false
|
|
||||||
AlignConsecutiveDeclarations: false
|
|
||||||
AlignEscapedNewlinesLeft: false
|
|
||||||
AlignOperands: true
|
|
||||||
AlignTrailingComments: true
|
|
||||||
AllowAllParametersOfDeclarationOnNextLine: true
|
|
||||||
AllowShortBlocksOnASingleLine: true
|
|
||||||
AllowShortCaseLabelsOnASingleLine: false
|
|
||||||
AllowShortFunctionsOnASingleLine: All
|
|
||||||
AllowShortIfStatementsOnASingleLine: false
|
|
||||||
AllowShortLoopsOnASingleLine: false
|
|
||||||
AlwaysBreakAfterDefinitionReturnType: None
|
|
||||||
AlwaysBreakAfterReturnType: None
|
|
||||||
AlwaysBreakBeforeMultilineStrings: false
|
|
||||||
AlwaysBreakTemplateDeclarations: false
|
|
||||||
BinPackArguments: false
|
|
||||||
BinPackParameters: false
|
|
||||||
BraceWrapping:
|
|
||||||
AfterClass: true
|
|
||||||
AfterControlStatement: true
|
|
||||||
AfterEnum: true
|
|
||||||
AfterFunction: true
|
|
||||||
AfterNamespace: true
|
|
||||||
AfterObjCDeclaration: true
|
|
||||||
AfterStruct: true
|
|
||||||
AfterUnion: true
|
|
||||||
BeforeCatch: true
|
|
||||||
BeforeElse: true
|
|
||||||
IndentBraces: true
|
|
||||||
BreakBeforeBinaryOperators: false
|
|
||||||
BreakBeforeBraces: Allman
|
|
||||||
BreakBeforeTernaryOperators: true
|
|
||||||
BreakConstructorInitializersBeforeComma: false
|
|
||||||
ColumnLimit: 100
|
|
||||||
CommentPragmas: '^ IWYU pragma:'
|
|
||||||
ConstructorInitializerAllOnOneLineOrOnePerLine: false
|
|
||||||
ConstructorInitializerIndentWidth: 4
|
|
||||||
ContinuationIndentWidth: 4
|
|
||||||
Cpp11BracedListStyle: true
|
|
||||||
DerivePointerAlignment: false
|
|
||||||
DisableFormat: false
|
|
||||||
ExperimentalAutoDetectBinPacking: false
|
|
||||||
ForEachMacros: [ foreach, Q_FOREACH, BOOST_FOREACH ]
|
|
||||||
IncludeCategories:
|
|
||||||
- Regex: '^<'
|
|
||||||
Priority: 3
|
|
||||||
- Regex: '^"(osrm|util|engine|extract|contract)/'
|
|
||||||
Priority: 2
|
|
||||||
- Regex: '.*'
|
|
||||||
Priority: 1
|
|
||||||
IndentCaseLabels: false
|
|
||||||
IndentWidth: 4
|
|
||||||
IndentWrappedFunctionNames: false
|
|
||||||
KeepEmptyLinesAtTheStartOfBlocks: true
|
|
||||||
MacroBlockBegin: ''
|
|
||||||
MacroBlockEnd: ''
|
|
||||||
MaxEmptyLinesToKeep: 1
|
|
||||||
NamespaceIndentation: None
|
|
||||||
ObjCBlockIndentWidth: 2
|
|
||||||
ObjCSpaceAfterProperty: false
|
|
||||||
ObjCSpaceBeforeProtocolList: true
|
|
||||||
PenaltyBreakBeforeFirstCallParameter: 19
|
|
||||||
PenaltyBreakComment: 300
|
|
||||||
PenaltyBreakFirstLessLess: 120
|
|
||||||
PenaltyBreakString: 1000
|
|
||||||
PenaltyExcessCharacter: 1000000
|
|
||||||
PenaltyReturnTypeOnItsOwnLine: 60
|
|
||||||
PointerAlignment: Right
|
|
||||||
ReflowComments: true
|
|
||||||
SortIncludes: true
|
|
||||||
SpaceAfterCStyleCast: false
|
|
||||||
SpaceBeforeAssignmentOperators: true
|
|
||||||
SpaceBeforeParens: ControlStatements
|
|
||||||
SpaceInEmptyParentheses: false
|
|
||||||
SpacesBeforeTrailingComments: 1
|
|
||||||
SpacesInAngles: false
|
|
||||||
SpacesInContainerLiterals: true
|
|
||||||
SpacesInCStyleCastParentheses: false
|
|
||||||
SpacesInParentheses: false
|
|
||||||
SpacesInSquareBrackets: false
|
|
||||||
Standard: Cpp11
|
|
||||||
TabWidth: 8
|
|
||||||
UseTab: Never
|
|
||||||
...
|
|
||||||
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
---
|
|
||||||
Checks: '-clang-analyzer-*,google-*,llvm-*,misc-*,readability-*,-google-build-explicit-make-pair,-google-explicit-constructor,-google-readability-braces-around-statements,-google-readability-casting,-google-readability-namespace-comments,-google-readability-function,-google-readability-todo,-google-runtime-int,-llvm-namespace-comment,-llvm-header-guard,-llvm-twine-local,-misc-argument-comment,-readability-braces-around-statements,-readability-identifier-naming'
|
|
||||||
...
|
|
||||||
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
# Kind-specific patterns to check AST nodes against. Both python-clang and
|
|
||||||
# libclang docs explain CursorKind, with differences in detail. See also:
|
|
||||||
# - https://github.com/llvm-mirror/clang/blob/aca4fe314a55cacae29e1548cb7bfd2119c6df4c/bindings/python/clang/cindex.py#L599
|
|
||||||
# - http://clang.llvm.org/doxygen/group__CINDEX.html#gaaccc432245b4cd9f2d470913f9ef0013
|
|
||||||
# - https://docs.python.org/2/library/re.html#regular-expression-syntax
|
|
||||||
|
|
||||||
class_decl: '^([A-Z]+[a-z]+)+$'
|
|
||||||
struct_decl: '^([A-Z]+[a-z]+)+$'
|
|
||||||
field_decl: '^[a-z_]+$'
|
|
||||||
var_decl: '^[a-z]+[a-z0-9_]*$'
|
|
||||||
parm_decl: '^[a-z]*[a-z0-9_]*$'
|
|
||||||
namespace: '^[a-z_]*$'
|
|
||||||
cxx_method: '^([A-Z]+[a-z]+)+$'
|
|
||||||
function_decl: '^[a-z]+([A-Z]+[a-z]+)*$'
|
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
test
|
|
||||||
build
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
{
|
|
||||||
"rules": {
|
|
||||||
"indent": [
|
|
||||||
2,
|
|
||||||
4
|
|
||||||
],
|
|
||||||
"quotes": [
|
|
||||||
1,
|
|
||||||
"single"
|
|
||||||
],
|
|
||||||
"linebreak-style": [
|
|
||||||
2,
|
|
||||||
"unix"
|
|
||||||
],
|
|
||||||
"semi": [
|
|
||||||
2,
|
|
||||||
"always"
|
|
||||||
],
|
|
||||||
"no-console": [
|
|
||||||
1
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"env": {
|
|
||||||
"es6": true,
|
|
||||||
"node": true
|
|
||||||
},
|
|
||||||
"extends": "eslint:recommended"
|
|
||||||
}
|
|
||||||
@@ -1,15 +0,0 @@
|
|||||||
# Set the default behavior, in case people don't have core.autocrlf set.
|
|
||||||
* text=auto
|
|
||||||
|
|
||||||
# Explicitly declare text files you want to always be normalized and converted
|
|
||||||
# to native line endings on checkout.
|
|
||||||
*.cpp text
|
|
||||||
*.hpp text
|
|
||||||
|
|
||||||
# Declare files that will always have CRLF line endings on checkout.
|
|
||||||
*.bat text eol=crlf
|
|
||||||
*.cmd text eol=crlf
|
|
||||||
*.ps1 text eol=crlf
|
|
||||||
|
|
||||||
# Declare files that will always have LF line endings on checkout.
|
|
||||||
*.sh text eol=lf
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
# Issue
|
|
||||||
|
|
||||||
What issue is this PR targeting? If there is no issue that addresses the problem, please open a corresponding issue and link it here.
|
|
||||||
|
|
||||||
## Tasklist
|
|
||||||
- [ ] ADD OWN TASKS HERE
|
|
||||||
- [ ] CHANGELOG.md entry ([How to write a changelog entry](http://keepachangelog.com/en/1.0.0/#how))
|
|
||||||
- [ ] update relevant [Wiki pages](https://github.com/Project-OSRM/osrm-backend/wiki)
|
|
||||||
- [ ] add regression / cucumber cases (see docs/testing.md)
|
|
||||||
- [ ] review
|
|
||||||
- [ ] adjust for comments
|
|
||||||
|
|
||||||
## Requirements / Relations
|
|
||||||
Link any requirements here. Other pull requests this PR is based on?
|
|
||||||
@@ -1,112 +1,2 @@
|
|||||||
# mason #
|
/.settings
|
||||||
#########
|
/.project
|
||||||
/.mason
|
|
||||||
/mason_packages
|
|
||||||
|
|
||||||
# pre compiled dependencies #
|
|
||||||
#############################
|
|
||||||
osrm-deps
|
|
||||||
|
|
||||||
.ycm_extra_conf.py
|
|
||||||
|
|
||||||
# Compiled source #
|
|
||||||
###################
|
|
||||||
*.com
|
|
||||||
*.class
|
|
||||||
*.dll
|
|
||||||
*.exe
|
|
||||||
*.o
|
|
||||||
*.so
|
|
||||||
|
|
||||||
# Packages #
|
|
||||||
############
|
|
||||||
# it's better to unpack these files and commit the raw source
|
|
||||||
# git has its own built in compression methods
|
|
||||||
*.7z
|
|
||||||
*.dmg
|
|
||||||
*.gz
|
|
||||||
*.iso
|
|
||||||
*.jar
|
|
||||||
*.rar
|
|
||||||
*.tar
|
|
||||||
*.zip
|
|
||||||
|
|
||||||
# Logs and databases #
|
|
||||||
######################
|
|
||||||
*.log
|
|
||||||
*.sql
|
|
||||||
*.sqlite
|
|
||||||
|
|
||||||
# OS generated files #
|
|
||||||
######################
|
|
||||||
.DS_Store
|
|
||||||
ehthumbs.db
|
|
||||||
Icon?
|
|
||||||
Thumbs.db
|
|
||||||
|
|
||||||
# build related files #
|
|
||||||
#######################
|
|
||||||
/_build*
|
|
||||||
/build/
|
|
||||||
/example/build/
|
|
||||||
/test/data/monaco*
|
|
||||||
/test/data/ch
|
|
||||||
/test/data/corech
|
|
||||||
/test/data/mld
|
|
||||||
/cmake/postinst
|
|
||||||
|
|
||||||
# Eclipse related files #
|
|
||||||
#########################
|
|
||||||
.setting*
|
|
||||||
.scb
|
|
||||||
.cproject
|
|
||||||
.project
|
|
||||||
|
|
||||||
# Visual Studio (Code) related files #
|
|
||||||
######################################
|
|
||||||
/.vs*
|
|
||||||
/*.local.bat
|
|
||||||
|
|
||||||
# stxxl related files #
|
|
||||||
#######################
|
|
||||||
.stxxl
|
|
||||||
stxxl.log
|
|
||||||
stxxl.errlog
|
|
||||||
|
|
||||||
# Compiled Binary Files #
|
|
||||||
####################################
|
|
||||||
/osrm-extract
|
|
||||||
/osrm-io-benchmark
|
|
||||||
/osrm-components
|
|
||||||
/osrm-routed
|
|
||||||
/osrm-datastore
|
|
||||||
/osrm-prepare
|
|
||||||
/osrm-unlock-all
|
|
||||||
/osrm-cli
|
|
||||||
/osrm-check-hsgr
|
|
||||||
/osrm-springclean
|
|
||||||
/nohup.out
|
|
||||||
|
|
||||||
# Sandbox folder #
|
|
||||||
###################
|
|
||||||
/sandbox/
|
|
||||||
|
|
||||||
# Test related files #
|
|
||||||
######################
|
|
||||||
/test/profile.lua
|
|
||||||
/test/cache
|
|
||||||
/test/speeds.csv
|
|
||||||
/test/penalties.csv
|
|
||||||
node_modules
|
|
||||||
|
|
||||||
# Deprecated config file #
|
|
||||||
##########################
|
|
||||||
/server.ini
|
|
||||||
|
|
||||||
*.swp
|
|
||||||
|
|
||||||
# local lua debugging file
|
|
||||||
debug.lua
|
|
||||||
|
|
||||||
# node-osrm artifacts
|
|
||||||
lib/binding
|
|
||||||
|
|||||||
@@ -1,16 +0,0 @@
|
|||||||
*
|
|
||||||
!README.md
|
|
||||||
!CHANGELOG.md
|
|
||||||
!CONTRIBUTING.MD
|
|
||||||
!LICENCE.TXT
|
|
||||||
!package.json
|
|
||||||
!package-lock.json
|
|
||||||
!yarn.lock
|
|
||||||
!docs
|
|
||||||
!example
|
|
||||||
!taginfo.json
|
|
||||||
!lib/*.js
|
|
||||||
!profiles/*
|
|
||||||
!profiles/lib/*
|
|
||||||
!profiles/examples/*
|
|
||||||
!scripts/node_install.sh
|
|
||||||
@@ -1,441 +0,0 @@
|
|||||||
language: cpp
|
|
||||||
|
|
||||||
git:
|
|
||||||
depth: 10
|
|
||||||
|
|
||||||
# sudo:required is needed for trusty images
|
|
||||||
sudo: required
|
|
||||||
dist: trusty
|
|
||||||
|
|
||||||
notifications:
|
|
||||||
email: false
|
|
||||||
|
|
||||||
branches:
|
|
||||||
only:
|
|
||||||
- 5.15
|
|
||||||
# enable building tags
|
|
||||||
- /^v\d+\.\d+(\.\d+)?(-\S*)?$/
|
|
||||||
|
|
||||||
cache:
|
|
||||||
yarn: true
|
|
||||||
ccache: true
|
|
||||||
apt: true
|
|
||||||
directories:
|
|
||||||
- test/cache
|
|
||||||
|
|
||||||
env:
|
|
||||||
global:
|
|
||||||
- secure: "hk+32aXXF5t1ApaM2Wjqooz3dx1si907L87WRMkO47WlpJmUUU/Ye+MJk9sViH8MdhOcceocVAmdYl5/WFWOIbDWNlBya9QvXDZyIu2KIre/0QyOCTZbrsif8paBXKIO5O/R4OTvIZ8rvWZsadBdmAT9GSbDhih6FzqXAEgeIYQ="
|
|
||||||
- secure: "VE+cFkseFwW4jK6XwkP0yW3h4DixPJ8+Eb3yKcchGZ5iIJxlZ/8i1vKHYxadgPRwSYwPSB14tF70xj2OmiT2keGzZUfphmPXinBaLEhYk+Bde+GZZkoSl5ND109I/LcyNr0nG9dDgtV6pkvFchgchpyP9JnVOOS0+crEZlAz0RE="
|
|
||||||
- CCACHE_TEMPDIR=/tmp/.ccache-temp
|
|
||||||
- CCACHE_COMPRESS=1
|
|
||||||
- CASHER_TIME_OUT=599 # one second less than 10m to avoid 10m timeout error: https://github.com/Project-OSRM/osrm-backend/issues/2742
|
|
||||||
- CCACHE_VERSION=3.3.1
|
|
||||||
- CMAKE_VERSION=3.7.2
|
|
||||||
- MASON="$(pwd)/scripts/mason.sh"
|
|
||||||
- ENABLE_NODE_BINDINGS=On
|
|
||||||
- NODE="4"
|
|
||||||
|
|
||||||
matrix:
|
|
||||||
fast_finish: true
|
|
||||||
|
|
||||||
# We override the compiler names here to yield better ccache behavior, which uses this as key
|
|
||||||
include:
|
|
||||||
|
|
||||||
# Debug Builds
|
|
||||||
- os: linux
|
|
||||||
compiler: "format-taginfo-docs"
|
|
||||||
env: NODE=6
|
|
||||||
sudo: false
|
|
||||||
before_install:
|
|
||||||
install:
|
|
||||||
- source $NVM_DIR/nvm.sh
|
|
||||||
- nvm install $NODE
|
|
||||||
- nvm use $NODE
|
|
||||||
- npm --version
|
|
||||||
- npm install --ignore-scripts
|
|
||||||
- npm link --ignore-scripts
|
|
||||||
script:
|
|
||||||
- ./scripts/check_taginfo.py taginfo.json profiles/car.lua
|
|
||||||
- ${MASON} install clang-format 3.8.1
|
|
||||||
- PATH=$(${MASON} prefix clang-format 3.8.1)/bin:${PATH} ./scripts/format.sh && ./scripts/error_on_dirty.sh
|
|
||||||
# See issue 4043
|
|
||||||
#- npm run docs && ./scripts/error_on_dirty.sh
|
|
||||||
after_success:
|
|
||||||
|
|
||||||
- os: linux
|
|
||||||
compiler: "gcc-6-debug-cov"
|
|
||||||
addons: &gcc6
|
|
||||||
apt:
|
|
||||||
sources: ['ubuntu-toolchain-r-test']
|
|
||||||
packages: ['g++-6', 'libbz2-dev', 'libxml2-dev', 'libzip-dev', 'liblua5.2-dev', 'libtbb-dev', 'libgdal-dev', 'libboost-all-dev', 'lcov']
|
|
||||||
env: CCOMPILER='gcc-6' CXXCOMPILER='g++-6' BUILD_TYPE='Debug' ENABLE_COVERAGE=ON CUCUMBER_TIMEOUT=20000
|
|
||||||
before_script:
|
|
||||||
- cd ${TRAVIS_BUILD_DIR}
|
|
||||||
- lcov --directory . --zerocounters # clean cached da files
|
|
||||||
after_success:
|
|
||||||
# Creating report
|
|
||||||
- cd ${TRAVIS_BUILD_DIR}
|
|
||||||
- lcov --directory . --capture --output-file coverage.info # capture coverage info
|
|
||||||
- lcov --remove coverage.info '/usr/*' --output-file coverage.info # filter out system
|
|
||||||
- lcov --list coverage.info #debug info
|
|
||||||
# Uploading report to CodeCov
|
|
||||||
- bash <(curl -s https://codecov.io/bash) || echo "Codecov did not collect coverage reports"
|
|
||||||
|
|
||||||
- os: linux
|
|
||||||
compiler: "gcc-6-debug-asan"
|
|
||||||
addons: &gcc6
|
|
||||||
apt:
|
|
||||||
sources: ['ubuntu-toolchain-r-test']
|
|
||||||
packages: ['g++-6', 'libbz2-dev', 'libxml2-dev', 'libzip-dev', 'liblua5.2-dev', 'libtbb-dev', 'libgdal-dev', 'libboost-all-dev']
|
|
||||||
env: CCOMPILER='gcc-6' CXXCOMPILER='g++-6' BUILD_TYPE='Debug' TARGET_ARCH='x86_64-asan' ENABLE_SANITIZER=ON CUCUMBER_TIMEOUT=20000 LSAN_OPTIONS="suppressions=$TRAVIS_BUILD_DIR/scripts/travis/leaksanitizer.conf"
|
|
||||||
|
|
||||||
- os: linux
|
|
||||||
compiler: "clang-4.0-debug"
|
|
||||||
addons: &clang40
|
|
||||||
apt:
|
|
||||||
sources: ['ubuntu-toolchain-r-test']
|
|
||||||
packages: ['libstdc++-5-dev', 'libbz2-dev', 'libxml2-dev', 'libzip-dev', 'liblua5.2-dev', 'libtbb-dev', 'libgdal-dev', 'libboost-all-dev']
|
|
||||||
env: CLANG_VERSION='4.0.0' BUILD_TYPE='Debug' CUCUMBER_TIMEOUT=60000
|
|
||||||
|
|
||||||
- os: linux
|
|
||||||
compiler: "mason-linux-debug-asan"
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
sources: ['ubuntu-toolchain-r-test']
|
|
||||||
packages: ['libstdc++-4.9-dev']
|
|
||||||
env: CLANG_VERSION='4.0.0' BUILD_TYPE='Release' ENABLE_MASON=ON ENABLE_SANITIZER=ON LSAN_OPTIONS="suppressions=$TRAVIS_BUILD_DIR/scripts/travis/leaksanitizer.conf"
|
|
||||||
|
|
||||||
# Release Builds
|
|
||||||
- os: linux
|
|
||||||
compiler: "mason-linux-release"
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
sources: ['ubuntu-toolchain-r-test']
|
|
||||||
packages: ['libstdc++-4.9-dev']
|
|
||||||
env: CLANG_VERSION='4.0.0' BUILD_TYPE='Release' ENABLE_MASON=ON RUN_CLANG_FORMAT=ON ENABLE_LTO=ON
|
|
||||||
|
|
||||||
- os: linux
|
|
||||||
compiler: "gcc-6-release"
|
|
||||||
addons: &gcc6
|
|
||||||
apt:
|
|
||||||
sources: ['ubuntu-toolchain-r-test']
|
|
||||||
packages: ['g++-6', 'libbz2-dev', 'libxml2-dev', 'libzip-dev', 'liblua5.2-dev', 'libtbb-dev', 'libgdal-dev', 'libboost-all-dev']
|
|
||||||
env: CCOMPILER='gcc-6' CXXCOMPILER='g++-6' BUILD_TYPE='Release'
|
|
||||||
|
|
||||||
- os: linux
|
|
||||||
compiler: "gcc-6-release-i686"
|
|
||||||
env: >
|
|
||||||
TARGET_ARCH='i686' CCOMPILER='gcc-6' CXXCOMPILER='g++-6' BUILD_TYPE='Release'
|
|
||||||
CFLAGS='-m32 -msse2 -mfpmath=sse' CXXFLAGS='-m32 -msse2 -mfpmath=sse'
|
|
||||||
|
|
||||||
- os: linux
|
|
||||||
compiler: "gcc-6-stxxl"
|
|
||||||
addons: &gcc6
|
|
||||||
apt:
|
|
||||||
sources: ['ubuntu-toolchain-r-test']
|
|
||||||
packages: ['g++-6', 'libbz2-dev', 'libstxxl-dev', 'libxml2-dev', 'libzip-dev', 'liblua5.2-dev', 'libtbb-dev', 'libgdal-dev', 'libboost-all-dev']
|
|
||||||
env: CCOMPILER='gcc-6' CXXCOMPILER='g++-6' BUILD_TYPE='Release' ENABLE_STXXL=On
|
|
||||||
|
|
||||||
- os: linux
|
|
||||||
compiler: "gcc-4.9-release"
|
|
||||||
addons: &gcc49
|
|
||||||
apt:
|
|
||||||
sources: ['ubuntu-toolchain-r-test']
|
|
||||||
packages: ['g++-4.9', 'libbz2-dev', 'libxml2-dev', 'libzip-dev', 'liblua5.2-dev', 'libtbb-dev', 'libgdal-dev', 'libboost-all-dev', 'ccache']
|
|
||||||
env: CCOMPILER='gcc-4.9' CXXCOMPILER='g++-4.9' BUILD_TYPE='Release'
|
|
||||||
|
|
||||||
- os: osx
|
|
||||||
osx_image: xcode8.2
|
|
||||||
compiler: "mason-osx-release"
|
|
||||||
# we use the xcode provides clang and don't install our own
|
|
||||||
env: ENABLE_MASON=ON BUILD_TYPE='Release' CUCUMBER_TIMEOUT=60000 CCOMPILER='clang' CXXCOMPILER='clang++' ENABLE_ASSERTIONS=ON ENABLE_LTO=ON NODE="4"
|
|
||||||
after_success:
|
|
||||||
- ./scripts/travis/publish.sh
|
|
||||||
|
|
||||||
- os: osx
|
|
||||||
osx_image: xcode8.2
|
|
||||||
compiler: "mason-osx-release"
|
|
||||||
# we use the xcode provides clang and don't install our own
|
|
||||||
env: ENABLE_MASON=ON BUILD_TYPE='Release' CUCUMBER_TIMEOUT=60000 CCOMPILER='clang' CXXCOMPILER='clang++' ENABLE_ASSERTIONS=ON ENABLE_LTO=ON NODE="6"
|
|
||||||
after_success:
|
|
||||||
- ./scripts/travis/publish.sh
|
|
||||||
|
|
||||||
# Disabled because of CI slowness
|
|
||||||
#- os: linux
|
|
||||||
#- compiler: clang
|
|
||||||
#- addons: &clang40
|
|
||||||
#- apt:
|
|
||||||
#- sources: ['llvm-toolchain-trusty-4.0', 'ubuntu-toolchain-r-test']
|
|
||||||
#- packages: ['clang-4.0', 'libbz2-dev', 'libxml2-dev', 'libzip-dev', 'liblua5.2-dev', 'libtbb-dev', 'libgdal-dev', 'libboost-all-dev']
|
|
||||||
#- env: CCOMPILER='clang-4.0' CXXCOMPILER='clang++-4.0' BUILD_TYPE='Release'
|
|
||||||
|
|
||||||
# Shared Library
|
|
||||||
- os: linux
|
|
||||||
compiler: "gcc-6-release-shared"
|
|
||||||
addons: &gcc6
|
|
||||||
apt:
|
|
||||||
sources: ['ubuntu-toolchain-r-test']
|
|
||||||
packages: ['g++-6', 'libbz2-dev', 'libxml2-dev', 'libzip-dev', 'liblua5.2-dev', 'libtbb-dev', 'libgdal-dev', 'libboost-all-dev']
|
|
||||||
env: CCOMPILER='gcc-6' CXXCOMPILER='g++-6' BUILD_TYPE='Release' BUILD_SHARED_LIBS=ON
|
|
||||||
|
|
||||||
# Disabled because CI slowness
|
|
||||||
#- os: linux
|
|
||||||
#- compiler: clang
|
|
||||||
#- addons: &clang40
|
|
||||||
#- apt:
|
|
||||||
#- sources: ['llvm-toolchain-trusty-4.0', 'ubuntu-toolchain-r-test']
|
|
||||||
#- packages: ['clang-4.0', 'libbz2-dev', 'libxml2-dev', 'libzip-dev', 'liblua5.2-dev', 'libtbb-dev', 'libgdal-dev', 'libboost-all-dev']
|
|
||||||
#- env: CCOMPILER='clang-4.0' CXXCOMPILER='clang++-4.0' BUILD_TYPE='Release' BUILD_SHARED_LIBS=ON
|
|
||||||
|
|
||||||
# Node build jobs. These skip running the tests.
|
|
||||||
- os: linux
|
|
||||||
sudo: false
|
|
||||||
compiler: "node-4-mason-linux-release"
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
sources: ['ubuntu-toolchain-r-test']
|
|
||||||
packages: ['libstdc++-4.9-dev']
|
|
||||||
env: CLANG_VERSION='4.0.0' BUILD_TYPE='Release' ENABLE_MASON=ON ENABLE_LTO=ON JOBS=3
|
|
||||||
install:
|
|
||||||
- pushd ${OSRM_BUILD_DIR}
|
|
||||||
- |
|
|
||||||
cmake .. -DCMAKE_BUILD_TYPE=${BUILD_TYPE} \
|
|
||||||
-DENABLE_MASON=${ENABLE_MASON:-OFF} \
|
|
||||||
-DENABLE_NODE_BINDINGS=${ENABLE_NODE_BINDINGS:-OFF} \
|
|
||||||
-DENABLE_CCACHE=ON \
|
|
||||||
-DCMAKE_INSTALL_PREFIX=${OSRM_INSTALL_DIR} \
|
|
||||||
-DENABLE_GLIBC_WORKAROUND=ON
|
|
||||||
- make --jobs=${JOBS}
|
|
||||||
- popd
|
|
||||||
script:
|
|
||||||
- npm run nodejs-tests
|
|
||||||
after_success:
|
|
||||||
- ./scripts/travis/publish.sh
|
|
||||||
|
|
||||||
- os: linux
|
|
||||||
sudo: false
|
|
||||||
compiler: "node-4-mason-linux-release"
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
sources: ['ubuntu-toolchain-r-test']
|
|
||||||
packages: ['libstdc++-4.9-dev']
|
|
||||||
env: CLANG_VERSION='4.0.0' BUILD_TYPE='Debug' ENABLE_MASON=ON ENABLE_LTO=ON JOBS=3
|
|
||||||
install:
|
|
||||||
- pushd ${OSRM_BUILD_DIR}
|
|
||||||
- |
|
|
||||||
cmake .. -DCMAKE_BUILD_TYPE=${BUILD_TYPE} \
|
|
||||||
-DENABLE_MASON=${ENABLE_MASON:-OFF} \
|
|
||||||
-DENABLE_NODE_BINDINGS=${ENABLE_NODE_BINDINGS:-OFF} \
|
|
||||||
-DENABLE_CCACHE=ON \
|
|
||||||
-DCMAKE_INSTALL_PREFIX=${OSRM_INSTALL_DIR} \
|
|
||||||
-DENABLE_GLIBC_WORKAROUND=ON
|
|
||||||
- make --jobs=${JOBS}
|
|
||||||
- popd
|
|
||||||
script:
|
|
||||||
- npm run nodejs-tests
|
|
||||||
after_success:
|
|
||||||
- ./scripts/travis/publish.sh
|
|
||||||
|
|
||||||
- os: linux
|
|
||||||
sudo: false
|
|
||||||
compiler: "node-6-mason-linux-release"
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
sources: ['ubuntu-toolchain-r-test']
|
|
||||||
packages: ['libstdc++-4.9-dev']
|
|
||||||
env: CLANG_VERSION='4.0.0' BUILD_TYPE='Release' ENABLE_MASON=ON ENABLE_LTO=ON JOBS=3 NODE="6"
|
|
||||||
install:
|
|
||||||
- pushd ${OSRM_BUILD_DIR}
|
|
||||||
- |
|
|
||||||
cmake .. -DCMAKE_BUILD_TYPE=${BUILD_TYPE} \
|
|
||||||
-DENABLE_MASON=${ENABLE_MASON:-OFF} \
|
|
||||||
-DENABLE_NODE_BINDINGS=${ENABLE_NODE_BINDINGS:-OFF} \
|
|
||||||
-DENABLE_CCACHE=ON \
|
|
||||||
-DCMAKE_INSTALL_PREFIX=${OSRM_INSTALL_DIR} \
|
|
||||||
-DENABLE_GLIBC_WORKAROUND=ON
|
|
||||||
- make --jobs=${JOBS}
|
|
||||||
- popd
|
|
||||||
script:
|
|
||||||
- npm run nodejs-tests
|
|
||||||
after_success:
|
|
||||||
- ./scripts/travis/publish.sh
|
|
||||||
|
|
||||||
- os: linux
|
|
||||||
sudo: false
|
|
||||||
compiler: "node-6-mason-linux-release"
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
sources: ['ubuntu-toolchain-r-test']
|
|
||||||
packages: ['libstdc++-4.9-dev']
|
|
||||||
env: CLANG_VERSION='4.0.0' BUILD_TYPE='Debug' ENABLE_MASON=ON ENABLE_LTO=ON JOBS=3 NODE="6"
|
|
||||||
install:
|
|
||||||
- pushd ${OSRM_BUILD_DIR}
|
|
||||||
- |
|
|
||||||
cmake .. -DCMAKE_BUILD_TYPE=${BUILD_TYPE} \
|
|
||||||
-DENABLE_MASON=${ENABLE_MASON:-OFF} \
|
|
||||||
-DENABLE_NODE_BINDINGS=${ENABLE_NODE_BINDINGS:-OFF} \
|
|
||||||
-DENABLE_CCACHE=ON \
|
|
||||||
-DCMAKE_INSTALL_PREFIX=${OSRM_INSTALL_DIR} \
|
|
||||||
-DENABLE_GLIBC_WORKAROUND=ON
|
|
||||||
- make --jobs=${JOBS}
|
|
||||||
- popd
|
|
||||||
script:
|
|
||||||
- npm run nodejs-tests
|
|
||||||
after_success:
|
|
||||||
- ./scripts/travis/publish.sh
|
|
||||||
|
|
||||||
- os: linux
|
|
||||||
sudo: false
|
|
||||||
compiler: "node-8-mason-linux-release"
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
sources: ['ubuntu-toolchain-r-test']
|
|
||||||
packages: ['libstdc++-4.9-dev']
|
|
||||||
env: CLANG_VERSION='4.0.0' BUILD_TYPE='Release' ENABLE_MASON=ON ENABLE_LTO=ON JOBS=3 NODE="8"
|
|
||||||
install:
|
|
||||||
- pushd ${OSRM_BUILD_DIR}
|
|
||||||
- |
|
|
||||||
cmake .. -DCMAKE_BUILD_TYPE=${BUILD_TYPE} \
|
|
||||||
-DENABLE_MASON=${ENABLE_MASON:-OFF} \
|
|
||||||
-DENABLE_NODE_BINDINGS=${ENABLE_NODE_BINDINGS:-OFF} \
|
|
||||||
-DENABLE_CCACHE=ON \
|
|
||||||
-DCMAKE_INSTALL_PREFIX=${OSRM_INSTALL_DIR} \
|
|
||||||
-DENABLE_GLIBC_WORKAROUND=ON
|
|
||||||
- make --jobs=${JOBS}
|
|
||||||
- popd
|
|
||||||
script:
|
|
||||||
- npm run nodejs-tests
|
|
||||||
after_success:
|
|
||||||
- ./scripts/travis/publish.sh
|
|
||||||
|
|
||||||
- os: linux
|
|
||||||
sudo: false
|
|
||||||
compiler: "node-6-mason-linux-release"
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
sources: ['ubuntu-toolchain-r-test']
|
|
||||||
packages: ['libstdc++-4.9-dev']
|
|
||||||
env: CLANG_VERSION='4.0.0' BUILD_TYPE='Debug' ENABLE_MASON=ON ENABLE_LTO=ON JOBS=3 NODE="8"
|
|
||||||
install:
|
|
||||||
- pushd ${OSRM_BUILD_DIR}
|
|
||||||
- |
|
|
||||||
cmake .. -DCMAKE_BUILD_TYPE=${BUILD_TYPE} \
|
|
||||||
-DENABLE_MASON=${ENABLE_MASON:-OFF} \
|
|
||||||
-DENABLE_NODE_BINDINGS=${ENABLE_NODE_BINDINGS:-OFF} \
|
|
||||||
-DENABLE_CCACHE=ON \
|
|
||||||
-DCMAKE_INSTALL_PREFIX=${OSRM_INSTALL_DIR} \
|
|
||||||
-DENABLE_GLIBC_WORKAROUND=ON
|
|
||||||
- make --jobs=${JOBS}
|
|
||||||
- popd
|
|
||||||
script:
|
|
||||||
- npm run nodejs-tests
|
|
||||||
after_success:
|
|
||||||
- ./scripts/travis/publish.sh
|
|
||||||
|
|
||||||
before_install:
|
|
||||||
- source $NVM_DIR/nvm.sh
|
|
||||||
- nvm install $NODE
|
|
||||||
- nvm use $NODE
|
|
||||||
- node --version
|
|
||||||
- if [[ ! -z $TARGET_ARCH ]] ; then source ./scripts/travis/before_install.$TARGET_ARCH.sh ; fi
|
|
||||||
- |
|
|
||||||
if [[ -z $JOBS ]]; then
|
|
||||||
if [[ "${TRAVIS_OS_NAME}" == "linux" ]]; then
|
|
||||||
export JOBS=$((`nproc` + 1))
|
|
||||||
elif [[ "${TRAVIS_OS_NAME}" == "osx" ]]; then
|
|
||||||
export JOBS=$((`sysctl -n hw.ncpu` + 1))
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
- |
|
|
||||||
if [[ "${TRAVIS_OS_NAME}" == "osx" ]]; then
|
|
||||||
sudo mdutil -i off /
|
|
||||||
fi
|
|
||||||
- |
|
|
||||||
if [[ ! -f $(which yarn) ]]; then
|
|
||||||
npm install -g yarn
|
|
||||||
fi
|
|
||||||
- export PACKAGE_JSON_VERSION=$(node -e "console.log(require('./package.json').version)")
|
|
||||||
- export PUBLISH=$([[ "${TRAVIS_TAG:-}" == "v${PACKAGE_JSON_VERSION}" ]] && echo "On" || echo "Off")
|
|
||||||
- echo "Using ${JOBS} jobs"
|
|
||||||
- yarn install --ignore-scripts
|
|
||||||
- yarn check --ignore-scripts --integrity
|
|
||||||
# Bootstrap cmake to be able to run mason
|
|
||||||
- CMAKE_URL="https://mason-binaries.s3.amazonaws.com/${TRAVIS_OS_NAME}-x86_64/cmake/${CMAKE_VERSION}.tar.gz"
|
|
||||||
- CMAKE_DIR="mason_packages/${TRAVIS_OS_NAME}-x86_64/cmake/${CMAKE_VERSION}"
|
|
||||||
- mkdir -p ${CMAKE_DIR}
|
|
||||||
- travis_retry wget --quiet -O - ${CMAKE_URL} | tar --strip-components=1 -xz -C ${CMAKE_DIR} || travis_terminate 1
|
|
||||||
- export PATH=${CMAKE_DIR}/bin:${PATH}
|
|
||||||
- ${MASON} install tbb 2017_U7 && export LD_LIBRARY_PATH=$(${MASON} prefix tbb 2017_U7)/lib/:${LD_LIBRARY_PATH}
|
|
||||||
- ${MASON} install ccache ${CCACHE_VERSION} && export PATH=$(${MASON} prefix ccache ${CCACHE_VERSION})/bin:${PATH}
|
|
||||||
- |
|
|
||||||
if [[ ! -z ${CLANG_VERSION} ]]; then
|
|
||||||
export CCOMPILER='clang'
|
|
||||||
export CXXCOMPILER='clang++'
|
|
||||||
${MASON} install clang++ ${CLANG_VERSION} && export PATH=$(${MASON} prefix clang++ ${CLANG_VERSION})/bin:${PATH} || travis_terminate 1
|
|
||||||
# we only enable lto for release builds
|
|
||||||
# and therefore don't need to us ld.gold or llvm tools for linking
|
|
||||||
# for debug builds
|
|
||||||
if [[ ${BUILD_TYPE} == 'Release' ]]; then
|
|
||||||
${MASON} install binutils 2.27 && export PATH=$(${MASON} prefix binutils 2.27)/bin:${PATH} || travis_terminate 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
- ccache --max-size=256M # limiting the cache's size to roughly the previous job's object sizes
|
|
||||||
- export OSRM_INSTALL_DIR="$(pwd)/install-osrm"
|
|
||||||
- export OSRM_BUILD_DIR="$(pwd)/build-osrm"
|
|
||||||
- export CC=${CCOMPILER} CXX=${CXXCOMPILER}
|
|
||||||
- mkdir ${OSRM_BUILD_DIR}
|
|
||||||
|
|
||||||
install:
|
|
||||||
- pushd ${OSRM_BUILD_DIR}
|
|
||||||
- |
|
|
||||||
cmake .. -DCMAKE_BUILD_TYPE=${BUILD_TYPE} \
|
|
||||||
-DENABLE_MASON=${ENABLE_MASON:-OFF} \
|
|
||||||
-DENABLE_ASSERTIONS=${ENABLE_ASSERTIONS:-OFF} \
|
|
||||||
-DBUILD_SHARED_LIBS=${BUILD_SHARED_LIBS:-OFF} \
|
|
||||||
-DENABLE_COVERAGE=${ENABLE_COVERAGE:-OFF} \
|
|
||||||
-DENABLE_NODE_BINDINGS=${ENABLE_NODE_BINDINGS:-OFF} \
|
|
||||||
-DENABLE_SANITIZER=${ENABLE_SANITIZER:-OFF} \
|
|
||||||
-DENABLE_STXXL=${ENABLE_STXXL:-OFF} \
|
|
||||||
-DBUILD_TOOLS=ON \
|
|
||||||
-DENABLE_CCACHE=ON \
|
|
||||||
-DCMAKE_INSTALL_PREFIX=${OSRM_INSTALL_DIR} \
|
|
||||||
-DENABLE_GLIBC_WORKAROUND=${ENABLE_GLIBC_WORKAROUND:-OFF}
|
|
||||||
- echo "travis_fold:start:MAKE"
|
|
||||||
- make --jobs=${JOBS}
|
|
||||||
- make tests --jobs=${JOBS}
|
|
||||||
- make benchmarks --jobs=${JOBS}
|
|
||||||
- echo "travis_fold:end:MAKE"
|
|
||||||
- ccache -s
|
|
||||||
- sudo make install
|
|
||||||
- |
|
|
||||||
if [[ "${TRAVIS_OS_NAME}" == "linux" ]]; then
|
|
||||||
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:${OSRM_INSTALL_DIR}/lib
|
|
||||||
fi
|
|
||||||
- popd
|
|
||||||
- mkdir example/build && pushd example/build
|
|
||||||
- export PKG_CONFIG_PATH=${OSRM_INSTALL_DIR}/lib/pkgconfig
|
|
||||||
- cmake .. -DCMAKE_BUILD_TYPE=${BUILD_TYPE}
|
|
||||||
- make --jobs=${JOBS}
|
|
||||||
- popd
|
|
||||||
|
|
||||||
script:
|
|
||||||
- if [[ $TARGET_ARCH == armhf ]] ; then echo "Skip tests for $TARGET_ARCH" && exit 0 ; fi
|
|
||||||
- make -C test/data benchmark
|
|
||||||
- ./example/build/osrm-example test/data/mld/monaco.osrm
|
|
||||||
# All tests assume to be run from the build directory
|
|
||||||
- pushd ${OSRM_BUILD_DIR}
|
|
||||||
- ./unit_tests/library-tests
|
|
||||||
- ./unit_tests/extractor-tests
|
|
||||||
- ./unit_tests/contractor-tests
|
|
||||||
- ./unit_tests/engine-tests
|
|
||||||
- ./unit_tests/util-tests
|
|
||||||
- ./unit_tests/server-tests
|
|
||||||
- ./unit_tests/partition-tests
|
|
||||||
- |
|
|
||||||
if [ -z "${ENABLE_SANITIZER}" ] && [ "$TARGET_ARCH" != "i686" ]; then
|
|
||||||
npm run nodejs-tests
|
|
||||||
fi
|
|
||||||
- |
|
|
||||||
- popd
|
|
||||||
- yarn test
|
|
||||||
@@ -1,699 +0,0 @@
|
|||||||
# 5.15.0
|
|
||||||
- Changes from 5.14.3:
|
|
||||||
- Bugfixes:
|
|
||||||
- FIXED #4704: Fixed regression in bearings reordering introduced in 5.13 [#4704](https://github.com/Project-OSRM/osrm-backend/issues/4704)
|
|
||||||
- FIXED #4781: Fixed overflow exceptions in percent-encoding parsing
|
|
||||||
- FIXED #4770: Fixed exclude flags for single toll road scenario
|
|
||||||
- FIXED #4283: Fix overflow on zero duration segments
|
|
||||||
- FIXED #4804: Ignore no_*_on_red turn restrictions
|
|
||||||
- Guidance:
|
|
||||||
- CHANGED #4706: Guidance refactoring step to decouple intersection connectivity analysis and turn instructions generation [#4706](https://github.com/Project-OSRM/osrm-backend/pull/4706)
|
|
||||||
- CHANGED #3491: Refactor `isThroughStreet`/Intersection options
|
|
||||||
- Profile:
|
|
||||||
- ADDED: `tunnel` as a new class in car profile so that sections of the route with tunnel tags will be marked as such
|
|
||||||
|
|
||||||
# 5.14.3
|
|
||||||
- Changes from 5.14.2:
|
|
||||||
- Features:
|
|
||||||
- Added a `waypoints` parameter to the match service plugin that accepts indices to input coordinates and treats only those points as waypoints in the response format.
|
|
||||||
- Bugfixes:
|
|
||||||
- FIXED #4754: U-Turn penalties are applied to straight turns.
|
|
||||||
- FIXED #4756: Removed too restrictive road name check in the sliproad handler
|
|
||||||
- FIXED #4731: Use correct weights for edge-based graph duplicated via nodes.
|
|
||||||
- Profile:
|
|
||||||
- CHANGED: added Belarus speed limits
|
|
||||||
- CHANGED: set default urban speed in Ukraine to 50kmh
|
|
||||||
|
|
||||||
# 5.14.2
|
|
||||||
- Changes from 5.14.1:
|
|
||||||
- Bugfixes:
|
|
||||||
- FIXED #4727: Erroring when a old .core file is present.
|
|
||||||
- FIXED #4642: Update checks for EMPTY_NAMEID to check for empty name strings
|
|
||||||
- FIXED #4738: Fix potential segmentation fault
|
|
||||||
- Node.js Bindings:
|
|
||||||
- ADDED: Exposed new `max_radiuses_map_matching` option from `EngingConfig` options
|
|
||||||
- Tools:
|
|
||||||
- ADDED: New osrm-routed `max_radiuses_map_matching` command line flag to optionally set a maximum radius for map matching
|
|
||||||
|
|
||||||
# 5.14.1
|
|
||||||
- Changes from 5.14.0
|
|
||||||
- Bugfixes:
|
|
||||||
- FIXED: don't use removed alternative candidates in `filterPackedPathsByCellSharing`
|
|
||||||
|
|
||||||
# 5.14.0
|
|
||||||
- Changes from 5.13
|
|
||||||
- API:
|
|
||||||
- ADDED: new RouteStep property `driving_side` that has either "left" or "right" for that step
|
|
||||||
- Misc:
|
|
||||||
- ADDED: Bundles a rough (please improve!) driving-side GeoJSON file for use with `osrm-extract --location-dependent-data data/driving_side.geojson`
|
|
||||||
- CHANGED: Conditional turn parsing is disabled by default now
|
|
||||||
- ADDED: Adds a tool to analyze turn instruction generation in a dataset. Useful for tracking turn-by-turn heuristic changes over time.
|
|
||||||
- CHANGED: Internal refactoring of guidance code as a first step towards a re-runnable guidance pipeline
|
|
||||||
- ADDED: Now publishing Node 8.x LTS binary modules
|
|
||||||
- Profile:
|
|
||||||
- CHANGED: Remove dependency on turn types and turn modifier in the process_turn function in the `car.lua` profile. Guidance instruction types are not used to influence turn penalty anymore so this will break backward compatibility between profile version 3 and 4.
|
|
||||||
- Guidance:
|
|
||||||
- ADDED: New internal flag on "segregated intersections" - in the future, will should allow collapsing of instructions across complex intersection geometry where humans only perceive a single maneuver
|
|
||||||
- CHANGED: Decrease roundabout turn radius threshold from 25m to 15m - adds some "exit the roundabout" instructions for moderately sized roundabouts that were being missed previously
|
|
||||||
- Docker:
|
|
||||||
- CHANGED: switch to alpine 3.6, and use a multistage build to reduce image size
|
|
||||||
- Build:
|
|
||||||
- FIX: use LUA_LIBRARY_DIRS to propertly detect Lua on all platforms
|
|
||||||
- Docs:
|
|
||||||
- FIX: clarify description of roundabout exit instructions
|
|
||||||
- Bugfixes:
|
|
||||||
- FIXED: Fix bug where merge instructions got the wrong direction modifier ([PR #4670](https://github.com/Project-OSRM/osrm-backend/pull/4670))
|
|
||||||
- FIXED: Properly use the `profile.properties.left_hand_driving` property, there was a typo that meant it had no effect
|
|
||||||
- FIXED: undefined behaviour when alternative candidate via node is same as source node ([#4691](https://github.com/Project-OSRM/osrm-backend/issues/4691))
|
|
||||||
- FIXED: ensure libosrm.pc is pushed to the correct location for pkgconfig to find it on all platforms
|
|
||||||
- FIXED: don't consider empty names + empty refs as a valid name for u-turns
|
|
||||||
|
|
||||||
# 5.13.0
|
|
||||||
- Changes from 5.12:
|
|
||||||
- Profile:
|
|
||||||
- Append cardinal directions from route relations to ref fields to improve instructions; off by default see `profile.cardinal_directions`
|
|
||||||
- Support of `distance` weight in foot and bicycle profiles
|
|
||||||
- Support of relations processing
|
|
||||||
- Added `way:get_location_tag(key)` method to get location-dependent tags https://github.com/Project-OSRM/osrm-backend/wiki/Using-location-dependent-data-in-profiles
|
|
||||||
- Added `forward_ref` and `backward_ref` support
|
|
||||||
- Left-side driving mode is specified by a local Boolean flag `is_left_hand_driving` in `ExtractionWay` and `ExtractionTurn`
|
|
||||||
- Support literal values for maxspeeds in NO, PL and ZA
|
|
||||||
- Infrastructure:
|
|
||||||
- Lua 5.1 support is removed due to lack of support in sol2 https://github.com/ThePhD/sol2/issues/302
|
|
||||||
- Fixed pkg-config version of OSRM
|
|
||||||
- Removed `.osrm.core` file since CoreCH is deprecated now.
|
|
||||||
- Tools:
|
|
||||||
- Because of boost/program_options#32 with boost 1.65+ we needed to change the behavior of the following flags to not accept `={true|false}` anymore:
|
|
||||||
- `--use-locations-cache=false` becomes `--disable-location-cache`
|
|
||||||
- `--parse-conditional-restrictions=true` becomes `--parse-conditional-restrictions`
|
|
||||||
- The deprecated options `--use-level-cache` and `--generate-edge-lookup`
|
|
||||||
- Bugfixes:
|
|
||||||
- Fixed #4348: Some cases of sliproads pre-processing were broken
|
|
||||||
- Fixed #4331: Correctly compute left/right modifiers of forks in case the fork is curved.
|
|
||||||
- Fixed #4472: Correctly count the number of lanes using the delimter in `turn:lanes` tag.
|
|
||||||
- Fixed #4214: Multiple runs of `osrm-partition` lead to crash.
|
|
||||||
- Fixed #4348: Fix assorted problems around slip roads.
|
|
||||||
- Fixed #4420: A bug that would result in unnecessary instructions, due to problems in suffix/prefix detection
|
|
||||||
- Algorithm
|
|
||||||
- Deprecate CoreCH functionality. Usage of CoreCH specific options will fall back to using CH with core_factor of 1.0
|
|
||||||
- MLD uses a unidirectional Dijkstra for 1-to-N and N-to-1 matrices which yields speedup.
|
|
||||||
|
|
||||||
# 5.12.0
|
|
||||||
- Changes from 5.11:
|
|
||||||
- Guidance
|
|
||||||
- now announcing turning onto oneways at the end of a road (e.g. onto dual carriageways)
|
|
||||||
- Adds new instruction types at the exit of roundabouts and rotaries `exit roundabout` and `exit rotary`.
|
|
||||||
- HTTP:
|
|
||||||
- New query parameter for route/table/match/trip plugings:
|
|
||||||
`exclude=` that can be used to exclude certain classes (e.g. exclude=motorway, exclude=toll).
|
|
||||||
This is configurable in the profile.
|
|
||||||
- NodeJS:
|
|
||||||
- New query option `exclude` for the route/table/match/trip plugins. (e.g. `exclude: ["motorway", "toll"]`)
|
|
||||||
- Profile:
|
|
||||||
- New property for profile table: `excludable` that can be used to configure which classes are excludable at query time.
|
|
||||||
- New optional property for profile table: `classes` that allows you to specify which classes you expect to be used.
|
|
||||||
We recommend this for better error messages around classes, otherwise the possible class names are infered automatically.
|
|
||||||
- Traffic:
|
|
||||||
- If traffic data files contain an empty 4th column, they will update edge durations but not modify the edge weight. This is useful for
|
|
||||||
updating ETAs returned, without changing route selection (for example, in a distance-based profile with traffic data loaded).
|
|
||||||
- Infrastructure:
|
|
||||||
- New file `.osrm.cell_metrics` created by `osrm-customize`.
|
|
||||||
- Debug tiles:
|
|
||||||
- Added new properties `type` and `modifier` to `turns` layer, useful for viewing guidance calculated turn types on the map
|
|
||||||
|
|
||||||
# 5.11.0
|
|
||||||
- Changes from 5.10:
|
|
||||||
- Features
|
|
||||||
- BREAKING: Added support for conditional via-way restrictions. This features changes the file format of osrm.restrictions and requires re-extraction
|
|
||||||
- Internals
|
|
||||||
- BREAKING: Traffic signals will no longer be represented as turns internally. This requires re-processing of data but enables via-way turn restrictions across highway=traffic_signals
|
|
||||||
- Additional checks for empty segments when loading traffic data files
|
|
||||||
- Tunes the constants for turns in sharp curves just a tiny bit to circumvent a mix-up in fork directions at a specific intersection (https://github.com/Project-OSRM/osrm-backend/issues/4331)
|
|
||||||
- Infrastructure
|
|
||||||
- Refactor datafacade to make implementing additional DataFacades simpler
|
|
||||||
- Bugfixes
|
|
||||||
- API docs are now buildable again
|
|
||||||
- Suppress unnecessary extra turn instruction when exiting a motorway via a motorway_link onto a primary road (https://github.com/Project-OSRM/osrm-backend/issues/4348 scenario 4)
|
|
||||||
- Suppress unnecessary extra turn instruction when taking a tertiary_link road from a teritary onto a residential road (https://github.com/Project-OSRM/osrm-backend/issues/4348 scenario 2)
|
|
||||||
- Various MSVC++ build environment fixes
|
|
||||||
- Avoid a bug that crashes GCC6
|
|
||||||
- Re-include .npmignore to slim down published modules
|
|
||||||
- Fix a pre-processing bug where incorrect directions could be issued when two turns would have similar instructions and we tried to give them distinct values (https://github.com/Project-OSRM/osrm-backend/pull/4375)
|
|
||||||
- The entry bearing for correct the cardinality of a direction value (https://github.com/Project-OSRM/osrm-backend/pull/4353
|
|
||||||
- Change timezones in West Africa to the WAT zone so they're recognized on the Windows platform
|
|
||||||
|
|
||||||
# 5.10.0
|
|
||||||
- Changes from 5.9:
|
|
||||||
- Profiles:
|
|
||||||
- New version 2 profile API which cleans up a number of things and makes it easier to for profiles to include each other. Profiles using the old version 0 and 1 APIs are still supported.
|
|
||||||
- New required `setup()` function that must return a configuration hash. Storing configuration in globals is deprecated.
|
|
||||||
- Passes the config hash returned in `setup()` as an argument to `process_node/way/segment/turn`.
|
|
||||||
- Properties are now set in `.properties` in the config hash returend by setup().
|
|
||||||
- initialize raster sources in `setup()` instead of in a separate callback.
|
|
||||||
- Renames the `sources` helper to `raster`.
|
|
||||||
- Renames `way_functions` to `process_way` (same for node, segment and turn).
|
|
||||||
- Removes `get_restrictions()`. Instead set `.restrictions` in the config hash in `setup()`.
|
|
||||||
- Removes `get_name_suffix_list()`. Instead set `.suffix_list` in the config hash in `setup()`.
|
|
||||||
- Renames `Handlers` to `WayHandlers`.
|
|
||||||
- Pass functions instead of strings to `WayHandlers.run()`, so it's possible to mix in your own functions.
|
|
||||||
- Reorders arguments to `WayHandlers` functions to match `process_way()`.
|
|
||||||
- Profiles must return a hash of profile functions. This makes it easier for profiles to include each other.
|
|
||||||
- Guidance: add support for throughabouts
|
|
||||||
- Bugfixes
|
|
||||||
- Properly save/retrieve datasource annotations for road segments ([#4346](https://github.com/Project-OSRM/osrm-backend/issues/4346)
|
|
||||||
- Fix conditional restriction grammer parsing so it works for single-day-of-week restrictions ([#4357](https://github.com/Project-OSRM/osrm-backend/pull/4357))
|
|
||||||
- Algorithm
|
|
||||||
- BREAKING: the file format requires re-processing due to the changes on via-ways
|
|
||||||
- Added support for via-way restrictions
|
|
||||||
|
|
||||||
# 5.9.2
|
|
||||||
- API:
|
|
||||||
- `annotations=durations,weights,speeds` values no longer include turn penalty values ([#4330](https://github.com/Project-OSRM/osrm-backend/issues/4330))
|
|
||||||
|
|
||||||
# 5.9.1
|
|
||||||
- Infrastructure
|
|
||||||
- STXXL is not required by default
|
|
||||||
|
|
||||||
# 5.9.0
|
|
||||||
- Changes from 5.8:
|
|
||||||
- Algorithm:
|
|
||||||
- Multi-Level Dijkstra:
|
|
||||||
- Plugins supported: `table`
|
|
||||||
- Adds alternative routes support (see [#4047](https://github.com/Project-OSRM/osrm-backend/pull/4047) and [3905](https://github.com/Project-OSRM/osrm-backend/issues/3905)): provides reasonably looking alternative routes (many, if possible) with reasonable query times.
|
|
||||||
- API:
|
|
||||||
- Exposes `alternatives=Number` parameter overload in addition to the boolean flag.
|
|
||||||
- Support for exits numbers and names. New member `exits` in `RouteStep`, based on `junction:ref` on ways
|
|
||||||
- `Intersection` now has new parameter `classes` that can be set in the profile on each way.
|
|
||||||
- Profiles:
|
|
||||||
- `result.exits` allows you to set a way's exit numbers and names, see [`junction:ref`](http://wiki.openstreetmap.org/wiki/Proposed_features/junction_details)
|
|
||||||
- `ExtractionWay` now as new property `forward_classes` and `backward_classes` that can set in the `way_function`.
|
|
||||||
The maximum number of classes is 8.
|
|
||||||
- We now respect the `construction` tag. If the `construction` tag value is not on our whitelist (`minor`, `widening`, `no`) we will exclude the road.
|
|
||||||
- Node.js Bindings:
|
|
||||||
- Exposes `alternatives=Number` parameter overload in addition to the boolean flag
|
|
||||||
- Expose `EngineConfig` options in the node bindings
|
|
||||||
- Tools:
|
|
||||||
- Exposes engine limit on number of alternatives to generate `--max-alternatives` in `osrm-routed` (3 by default)
|
|
||||||
- Infrastructure
|
|
||||||
- STXXL is not required to build OSRM and is an optional dependency for back-compatibility (ENABLE_STXXL=On)
|
|
||||||
- OpenMP is only required when the optional STXXL dependency is used
|
|
||||||
- Bug fixes:
|
|
||||||
- #4278: Remove superflous continious instruction on a motorway.
|
|
||||||
|
|
||||||
# 5.8.0
|
|
||||||
- Changes from 5.7
|
|
||||||
- API:
|
|
||||||
- polyline6 support in request string
|
|
||||||
- new parameter `approaches` for `route`, `table`, `trip` and `nearest` requests. This parameter keep waypoints on the curb side.
|
|
||||||
'approaches' accepts both 'curb' and 'unrestricted' values.
|
|
||||||
Note : the curb side depend on the `ProfileProperties::left_hand_driving`, it's a global property set once by the profile. If you are working with a planet dataset, the api will be wrong in some countries, and right in others.
|
|
||||||
- NodeJs Bindings
|
|
||||||
- new parameter `approaches` for `route`, `table`, `trip` and `nearest` requests.
|
|
||||||
- Tools
|
|
||||||
- `osrm-partition` now ensures it is called before `osrm-contract` and removes inconsitent .hsgr files automatically.
|
|
||||||
- Features
|
|
||||||
- Added conditional restriction support with `parse-conditional-restrictions=true|false` to osrm-extract. This option saves conditional turn restrictions to the .restrictions file for parsing by contract later. Added `parse-conditionals-from-now=utc time stamp` and `--time-zone-file=/path/to/file` to osrm-contract
|
|
||||||
- Command-line tools (osrm-extract, osrm-contract, osrm-routed, etc) now return error codes and legible error messages for common problem scenarios, rather than ugly C++ crashes
|
|
||||||
- Speed up pre-processing by only running the Lua `node_function` for nodes that have tags. Cuts OSM file parsing time in half.
|
|
||||||
- osrm-extract now performs generation of edge-expanded-edges using all available CPUs, which should make osrm-extract significantly faster on multi-CPU machines
|
|
||||||
- Files
|
|
||||||
- .osrm.nodes file was renamed to .nbg_nodes and .ebg_nodes was added
|
|
||||||
- Guidance
|
|
||||||
- #4075 Changed counting of exits on service roundabouts
|
|
||||||
- Debug Tiles
|
|
||||||
- added support for visualising turn penalties to the MLD plugin
|
|
||||||
- added support for showing the rate (reciprocal of weight) on each edge when used
|
|
||||||
- added support for turn weights in addition to turn durations in debug tiles
|
|
||||||
- Bugfixes
|
|
||||||
- Fixed a copy/paste issue assigning wrong directions in similar turns (left over right)
|
|
||||||
- #4074: fixed a bug that would announce entering highway ramps as u-turns
|
|
||||||
- #4122: osrm-routed/libosrm should throw exception when a dataset incompatible with the requested algorithm is loaded
|
|
||||||
- Avoid collapsing u-turns into combined turn instructions
|
|
||||||
|
|
||||||
# 5.7.1
|
|
||||||
- Bugfixes
|
|
||||||
- #4030 Roundabout edge-case crashes post-processing
|
|
||||||
|
|
||||||
# 5.7.0
|
|
||||||
- Changes from 5.6
|
|
||||||
- Algorithm:
|
|
||||||
- OSRM object has new option `algorithm` that allows the selection of a routing algorithm.
|
|
||||||
- New experimental algorithm: Multi-Level Dijkstra with new toolchain:
|
|
||||||
- Allows for fast metric updates in below a minute on continental sized networks (osrm-customize)
|
|
||||||
- Plugins supported: `match` and `route`
|
|
||||||
- Quickstart: `osrm-extract data.osm.pbf`, `osrm-partition data.osrm`, `osrm-customize data.osrm`, `osrm-routed --algorithm=MLD data.osrm`
|
|
||||||
- NodeJs Bindings
|
|
||||||
- Merged https://github.com/Project-OSRM/node-osrm into repository. Build via `cmake .. -DCMAKE_BUILD_TYPE=Release -DENABLE_NODE_BINDINGS=On -DENABLE_MASON=On`.
|
|
||||||
- `OSRM` object has new option `algorihtm="CH","CoreCH","MLD"`
|
|
||||||
- Internals
|
|
||||||
- Shared memory notification via conditional variables on Linux or semaphore queue on OS X and Windows with a limit of 128 OSRM Engine instances
|
|
||||||
- Files
|
|
||||||
- .osrm.datasource_index file was removed. Data is now part of .osrm.geometries.
|
|
||||||
- .osrm.edge_lookup was removed. The option `--generate-edge-lookup` does nothing now.
|
|
||||||
- `osrm-contract` does not depend on the `.osrm.fileIndex` file anymore
|
|
||||||
- `osrm-extract` creates new file `.osrm.cnbg` and `.cnbg_to_ebg`
|
|
||||||
- `osrm-partition` creates new file `.osrm.partition` and `.osrm.cells`
|
|
||||||
- `osrm-customize` creates new file `.osrm.mldgr`
|
|
||||||
- Profiles
|
|
||||||
- Added `force_split_edges` flag to global properties. True value guarantees that segment_function will be called for all segments, but also could double memory consumption
|
|
||||||
- Map Matching:
|
|
||||||
- new option `gaps=split|ignore` to enable/disbale track splitting
|
|
||||||
- new option `tidy=true|false` to simplify traces automatically
|
|
||||||
|
|
||||||
# 5.6.3
|
|
||||||
- Changes from 5.6.0
|
|
||||||
- Bugfixes
|
|
||||||
- #3790 Fix incorrect speed values in tile plugin
|
|
||||||
|
|
||||||
# 5.6.2
|
|
||||||
- Changes from 5.6.0
|
|
||||||
- Bugfixes
|
|
||||||
- Fix incorrect forward datasources getter in facade
|
|
||||||
|
|
||||||
# 5.6.1
|
|
||||||
- Changes from 5.6.0
|
|
||||||
- Bugfixes
|
|
||||||
- Fix #3754 add restricted penalty on NoTurn turns
|
|
||||||
|
|
||||||
# 5.6.0
|
|
||||||
- Changes from 5.5
|
|
||||||
- Bugfixes
|
|
||||||
- Fix #3475 removed an invalid `exit` field from the `arrive` maneuver
|
|
||||||
- Fix #3515 adjusted number of `nodes` in `annotation`
|
|
||||||
- Fix #3605 Fixed a bug that could lead to turns at the end of the road to be suppressed
|
|
||||||
- Fix #2844 handle up to 16777215 code units in OSM names
|
|
||||||
- Infrastructure
|
|
||||||
- Support building rpm packages.
|
|
||||||
- Guidance
|
|
||||||
- No longer emitting turns on ferries, if a ferry should use multiple docking locations
|
|
||||||
- Profiles
|
|
||||||
- Removed the `./profile.lua -> ./profiles/car.lua` symlink. Use specific profiles from the `profiles` directory.
|
|
||||||
- `properties` object has a new `weight_name` field, default value is "duration"
|
|
||||||
- `properties` object has a new `weight_precision` field that specifies a decimal precision of edge weights, default value 1
|
|
||||||
- In `way_function` the filed `forward_rate` and `backward_rate` of `ExtractionWay` can now be set.
|
|
||||||
They have the same interpretation for the way weight as `forward_speed` and `backward_speed` for the edge duration.
|
|
||||||
The unit of rate is meters per weight unit, so higher values will be prefered during routing.
|
|
||||||
- `turn_function` now does not return an integer but takes in a `ExtractionTurn` object and can modify the `weight` and `duration` fields
|
|
||||||
- `segment_function` now takes in a `ExtractionSegment` object and can modify `weight` and `duration` fields
|
|
||||||
- `properties.uturn_penalty` is deprecated. Set it in the `turn_function`. The turn type is exposed as `ExtractionTurn::direction_modifier`.
|
|
||||||
- `properties.traffic_light_penalty` is deprecated. Traffic light penalties now need to be set over in the turn function.
|
|
||||||
Each turn with a traffic light is marked with `ExtractionTurn::has_traffic_light = true`.
|
|
||||||
- Renamed the helper file `profiles/lib/directional.lua` to `profiles/lib/tags.lua` since it now provides more general tags parsing utility functions.
|
|
||||||
- The car and foot profiles now depend on the helper file `profiles/lib/handlers.lua`.
|
|
||||||
- Infrastructure
|
|
||||||
- Disabled link-time optimized (LTO) builds by default. Enable by passing `-DENABLE_LTO=ON` to `cmake` if you need the performance and know what you are doing.
|
|
||||||
- Datafile versioning is now based on OSRM semver values, rather than source code checksums.
|
|
||||||
Datafiles are compatible between patch levels, but incompatible between minor version or higher bumps.
|
|
||||||
- libOSRM now creates an own watcher thread then used in shared memory mode to listen for data updates
|
|
||||||
- Tools:
|
|
||||||
- Added osrm-extract-conditionals tool for checking conditional values in OSM data
|
|
||||||
- Trip Plugin
|
|
||||||
- Added a new feature that finds the optimal route given a list of waypoints, a source and a destination. This does not return a roundtrip and instead returns a one way optimal route from the fixed source to the destination points.
|
|
||||||
|
|
||||||
# 5.5.1
|
|
||||||
- Changes from 5.5.0
|
|
||||||
- API:
|
|
||||||
- Adds `generate_hints=true` (`true` by default) which lets user disable `Hint` generating in the response. Use if you don't need `Hint`s!
|
|
||||||
- Bugfixes
|
|
||||||
- Fix #3418 and ensure we only return bearings in the range 0-359 in API responses
|
|
||||||
- Fixed a bug that could lead to emitting false instructions for staying on a roundabout
|
|
||||||
|
|
||||||
# 5.5.0
|
|
||||||
- Changes from 5.4.0
|
|
||||||
- API:
|
|
||||||
- `osrm-datastore` now accepts the parameter `--max-wait` that specifies how long it waits before aquiring a shared memory lock by force
|
|
||||||
- Shared memory now allows for multiple clients (multiple instances of libosrm on the same segment)
|
|
||||||
- Polyline geometries can now be requested with precision 5 as well as with precision 6
|
|
||||||
- Profiles
|
|
||||||
- the car profile has been refactored into smaller functions
|
|
||||||
- get_value_by_key() is now guaranteed never to return empty strings, nil is returned instead.
|
|
||||||
- debug.lua was added to make it easier to test/develop profile code.
|
|
||||||
- `car.lua` now depends on lib/set.lua and lib/sequence.lua
|
|
||||||
- `restrictions` is now used for namespaced restrictions and restriction exceptions (e.g. `restriction:motorcar=` as well as `except=motorcar`)
|
|
||||||
- replaced lhs/rhs profiles by using test defined profiles
|
|
||||||
- Handle `oneway=alternating` (routed over with penalty) separately from `oneway=reversible` (not routed over due to time dependence)
|
|
||||||
- Handle `destination:forward`, `destination:backward`, `destination:ref:forward`, `destination:ref:backward` tags
|
|
||||||
- Properly handle destinations on `oneway=-1` roads
|
|
||||||
- Guidance
|
|
||||||
- Notifications are now exposed more prominently, announcing turns onto a ferry/pushing your bike more prominently
|
|
||||||
- Improved turn angle calculation, detecting offsets due to lanes / minor variations due to inaccuracies
|
|
||||||
- Corrected the bearings returned for intermediate steps - requires reprocessing
|
|
||||||
- Improved turn locations for collapsed turns
|
|
||||||
- Sliproad classification refinements: the situations we detect as Sliproads now resemble more closely the reality
|
|
||||||
- Trip Plugin
|
|
||||||
- changed internal behaviour to prefer the smallest lexicographic result over the largest one
|
|
||||||
- Bugfixes
|
|
||||||
- fixed a bug where polyline decoding on a defective polyline could end up in out-of-bound access on a vector
|
|
||||||
- fixed compile errors in tile unit-test framework
|
|
||||||
- fixed a bug that could result in inconsistent behaviour when collapsing instructions
|
|
||||||
- fixed a bug that could result in crashes when leaving a ferry directly onto a motorway ramp
|
|
||||||
- fixed a bug in the tile plugin that resulted in discovering invalid edges for connections
|
|
||||||
- improved error messages when missing files during traffic updates (#3114)
|
|
||||||
- For single coordinate geometries the GeoJSON `Point` encoding was broken. We now always emit `LineString`s even in the one-coordinate-case (backwards compatible) (#3425)
|
|
||||||
- Debug Tiles
|
|
||||||
- Added support for turn penalties
|
|
||||||
- Internals
|
|
||||||
- Internal/Shared memory datafacades now share common memory layout and data loading code
|
|
||||||
- File reading now has much better error handling
|
|
||||||
- Misc
|
|
||||||
- Progress indicators now print newlines when stdout is not a TTY
|
|
||||||
- Prettier API documentation now generated via `npm run build-api-docs` output `build/docs`
|
|
||||||
|
|
||||||
# 5.4.3
|
|
||||||
- Changes from 5.4.2
|
|
||||||
- Bugfixes
|
|
||||||
- #3254 Fixed a bug that could end up hiding roundabout instructions
|
|
||||||
- #3260 fixed a bug that provided the wrong location in the arrival instruction
|
|
||||||
|
|
||||||
# 5.4.2
|
|
||||||
- Changes from 5.4.1
|
|
||||||
- Bugfixes
|
|
||||||
- #3032 Fixed a bug that could result in emitting `invalid` as an instruction type on sliproads with mode changes
|
|
||||||
- #3085 Fixed an outdated assertion that could throw without a cause for concern
|
|
||||||
- #3179 Fixed a bug that could trigger an assertion in TurnInstruciton generation
|
|
||||||
|
|
||||||
# 5.4.1
|
|
||||||
- Changes from 5.4.0
|
|
||||||
- Bugfixes
|
|
||||||
- #3016: Fixes shared memory updates while queries are running
|
|
||||||
|
|
||||||
# 5.4.0
|
|
||||||
- Changes from 5.3.0
|
|
||||||
- Profiles
|
|
||||||
- includes library guidance.lua that offers preliminary configuration on guidance.
|
|
||||||
- added left_hand_driving flag in global profile properties
|
|
||||||
- modified turn penalty function for car profile - better fit to real data
|
|
||||||
- return `ref` and `name` as separate fields. Do no use ref or destination as fallback for name value
|
|
||||||
- the default profile for car now ignores HOV only roads
|
|
||||||
- Guidance
|
|
||||||
- Handle Access tags for lanes, only considering valid lanes in lane-guidance (think car | car | bike | car)
|
|
||||||
- Improved the detection of non-noticeable name-changes
|
|
||||||
- Summaries have been improved to consider references as well
|
|
||||||
- API:
|
|
||||||
- `annotations=true` now returns the data source id for each segment as `datasources`
|
|
||||||
- Reduced semantic of merge to refer only to merges from a lane onto a motorway-like road
|
|
||||||
- new `ref` field in the `RouteStep` object. It contains the reference code or name of a way. Previously merged into the `name` property like `name (ref)` and are now separate fields.
|
|
||||||
- Bugfixes
|
|
||||||
- Fixed an issue that would result in segfaults for viaroutes with an invalid intermediate segment when u-turns were allowed at the via-location
|
|
||||||
- Invalid only_* restrictions could result in loss of connectivity. As a fallback, we assume all turns allowed when the restriction is not valid
|
|
||||||
- Fixed a bug that could result in an infinite loop when finding information about an upcoming intersection
|
|
||||||
- Fixed a bug that led to not discovering if a road simply looses a considered prefix
|
|
||||||
- BREAKING: Fixed a bug that could crash postprocessing of instructions on invalid roundabout taggings. This change requires reprocessing datasets with osrm-extract and osrm-contract
|
|
||||||
- Fixed an issue that could emit `invalid` as instruction when ending on a sliproad after a traffic-light
|
|
||||||
- Fixed an issue that would detect turning circles as sliproads
|
|
||||||
- Fixed a bug where post-processing instructions (e.g. left + left -> uturn) could result in false pronunciations
|
|
||||||
- Fixes a bug where a bearing range of zero would cause exhaustive graph traversals
|
|
||||||
- Fixes a bug where certain looped geometries could cause an infinite loop during extraction
|
|
||||||
- Fixed a bug where some roads could be falsly identified as sliproads
|
|
||||||
- Fixed a bug where roundabout intersections could result in breaking assertions when immediately exited
|
|
||||||
- Infrastructure:
|
|
||||||
- Adds a feature to limit results in nearest service with a default of 100 in `osrm-routed`
|
|
||||||
|
|
||||||
# 5.3.0
|
|
||||||
- Changes from 5.3.0-rc.3
|
|
||||||
- Guidance
|
|
||||||
- Only announce `use lane` on required turns (not using all lanes to go straight)
|
|
||||||
- Moved `lanes` to the intersection objects. This is BREAKING in relation to other Release Candidates but not with respect to other releases.
|
|
||||||
- Bugfixes
|
|
||||||
- Fix BREAKING: bug that could result in failure to load 'osrm.icd' files. This breaks the dataformat
|
|
||||||
- Fix: bug that results in segfaults when `use lane` instructions are suppressed
|
|
||||||
|
|
||||||
- Changes form 5.2.7
|
|
||||||
- API
|
|
||||||
- Introduces new `TurnType` in the form of `use lane`. The type indicates that you have to stick to a lane without turning
|
|
||||||
- Introduces `lanes` to the `Intersection` object. The lane data contains both the markings at the intersection and a flag indicating if they can be chosen for the next turn
|
|
||||||
- Removed unused `-s` from `osrm-datastore`
|
|
||||||
- Guidance
|
|
||||||
- Only announce `use lane` on required turns (not using all lanes to go straight)
|
|
||||||
- Improved detection of obvious turns
|
|
||||||
- Improved turn lane detection
|
|
||||||
- Reduce the number of end-of-road instructions in obvious cases
|
|
||||||
- Profile:
|
|
||||||
- bicycle.lua: Surface speeds never increase the actual speed
|
|
||||||
- Infrastructure
|
|
||||||
- Add 32bit support
|
|
||||||
- Add ARM NEON/VFP support
|
|
||||||
- Fix Windows builds
|
|
||||||
- Optimize speed file updates using mmap
|
|
||||||
- Add option to disable LTO for older compilers
|
|
||||||
- BREAKING: The new turn type changes the turn-type order. This breaks the **data format**.
|
|
||||||
- BREAKING: Turn lane data introduces two new files (osrm.tld,osrm.tls). This breaks the fileformat for older versions.
|
|
||||||
- Bugfixes:
|
|
||||||
- Fix devide by zero on updating speed data using osrm-contract
|
|
||||||
|
|
||||||
# 5.3.0 RC3
|
|
||||||
- Changes from 5.3.0-rc.2
|
|
||||||
- Guidance
|
|
||||||
- Improved detection of obvious turns
|
|
||||||
- Improved turn lane detection
|
|
||||||
- Bugfixes
|
|
||||||
- Fix bug that didn't chose minimal weights on overlapping edges
|
|
||||||
|
|
||||||
# 5.3.0 RC2
|
|
||||||
- Changes from 5.3.0-rc.1
|
|
||||||
- Bugfixes
|
|
||||||
- Fixes invalid checks in the lane-extraction part of the car profile
|
|
||||||
|
|
||||||
# 5.3.0 RC1
|
|
||||||
- API
|
|
||||||
- Introduces new `TurnType` in the form of `use lane`. The type indicates that you have to stick to a lane without turning
|
|
||||||
- Introduces lanes to the route response. The lane data contains both the markings at the intersection and a flag indicating their involvement in the turn
|
|
||||||
|
|
||||||
- Infrastructure
|
|
||||||
- BREAKING: The new turn type changes the turn-type order. This breaks the **data format**.
|
|
||||||
- BREAKING: Turn lane data introduces two new files (osrm.tld,osrm.tls). This breaks the fileformat for older versions.
|
|
||||||
|
|
||||||
# 5.2.5
|
|
||||||
- Bugfixes
|
|
||||||
- Fixes a segfault caused by incorrect trimming logic for very short steps.
|
|
||||||
|
|
||||||
# 5.2.4
|
|
||||||
- Bugfixes:
|
|
||||||
- Fixed in issue that arised on roundabouts in combination with intermediate intersections and sliproads
|
|
||||||
|
|
||||||
# 5.2.3
|
|
||||||
- Bugfixes:
|
|
||||||
- Fixed an issue with name changes in roundabouts that could result in crashes
|
|
||||||
|
|
||||||
# 5.2.2
|
|
||||||
Changes from 5.2.1
|
|
||||||
- Bugfixes:
|
|
||||||
- Buffer overrun in tile plugin response handling
|
|
||||||
|
|
||||||
# 5.2.1
|
|
||||||
Changes from 5.2.0
|
|
||||||
- Bugfixes:
|
|
||||||
- Removed debug statement that was spamming the console
|
|
||||||
|
|
||||||
# 5.2.0
|
|
||||||
Changes from 5.2.0 RC2
|
|
||||||
- Bugfixes:
|
|
||||||
- Fixed crash when loading shared memory caused by invalid OSM IDs segment size.
|
|
||||||
- Various small instructions handling fixes
|
|
||||||
|
|
||||||
Changes from 5.1.0
|
|
||||||
- API:
|
|
||||||
- new parameter `annotations` for `route`, `trip` and `match` requests. Returns additional data about each
|
|
||||||
coordinate along the selected/matched route line per `RouteLeg`:
|
|
||||||
- duration of each segment
|
|
||||||
- distance of each segment
|
|
||||||
- OSM node ids of all segment endpoints
|
|
||||||
- Introducing Intersections for Route Steps. This changes the API format in multiple ways.
|
|
||||||
- `bearing_before`/`bearing_after` of `StepManeuver` are now deprecated and will be removed in the next major release
|
|
||||||
- `location` of `StepManeuvers` is now deprecated and will be removed in the next major release
|
|
||||||
- every `RouteStep` now has property `intersections` containing a list of `Intersection` objects.
|
|
||||||
- Support for destination signs. New member `destinations` in `RouteStep`, based on `destination` and `destination:ref`
|
|
||||||
- Support for name pronunciations. New member `pronunciation` in `RouteStep`, based on `name:pronunciation`
|
|
||||||
|
|
||||||
- Profile changes:
|
|
||||||
- duration parser now accepts P[n]DT[n]H[n]M[n]S, P[n]W, PTHHMMSS and PTHH:MM:SS ISO8601 formats.
|
|
||||||
- `result.destinations` allows you to set a way's destinations
|
|
||||||
- `result.pronunciation` allows you to set way name pronunciations
|
|
||||||
- `highway=motorway_link` no longer implies `oneway` as per the OSM Wiki
|
|
||||||
|
|
||||||
- Infrastructure:
|
|
||||||
- BREAKING: Changed the on-disk encoding of the StaticRTree to reduce ramIndex file size. This breaks the **data format**
|
|
||||||
- BREAKING: Intersection Classification adds a new file to the mix (osrm.icd). This breaks the fileformat for older versions.
|
|
||||||
- Better support for osrm-routed binary upgrade on the fly [UNIX specific]:
|
|
||||||
- Open sockets with SO_REUSEPORT to allow multiple osrm-routed processes serving requests from the same port.
|
|
||||||
- Add SIGNAL_PARENT_WHEN_READY environment variable to enable osrm-routed signal its parent with USR1 when it's running and waiting for requests.
|
|
||||||
- Disable http access logging via DISABLE_ACCESS_LOGGING environment variable.
|
|
||||||
|
|
||||||
- Guidance:
|
|
||||||
- BREAKING: modifies the file format with new internal identifiers
|
|
||||||
- improved detection of turning streets, not reporting new-name in wrong situations
|
|
||||||
- improved handling of sliproads (emit turns instead of 'take the ramp')
|
|
||||||
- improved collapsing of instructions. Some 'new name' instructions will be suppressed if they are without alternative and the segment is short
|
|
||||||
|
|
||||||
- Bugfixes
|
|
||||||
- fixed broken summaries for very short routes
|
|
||||||
|
|
||||||
# 5.2.0 RC2
|
|
||||||
Changes from 5.2.0 RC1
|
|
||||||
|
|
||||||
- Guidance:
|
|
||||||
- improved handling of sliproads (emit turns instead of 'take the ramp')
|
|
||||||
- improved collapsing of instructions. Some 'new name' instructions will be suppressed if they are without alternative and the segment is short
|
|
||||||
- BREAKING: modifies the file format with new internal identifiers
|
|
||||||
|
|
||||||
- API:
|
|
||||||
- paramater `annotate` was renamed to `annotations`.
|
|
||||||
- `annotation` as accidentally placed in `Route` instead of `RouteLeg`
|
|
||||||
- Support for destination signs. New member `destinations` in `RouteStep`, based on `destination` and `destination:ref`
|
|
||||||
- Support for name pronunciations. New member `pronunciation` in `RouteStep`, based on `name:pronunciation`
|
|
||||||
- Add `nodes` property to `annotation` in `RouteLeg` containing the ids of nodes covered by the route
|
|
||||||
|
|
||||||
- Profile changes:
|
|
||||||
- `result.destinations` allows you to set a way's destinations
|
|
||||||
- `result.pronunciation` allows you to set way name pronunciations
|
|
||||||
- `highway=motorway_link` no longer implies `oneway` as per the OSM Wiki
|
|
||||||
|
|
||||||
- Infrastructure
|
|
||||||
- BREAKING: Changed the on-disk encoding of the StaticRTree to reduce ramIndex file size. This breaks the **data format**
|
|
||||||
|
|
||||||
- Bugfixes
|
|
||||||
- fixed broken summaries for very short routes
|
|
||||||
|
|
||||||
# 5.2.0 RC1
|
|
||||||
Changes from 5.1.0
|
|
||||||
|
|
||||||
- API:
|
|
||||||
- new parameter `annotate` for `route` and `match` requests. Returns additional data about each
|
|
||||||
coordinate along the selected/matched route line.
|
|
||||||
- Introducing Intersections for Route Steps. This changes the API format in multiple ways.
|
|
||||||
- `bearing_before`/`bearing_after` of `StepManeuver` are now deprecated and will be removed in the next major release
|
|
||||||
- `location` of `StepManeuvers` is now deprecated and will be removed in the next major release
|
|
||||||
- every `RouteStep` now has property `intersections` containing a list of `Intersection` objects.
|
|
||||||
|
|
||||||
- Profile changes:
|
|
||||||
- duration parser now accepts P[n]DT[n]H[n]M[n]S, P[n]W, PTHHMMSS and PTHH:MM:SS ISO8601 formats.
|
|
||||||
|
|
||||||
- Infrastructure:
|
|
||||||
- Better support for osrm-routed binary upgrade on the fly [UNIX specific]:
|
|
||||||
- Open sockets with SO_REUSEPORT to allow multiple osrm-routed processes serving requests from the same port.
|
|
||||||
- Add SIGNAL_PARENT_WHEN_READY environment variable to enable osrm-routed signal its parent with USR1 when it's running and waiting for requests.
|
|
||||||
- BREAKING: Intersection Classification adds a new file to the mix (osrm.icd). This breaks the fileformat for older versions.
|
|
||||||
- Disable http access logging via DISABLE_ACCESS_LOGGING environment
|
|
||||||
variable.
|
|
||||||
|
|
||||||
- Guidance:
|
|
||||||
- improved detection of turning streets, not reporting new-name in wrong situations
|
|
||||||
|
|
||||||
# 5.1.0
|
|
||||||
Changes with regard to 5.0.0
|
|
||||||
|
|
||||||
- API:
|
|
||||||
- added StepManeuver type `roundabout turn`. The type indicates a small roundabout that is treated as an intersection
|
|
||||||
(turn right at the roundabout for first exit, go straight at the roundabout...)
|
|
||||||
- added StepManeuver type `on ramp` and `off ramp` to distinguish between ramps that enter and exit a highway.
|
|
||||||
- reduced new name instructions for trivial changes
|
|
||||||
- combined multiple turns into a single instruction at segregated roads`
|
|
||||||
|
|
||||||
- Profile Changes:
|
|
||||||
- introduced a suffix_list / get_name_suffix_list to specify name suffices to be suppressed in name change announcements
|
|
||||||
- street names are now consistently assembled for the car, bike and walk profile as: "Name (Ref)" as in "Berlin (A5)"
|
|
||||||
- new `car.lua` dependency `lib/destination.lua`
|
|
||||||
- register a way's .nodes() function for use in the profile's way_function.
|
|
||||||
|
|
||||||
- Infrastructure
|
|
||||||
- BREAKING: reordered internal instruction types. This breaks the **data format**
|
|
||||||
- BREAKING: Changed the on-disk encoding of the StaticRTree for better performance. This breaks the **data format**
|
|
||||||
|
|
||||||
- Fixes:
|
|
||||||
- Issue #2310: post-processing for local paths, fixes #2310
|
|
||||||
- Issue #2309: local path looping, fixes #2309
|
|
||||||
- Issue #2356: Make hint values optional
|
|
||||||
- Issue #2349: Segmentation fault in some requests
|
|
||||||
- Issue #2335: map matching was using shortest path with uturns disabled
|
|
||||||
- Issue #2193: Fix syntax error position indicators in parameters queries
|
|
||||||
- Fix search with u-turn
|
|
||||||
- PhantomNode packing in MSVC now the same on other platforms
|
|
||||||
- Summary is now not malformed when including unnamed roads
|
|
||||||
- Emit new-name on when changing fron unanmed road to named road
|
|
||||||
|
|
||||||
# 5.0.0
|
|
||||||
Changes with regard 5.0.0 RC2:
|
|
||||||
- API:
|
|
||||||
- if `geometry=geojson` is passed the resulting geometry can be a LineString or Point
|
|
||||||
depending on how many coordinates are present.
|
|
||||||
- the removal of the summary field was revered. for `steps=flase` the field will always be an empty string.
|
|
||||||
|
|
||||||
Changes with regard to 4.9.1:
|
|
||||||
- API:
|
|
||||||
- BREAKING: Complete rewrite of the HTTP and library API. See detailed documentation in the wiki.
|
|
||||||
- BREAKING: The default coordinate order is now `longitude, latidue`. Exception: Polyline geometry
|
|
||||||
which follow the original Google specification of `latitdue, longitude`.
|
|
||||||
- BREAKING: Polyline geometries now use precision 5, instead of previously 6
|
|
||||||
- BREAKING: Removed GPX support
|
|
||||||
- New service `tile` which serves debug vector tiles of the road network
|
|
||||||
- Completely new engine for guidance generation:
|
|
||||||
- Support for highway ramps
|
|
||||||
- Support for different intersection types (end of street, forks, merges)
|
|
||||||
- Instruction post-processing to merge unimportant instructions
|
|
||||||
- Improved handling of roundabouts
|
|
||||||
|
|
||||||
- Tools:
|
|
||||||
- BREAKING: Renamed osrm-prepare to osrm-contract
|
|
||||||
- BREAKING: Removes profiles from osrm-contract, only needed in osrm-extract.
|
|
||||||
- Abort processing in osrm-extract if there are no snappable edges remaining.
|
|
||||||
- Added .properties file to osrm-extract ouput.
|
|
||||||
- Enables the use of multiple segment-speed-files on the osrm-contract command line
|
|
||||||
|
|
||||||
- Profile changes:
|
|
||||||
- Remove movable bridge mode
|
|
||||||
- Add `maxspeed=none` tag to car profile.
|
|
||||||
- A `side_road` tag support for the OSRM car profile.
|
|
||||||
|
|
||||||
- Fixes:
|
|
||||||
- Issue #2150: Prevents routing over delivery ways and nodes
|
|
||||||
- Issue #1972: Provide uninstall target
|
|
||||||
- Issue #2072: Disable alternatives by default and if core factor < 1.0
|
|
||||||
- Issue #1999: Fix unpacking for self-loop nodes not in core.
|
|
||||||
|
|
||||||
- Infrastructure:
|
|
||||||
- Cucumber test suit is now based on cucumber-js, removes Ruby as dependency
|
|
||||||
- Updated to mapbox/variant v1.1
|
|
||||||
- Updated to libosmium v2.6.1
|
|
||||||
- Remove GeoJSON based debugging output, replaced by debug tiles
|
|
||||||
|
|
||||||
|
|
||||||
# 5.0.0 RC2
|
|
||||||
- Profiles:
|
|
||||||
- `properties.allow_uturns_at_via` -> `properties.continue_straight_at_waypoint` (value is inverted!)
|
|
||||||
- API:
|
|
||||||
- Removed summary from legs property
|
|
||||||
- Disable steps and alternatives by default
|
|
||||||
- Fix `code` field: 'ok' -> 'Ok'
|
|
||||||
- Allow 4.json and 4.3.json format
|
|
||||||
- Conform to v5 spec and support "unlimited" as radiuses value.
|
|
||||||
- `uturns` parameter was replaced by `continue_straight` (value is inverted!)
|
|
||||||
- Features:
|
|
||||||
- Report progress for gennerating edge expanded edges in the edge based graph factory
|
|
||||||
- Add maxspeed=none tag to car profile.
|
|
||||||
- Optimize StaticRTree code: speedup 2x (to RC1)
|
|
||||||
- Optimize DouglasPeucker code: speedup 10x (to RC1)
|
|
||||||
- Optimize WebMercator projection: speedup 2x (to RC1)
|
|
||||||
- Bugs:
|
|
||||||
- #2195: Resolves issues with multiple includedirs in pkg-config file
|
|
||||||
- #2219: Internal server error when using the match plugin
|
|
||||||
- #2027: basename -> filename
|
|
||||||
- #2168: Report correct position where parsing failed
|
|
||||||
- #2036: Add license to storage and storage config exposed in public API
|
|
||||||
- Fix uturn detection in match plugin
|
|
||||||
- Add missing -lz to fix linking of server-tests
|
|
||||||
|
|
||||||
# 5.0.0 RC1
|
|
||||||
- Renamed osrm-prepare into osrm-contract
|
|
||||||
- osrm-contract does not need a profile parameter anymore
|
|
||||||
- New public HTTP API, find documentation [here](https://github.com/Project-OSRM/osrm-backend/wiki/New-Server-api)
|
|
||||||
- POST support is discontinued, please use library bindings for more complex requests
|
|
||||||
- Removed timestamp plugin
|
|
||||||
- Coordinate order is now Longitude,Latitude
|
|
||||||
- Cucumber tests now based on Javascript (run with `npm test`)
|
|
||||||
- Profile API changed:
|
|
||||||
- `forward_mode` and `backward_mode` now need to be selected from a pre-defined list
|
|
||||||
- Global profile properties are now stored in a global `properties` element. This includes:
|
|
||||||
- `properties.traffic_signal_penalty`
|
|
||||||
- `properties.use_turn_restrictions`
|
|
||||||
- `properties.u_turn_penalty`
|
|
||||||
- `properties.allow_u_turn_at_via`
|
|
||||||
@@ -1,856 +0,0 @@
|
|||||||
cmake_minimum_required(VERSION 2.8.11)
|
|
||||||
# we depend on 2.8.11 introducing target_include_directories
|
|
||||||
|
|
||||||
if(CMAKE_CURRENT_SOURCE_DIR STREQUAL CMAKE_CURRENT_BINARY_DIR AND NOT MSVC_IDE)
|
|
||||||
message(FATAL_ERROR "In-source builds are not allowed.
|
|
||||||
Please create a directory and run cmake from there, passing the path to this source directory as the last argument.
|
|
||||||
This process created the file `CMakeCache.txt' and the directory `CMakeFiles'. Please delete them.")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# detect if this is included as subproject and if so expose
|
|
||||||
# some variables to its parent scope
|
|
||||||
get_directory_property(BUILD_AS_SUBPROJECT PARENT_DIRECTORY)
|
|
||||||
if(BUILD_AS_SUBPROJECT)
|
|
||||||
message(STATUS "Building libosrm as subproject.")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# set OSRM_BUILD_DIR location (might be used in various scripts)
|
|
||||||
if (NOT WIN32 AND NOT DEFINED ENV{OSRM_BUILD_DIR})
|
|
||||||
set(ENV{OSRM_BUILD_DIR} ${CMAKE_CURRENT_BINARY_DIR})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
option(ENABLE_MASON "Use mason for dependencies" OFF)
|
|
||||||
option(ENABLE_CCACHE "Speed up incremental rebuilds via ccache" ON)
|
|
||||||
option(BUILD_TOOLS "Build OSRM tools" OFF)
|
|
||||||
option(BUILD_PACKAGE "Build OSRM package" OFF)
|
|
||||||
option(ENABLE_ASSERTIONS "Use assertions in release mode" OFF)
|
|
||||||
option(ENABLE_COVERAGE "Build with coverage instrumentalisation" OFF)
|
|
||||||
option(ENABLE_SANITIZER "Use memory sanitizer for Debug build" OFF)
|
|
||||||
option(ENABLE_STXXL "Use STXXL library" OFF)
|
|
||||||
option(ENABLE_LTO "Use LTO if available" OFF)
|
|
||||||
option(ENABLE_FUZZING "Fuzz testing using LLVM's libFuzzer" OFF)
|
|
||||||
option(ENABLE_GOLD_LINKER "Use GNU gold linker if available" ON)
|
|
||||||
option(ENABLE_NODE_BINDINGS "Build NodeJs bindings" OFF)
|
|
||||||
option(ENABLE_GLIBC_WORKAROUND "Workaround GLIBC symbol exports" OFF)
|
|
||||||
|
|
||||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/cmake")
|
|
||||||
|
|
||||||
if(ENABLE_MASON)
|
|
||||||
# versions in use
|
|
||||||
set(MASON_BOOST_VERSION "1.65.1")
|
|
||||||
set(MASON_STXXL_VERSION "1.4.1-1")
|
|
||||||
set(MASON_EXPAT_VERSION "2.2.0")
|
|
||||||
set(MASON_LUA_VERSION "5.2.4")
|
|
||||||
set(MASON_BZIP2_VERSION "1.0.6")
|
|
||||||
set(MASON_TBB_VERSION "2017_U7")
|
|
||||||
set(MASON_LIBSHP_VERSION "1.3.0")
|
|
||||||
|
|
||||||
message(STATUS "Enabling mason")
|
|
||||||
|
|
||||||
find_program(CURL_FOUND curl)
|
|
||||||
if(NOT CURL_FOUND)
|
|
||||||
message(FATAL_ERROR "curl command required with -DENABLE_MASON")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
include(mason)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# be compatible with version handling before cmake 3.x
|
|
||||||
if (POLICY CMP0048)
|
|
||||||
cmake_policy(SET CMP0048 OLD)
|
|
||||||
endif()
|
|
||||||
project(OSRM C CXX)
|
|
||||||
set(OSRM_VERSION_MAJOR 5)
|
|
||||||
set(OSRM_VERSION_MINOR 15)
|
|
||||||
set(OSRM_VERSION_PATCH 0)
|
|
||||||
set(OSRM_VERSION "${OSRM_VERSION_MAJOR}.${OSRM_VERSION_MINOR}.${OSRM_VERSION_PATCH}")
|
|
||||||
|
|
||||||
add_definitions(-DOSRM_PROJECT_DIR="${CMAKE_CURRENT_SOURCE_DIR}")
|
|
||||||
|
|
||||||
# these two functions build up custom variables:
|
|
||||||
# DEPENDENCIES_INCLUDE_DIRS and OSRM_DEFINES
|
|
||||||
# These variables we want to pass to
|
|
||||||
# include_directories and add_definitions for both
|
|
||||||
# this build and for sharing externally via pkg-config
|
|
||||||
|
|
||||||
function(add_dependency_includes)
|
|
||||||
if(${ARGC} GREATER 0)
|
|
||||||
list(APPEND DEPENDENCIES_INCLUDE_DIRS "${ARGV}")
|
|
||||||
set(DEPENDENCIES_INCLUDE_DIRS "${DEPENDENCIES_INCLUDE_DIRS}" PARENT_SCOPE)
|
|
||||||
endif()
|
|
||||||
endfunction(add_dependency_includes)
|
|
||||||
|
|
||||||
function(add_dependency_defines defines)
|
|
||||||
list(APPEND OSRM_DEFINES "${defines}")
|
|
||||||
set(OSRM_DEFINES "${OSRM_DEFINES}" PARENT_SCOPE)
|
|
||||||
endfunction(add_dependency_defines)
|
|
||||||
|
|
||||||
set(CMAKE_EXPORT_COMPILE_COMMANDS ON)
|
|
||||||
include(CheckCXXCompilerFlag)
|
|
||||||
include(FindPackageHandleStandardArgs)
|
|
||||||
include(GNUInstallDirs)
|
|
||||||
|
|
||||||
set(bitness 32)
|
|
||||||
if(CMAKE_SIZEOF_VOID_P EQUAL 8)
|
|
||||||
set(bitness 64)
|
|
||||||
message(STATUS "Building on a 64 bit system")
|
|
||||||
else()
|
|
||||||
message(STATUS "Building on a 32 bit system")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(WIN32 AND MSVC_VERSION LESS 1900)
|
|
||||||
message(FATAL_ERROR "Building with Microsoft compiler needs Latest Visual Studio 2015 (Community or better)")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Strictly require GCC>=4.9 and Clang>=3.4 - GCC 4.8 is already too old for C++14.
|
|
||||||
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
|
|
||||||
if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 4.9)
|
|
||||||
message(FATAL_ERROR "GCC>=4.9 required. In case you are on Ubuntu upgrade via ppa:ubuntu-toolchain-r/test")
|
|
||||||
endif()
|
|
||||||
elseif(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
|
||||||
if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 3.4)
|
|
||||||
message(FATAL_ERROR "Clang>=3.4 required. In case you are on Ubuntu upgrade via http://apt.llvm.org")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
include_directories(BEFORE ${CMAKE_CURRENT_BINARY_DIR}/include/)
|
|
||||||
include_directories(BEFORE ${CMAKE_CURRENT_SOURCE_DIR}/include/)
|
|
||||||
include_directories(SYSTEM ${CMAKE_CURRENT_SOURCE_DIR}/third_party/sol2/)
|
|
||||||
include_directories(SYSTEM ${CMAKE_CURRENT_SOURCE_DIR}/third_party/variant/include)
|
|
||||||
|
|
||||||
set(BOOST_COMPONENTS date_time chrono filesystem iostreams program_options regex system thread unit_test_framework)
|
|
||||||
|
|
||||||
configure_file(
|
|
||||||
${CMAKE_CURRENT_SOURCE_DIR}/include/util/version.hpp.in
|
|
||||||
${CMAKE_CURRENT_BINARY_DIR}/include/util/version.hpp
|
|
||||||
)
|
|
||||||
file(GLOB UtilGlob src/util/*.cpp src/util/*/*.cpp)
|
|
||||||
file(GLOB ExtractorGlob src/extractor/*.cpp src/extractor/*/*.cpp)
|
|
||||||
file(GLOB PartitionerGlob src/partition/*.cpp)
|
|
||||||
file(GLOB CustomizerGlob src/customize/*.cpp)
|
|
||||||
file(GLOB ContractorGlob src/contractor/*.cpp)
|
|
||||||
file(GLOB UpdaterGlob src/updater/*.cpp)
|
|
||||||
file(GLOB StorageGlob src/storage/*.cpp)
|
|
||||||
file(GLOB ServerGlob src/server/*.cpp src/server/**/*.cpp)
|
|
||||||
file(GLOB EngineGlob src/engine/*.cpp src/engine/**/*.cpp)
|
|
||||||
file(GLOB ErrorcodesGlob src/osrm/errorcodes.cpp)
|
|
||||||
|
|
||||||
add_library(UTIL OBJECT ${UtilGlob})
|
|
||||||
add_library(EXTRACTOR OBJECT ${ExtractorGlob})
|
|
||||||
add_library(PARTITIONER OBJECT ${PartitionerGlob})
|
|
||||||
add_library(CUSTOMIZER OBJECT ${CustomizerGlob})
|
|
||||||
add_library(CONTRACTOR OBJECT ${ContractorGlob})
|
|
||||||
add_library(UPDATER OBJECT ${UpdaterGlob})
|
|
||||||
add_library(STORAGE OBJECT ${StorageGlob})
|
|
||||||
add_library(ENGINE OBJECT ${EngineGlob})
|
|
||||||
add_library(SERVER OBJECT ${ServerGlob})
|
|
||||||
|
|
||||||
set_target_properties(UTIL PROPERTIES LINKER_LANGUAGE CXX)
|
|
||||||
|
|
||||||
add_executable(osrm-extract src/tools/extract.cpp)
|
|
||||||
add_executable(osrm-partition src/tools/partition.cpp)
|
|
||||||
add_executable(osrm-customize src/tools/customize.cpp)
|
|
||||||
add_executable(osrm-contract src/tools/contract.cpp)
|
|
||||||
add_executable(osrm-routed src/tools/routed.cpp $<TARGET_OBJECTS:SERVER> $<TARGET_OBJECTS:UTIL>)
|
|
||||||
add_executable(osrm-datastore src/tools/store.cpp $<TARGET_OBJECTS:UTIL>)
|
|
||||||
add_library(osrm src/osrm/osrm.cpp $<TARGET_OBJECTS:ENGINE> $<TARGET_OBJECTS:UTIL> $<TARGET_OBJECTS:STORAGE>)
|
|
||||||
add_library(osrm_contract src/osrm/contractor.cpp $<TARGET_OBJECTS:CONTRACTOR> $<TARGET_OBJECTS:UTIL>)
|
|
||||||
add_library(osrm_extract src/osrm/extractor.cpp $<TARGET_OBJECTS:EXTRACTOR> $<TARGET_OBJECTS:UTIL>)
|
|
||||||
add_library(osrm_partition $<TARGET_OBJECTS:PARTITIONER> $<TARGET_OBJECTS:UTIL>)
|
|
||||||
add_library(osrm_customize $<TARGET_OBJECTS:CUSTOMIZER> $<TARGET_OBJECTS:UTIL>)
|
|
||||||
add_library(osrm_update $<TARGET_OBJECTS:UPDATER> $<TARGET_OBJECTS:UTIL>)
|
|
||||||
add_library(osrm_store $<TARGET_OBJECTS:STORAGE> $<TARGET_OBJECTS:UTIL>)
|
|
||||||
|
|
||||||
if(ENABLE_GOLD_LINKER)
|
|
||||||
execute_process(COMMAND ${CMAKE_C_COMPILER} -fuse-ld=gold -Wl,--version ERROR_QUIET OUTPUT_VARIABLE LD_VERSION)
|
|
||||||
if("${LD_VERSION}" MATCHES "GNU gold")
|
|
||||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=gold -Wl,--disable-new-dtags")
|
|
||||||
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fuse-ld=gold -Wl,--disable-new-dtags")
|
|
||||||
set(OSRM_LDFLAGS "${OSRM_LDFLAGS} -fuse-ld=gold -Wl,--disable-new-dtags")
|
|
||||||
message(STATUS "Using GNU gold as linker.")
|
|
||||||
|
|
||||||
# Issue 2785: check gold binutils version and don't use gc-sections for versions prior 2.25
|
|
||||||
string(REGEX REPLACE ".*\\(GNU Binutils[^\\)0-9]+([0-9]+\\.[0-9]+)[^\\)]*\\).*" "\\1" GOLD_BINUTILS_VERSION "${LD_VERSION}")
|
|
||||||
if ("${GOLD_BINUTILS_VERSION}" VERSION_LESS "2.26")
|
|
||||||
message(STATUS "Disabling gc-sections on gold binutils < 2.26, see: https://sourceware.org/bugzilla/show_bug.cgi?id=17639")
|
|
||||||
set(LD_AVOID_GC_SECTIONS TRUE)
|
|
||||||
endif()
|
|
||||||
else()
|
|
||||||
message(WARNING "GNU gold linker isn't available.")
|
|
||||||
set(ENABLE_GOLD_LINKER OFF)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Disable LTO when mason+gcc is detected before testing for / setting any flags.
|
|
||||||
# Mason builds libraries with Clang, mixing does not work in the context of lto.
|
|
||||||
if(ENABLE_MASON AND CMAKE_CXX_COMPILER_ID MATCHES "GNU" AND ENABLE_LTO)
|
|
||||||
set(ENABLE_LTO OFF)
|
|
||||||
message(WARNING "Mason and GCC's LTO not work together. Disabling LTO.")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Explicitly set the build type to Release if no other type is specified
|
|
||||||
# on the command line. Without this, cmake defaults to an unoptimized,
|
|
||||||
# non-debug build, which almost nobody wants.
|
|
||||||
if(NOT CMAKE_BUILD_TYPE)
|
|
||||||
message(STATUS "No build type specified, defaulting to Release")
|
|
||||||
set(CMAKE_BUILD_TYPE Release)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(CMAKE_BUILD_TYPE MATCHES Debug)
|
|
||||||
message(STATUS "Configuring OSRM in debug mode")
|
|
||||||
elseif(CMAKE_BUILD_TYPE MATCHES Release)
|
|
||||||
message(STATUS "Configuring OSRM in release mode")
|
|
||||||
elseif(CMAKE_BUILD_TYPE MATCHES RelWithDebInfo)
|
|
||||||
message(STATUS "Configuring OSRM in release mode with debug flags")
|
|
||||||
elseif(CMAKE_BUILD_TYPE MATCHES MinRelSize)
|
|
||||||
message(STATUS "Configuring OSRM in release mode with minimized size")
|
|
||||||
else()
|
|
||||||
message(STATUS "Unrecognized build type - will use cmake defaults")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Additional logic for the different build types
|
|
||||||
if(CMAKE_BUILD_TYPE MATCHES Debug OR CMAKE_BUILD_TYPE MATCHES RelWithDebInfo)
|
|
||||||
message(STATUS "Configuring debug mode flags")
|
|
||||||
set(ENABLE_ASSERTIONS ON)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
|
|
||||||
set(CMAKE_CXX_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -fno-inline -fno-omit-frame-pointer")
|
|
||||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -fno-inline -fno-omit-frame-pointer")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
|
|
||||||
set(CMAKE_C_FLAGS_RELWITHDEBINFO "${CMAKE_C_FLAGS_RELWITHDEBINFO} -ggdb")
|
|
||||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -Og -ggdb")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
|
|
||||||
if(CMAKE_BUILD_TYPE MATCHES Release OR CMAKE_BUILD_TYPE MATCHES MinRelSize OR CMAKE_BUILD_TYPE MATCHES RelWithDebInfo)
|
|
||||||
message(STATUS "Configuring release mode optimizations")
|
|
||||||
# Check if LTO is available
|
|
||||||
check_cxx_compiler_flag("-Wl,-flto" LTO_AVAILABLE)
|
|
||||||
|
|
||||||
if(ENABLE_LTO AND LTO_AVAILABLE)
|
|
||||||
set(OLD_CXX_FLAGS ${CMAKE_CXX_FLAGS})
|
|
||||||
# GCC in addition allows parallelizing LTO
|
|
||||||
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
|
|
||||||
include(ProcessorCount)
|
|
||||||
ProcessorCount(NPROC)
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -flto=${NPROC}")
|
|
||||||
else()
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -flto")
|
|
||||||
endif()
|
|
||||||
set(CHECK_LTO_SRC "int main(){return 0;}")
|
|
||||||
check_cxx_source_compiles("${CHECK_LTO_SRC}" LTO_WORKS)
|
|
||||||
if(LTO_WORKS)
|
|
||||||
message(STATUS "LTO working")
|
|
||||||
set(OSRM_CXXFLAGS "${OSRM_CXXFLAGS} -flto")
|
|
||||||
set(OSRM_LDFLAGS "${OSRM_LDFLAGS} -flto")
|
|
||||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -flto")
|
|
||||||
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -flto")
|
|
||||||
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} -flto")
|
|
||||||
else()
|
|
||||||
message(STATUS "LTO broken")
|
|
||||||
set(CMAKE_CXX_FLAGS "${OLD_CXX_FLAGS}")
|
|
||||||
set(ENABLE_LTO Off)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Since gcc 4.9 the LTO format is non-standart ('slim'), so we need to use the build-in tools
|
|
||||||
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU" AND
|
|
||||||
NOT "${CMAKE_CXX_COMPILER_VERSION}" VERSION_LESS "4.9.0" AND NOT MINGW)
|
|
||||||
find_program(GCC_AR gcc-ar)
|
|
||||||
find_program(GCC_RANLIB gcc-ranlib)
|
|
||||||
if ("${GCC_AR}" STREQUAL "GCC_AR-NOTFOUND" OR "${GCC_RANLIB}" STREQUAL "GCC_RANLIB-NOTFOUND")
|
|
||||||
message(WARNING "GCC specific binutils not found. In case of linker issues export env vars: AR=gcc-ar, NM=gcc-nm, RANLIB=gcc-ranlib")
|
|
||||||
else()
|
|
||||||
message(STATUS "Using GCC specific binutils for LTO:")
|
|
||||||
message(STATUS " ${GCC_AR}")
|
|
||||||
message(STATUS " ${GCC_RANLIB}")
|
|
||||||
set(CMAKE_AR ${GCC_AR})
|
|
||||||
set(CMAKE_RANLIB ${GCC_RANLIB})
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Same for clang LTO requires their own toolchain
|
|
||||||
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
|
||||||
find_program(LLVM_AR llvm-ar)
|
|
||||||
find_program(LLVM_RANLIB llvm-ranlib)
|
|
||||||
if ("${LLVM_AR}" STREQUAL "LLVM_AR-NOTFOUND" OR "${LLVM_RANLIB}" STREQUAL "LLVM_RANLIB-NOTFOUND")
|
|
||||||
message(WARNING "LLVM specific binutils not found.")
|
|
||||||
else()
|
|
||||||
message(STATUS "Using LLVM specific binutils for LTO:")
|
|
||||||
message(STATUS " ${LLVM_AR}")
|
|
||||||
message(STATUS " ${LLVM_RANLIB}")
|
|
||||||
set(CMAKE_AR ${LLVM_AR})
|
|
||||||
set(CMAKE_RANLIB ${LLVM_RANLIB})
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(CMAKE_CXX_COMPILER_ID MATCHES "GNU" AND "${CMAKE_CXX_COMPILER_VERSION}" VERSION_LESS "4.9.0")
|
|
||||||
message(STATUS "Disabling LTO on GCC < 4.9.0 since it is broken, see: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=57038")
|
|
||||||
set(CMAKE_CXX_FLAGS "${OLD_CXX_FLAGS}")
|
|
||||||
set(ENABLE_LTO Off)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(UNIX AND NOT APPLE AND ENABLE_MASON AND (LTO_WORKS OR ENABLE_GOLD_LINKER))
|
|
||||||
message(WARNING "ENABLE_MASON and ENABLE_LTO/ENABLE_GOLD_LINKER may not work on all linux systems currently")
|
|
||||||
message(WARNING "For more details see: https://github.com/Project-OSRM/osrm-backend/issues/3202")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(MAYBE_COVERAGE_LIBRARIES "")
|
|
||||||
if (ENABLE_COVERAGE)
|
|
||||||
if (NOT CMAKE_BUILD_TYPE MATCHES "Debug")
|
|
||||||
message(ERROR "ENABLE_COVERAGE=ON only make sense with a Debug build")
|
|
||||||
endif()
|
|
||||||
message(STATUS "Enabling coverage")
|
|
||||||
set(MAYBE_COVERAGE_LIBRARIES "-lgcov")
|
|
||||||
set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} -O0 -ftest-coverage -fprofile-arcs")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (ENABLE_SANITIZER)
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address")
|
|
||||||
set(OSRM_CXXFLAGS "${OSRM_CXXFLAGS} -fsanitize=address")
|
|
||||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address")
|
|
||||||
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -fsanitize=address")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Configuring compilers
|
|
||||||
if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pedantic -Wuninitialized -Wunreachable-code -Wstrict-overflow=2 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 -fPIC -fcolor-diagnostics -ftemplate-depth=1024 -Wno-unused-command-line-argument")
|
|
||||||
elseif(CMAKE_CXX_COMPILER_ID MATCHES "GNU")
|
|
||||||
set(COLOR_FLAG "-fdiagnostics-color=auto")
|
|
||||||
check_cxx_compiler_flag("-fdiagnostics-color=auto" HAS_COLOR_FLAG)
|
|
||||||
if(NOT HAS_COLOR_FLAG)
|
|
||||||
set(COLOR_FLAG "")
|
|
||||||
endif()
|
|
||||||
# using GCC
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wall -Wextra -pedantic -Wuninitialized -Wunreachable-code -Wstrict-overflow=1 -U_FORTIFY_SOURCE -D_FORTIFY_SOURCE=2 ${COLOR_FLAG} -fPIC -ftemplate-depth=1024")
|
|
||||||
if(WIN32) # using mingw
|
|
||||||
add_dependency_defines(-DWIN32)
|
|
||||||
set(OPTIONAL_SOCKET_LIBS ws2_32 wsock32)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# -fpermissive is required for parallel_do Intel TBB internal issue with GCC < 5
|
|
||||||
# https://github.com/Project-OSRM/osrm-backend/pull/3603#issuecomment-277688589
|
|
||||||
if(CMAKE_CXX_COMPILER_VERSION VERSION_LESS 5.0)
|
|
||||||
message(STATUS "Adding -fpermissive for GCC version < 5 bug (https://gcc.gnu.org/bugzilla/show_bug.cgi?id=51048). See #3603.")
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpermissive")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
elseif(CMAKE_CXX_COMPILER_ID MATCHES "Intel")
|
|
||||||
# using Intel C++
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -static-intel -wd10237 -Wall -ipo -fPIC")
|
|
||||||
elseif(CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
|
|
||||||
# using Visual Studio C++
|
|
||||||
set(BOOST_COMPONENTS ${BOOST_COMPONENTS} zlib)
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /bigobj") # avoid compiler error C1128 from scripting_environment_lua.cpp
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /DWIN32_LEAN_AND_MEAN") # avoid compiler error C2011 from dual #include of winsock.h and winsock2.h
|
|
||||||
add_dependency_defines(-DBOOST_LIB_DIAGNOSTIC)
|
|
||||||
add_dependency_defines(-D_CRT_SECURE_NO_WARNINGS)
|
|
||||||
add_dependency_defines(-DNOMINMAX) # avoid min and max macros that can break compilation
|
|
||||||
add_dependency_defines(-D_USE_MATH_DEFINES) #needed for M_PI with cmath.h
|
|
||||||
add_dependency_defines(-D_WIN32_WINNT=0x0501)
|
|
||||||
add_dependency_defines(-DXML_STATIC)
|
|
||||||
find_library(ws2_32_LIBRARY_PATH ws2_32)
|
|
||||||
target_link_libraries(osrm-extract wsock32 ws2_32)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Configuring linker
|
|
||||||
execute_process(COMMAND ${CMAKE_CXX_COMPILER} "-Wl,--version" ERROR_QUIET OUTPUT_VARIABLE LINKER_VERSION)
|
|
||||||
# For ld.gold and ld.bfs (the GNU linkers) we optimize hard
|
|
||||||
if("${LINKER_VERSION}" MATCHES "GNU gold" OR "${LINKER_VERSION}" MATCHES "GNU ld")
|
|
||||||
message(STATUS "Setting linker optimizations")
|
|
||||||
if(NOT (CMAKE_CXX_COMPILER_ID MATCHES "MSVC" OR "${LD_AVOID_GC_SECTIONS}"))
|
|
||||||
# Tell compiler to put every function in separate section, linker can then match sections and functions
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -ffunction-sections -fdata-sections")
|
|
||||||
# Tell linker to do dead code and data eminination during link time discarding sections
|
|
||||||
set(LINKER_FLAGS "${LINKER_FLAGS} -Wl,--gc-sections")
|
|
||||||
endif()
|
|
||||||
# Default linker optimization flags
|
|
||||||
set(LINKER_FLAGS "${LINKER_FLAGS} -Wl,-O1 -Wl,--hash-style=gnu -Wl,--sort-common")
|
|
||||||
|
|
||||||
else()
|
|
||||||
message(STATUS "Using unknown linker, not setting linker optimizations")
|
|
||||||
endif ()
|
|
||||||
set(OSRM_LDFLAGS "${OSRM_LDFLAGS} ${LINKER_FLAGS}")
|
|
||||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${LINKER_FLAGS}")
|
|
||||||
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${LINKER_FLAGS}")
|
|
||||||
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${LINKER_FLAGS}")
|
|
||||||
|
|
||||||
# Activate C++1y
|
|
||||||
if(NOT CMAKE_CXX_COMPILER_ID MATCHES "MSVC")
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++14")
|
|
||||||
set(OSRM_CXXFLAGS "${OSRM_CXXFLAGS} -std=c++14")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Configuring other platform dependencies
|
|
||||||
if(APPLE)
|
|
||||||
set(CMAKE_OSX_DEPLOYMENT_TARGET "10.10")
|
|
||||||
execute_process(COMMAND xcrun --sdk macosx --show-sdk-path OUTPUT_VARIABLE CMAKE_OSX_SYSROOT OUTPUT_STRIP_TRAILING_WHITESPACE)
|
|
||||||
set(CMAKE_OSX_ARCHITECTURES "x86_64")
|
|
||||||
message(STATUS "Set Architecture to x64 on OS X")
|
|
||||||
exec_program(uname ARGS -v OUTPUT_VARIABLE DARWIN_VERSION)
|
|
||||||
string(REGEX MATCH "[0-9]+" DARWIN_VERSION ${DARWIN_VERSION})
|
|
||||||
if(OSXLIBSTD)
|
|
||||||
message(STATUS "linking against ${OSXLIBSTD}")
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=${OSXLIBSTD}")
|
|
||||||
elseif(DARWIN_VERSION GREATER 12)
|
|
||||||
message(STATUS "linking against libc++")
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -stdlib=libc++")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(UNIX AND NOT APPLE)
|
|
||||||
set(MAYBE_RT_LIBRARY -lrt)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Disallow deprecated protozero APIs
|
|
||||||
add_definitions(-DPROTOZERO_STRICT_API)
|
|
||||||
|
|
||||||
find_package(Threads REQUIRED)
|
|
||||||
|
|
||||||
# if mason is enabled no find_package calls are made
|
|
||||||
# to ensure that we are only compiling and linking against
|
|
||||||
# fully portable mason packages
|
|
||||||
if(ENABLE_MASON)
|
|
||||||
message(STATUS "Installing dependencies via mason")
|
|
||||||
|
|
||||||
set(Boost_USE_STATIC_LIBS ON)
|
|
||||||
mason_use(boost VERSION ${MASON_BOOST_VERSION} HEADER_ONLY)
|
|
||||||
add_dependency_includes(${MASON_PACKAGE_boost_INCLUDE_DIRS})
|
|
||||||
mason_use(boost_libfilesystem VERSION ${MASON_BOOST_VERSION})
|
|
||||||
set(Boost_FILESYSTEM_LIBRARY ${MASON_PACKAGE_boost_libfilesystem_STATIC_LIBS})
|
|
||||||
mason_use(boost_libiostreams VERSION ${MASON_BOOST_VERSION})
|
|
||||||
set(Boost_IOSTREAMS_LIBRARY ${MASON_PACKAGE_boost_libiostreams_STATIC_LIBS})
|
|
||||||
mason_use(boost_libprogram_options VERSION ${MASON_BOOST_VERSION})
|
|
||||||
set(Boost_PROGRAM_OPTIONS_LIBRARY ${MASON_PACKAGE_boost_libprogram_options_STATIC_LIBS})
|
|
||||||
mason_use(boost_libregex VERSION ${MASON_BOOST_VERSION})
|
|
||||||
set(Boost_REGEX_LIBRARY ${MASON_PACKAGE_boost_libregex_STATIC_LIBS})
|
|
||||||
mason_use(boost_libtest VERSION ${MASON_BOOST_VERSION})
|
|
||||||
set(Boost_UNIT_TEST_FRAMEWORK_LIBRARY ${MASON_PACKAGE_boost_libtest_STATIC_LIBS})
|
|
||||||
mason_use(boost_libdate_time VERSION ${MASON_BOOST_VERSION})
|
|
||||||
set(Boost_DATE_TIME_LIBRARY ${MASON_PACKAGE_boost_libdate_time_STATIC_LIBS})
|
|
||||||
mason_use(boost_libthread VERSION ${MASON_BOOST_VERSION})
|
|
||||||
set(Boost_THREAD_LIBRARY ${MASON_PACKAGE_boost_libthread_STATIC_LIBS})
|
|
||||||
mason_use(boost_libsystem VERSION ${MASON_BOOST_VERSION})
|
|
||||||
set(Boost_SYSTEM_LIBRARY ${MASON_PACKAGE_boost_libsystem_STATIC_LIBS})
|
|
||||||
|
|
||||||
if (ENABLE_STXXL)
|
|
||||||
mason_use(stxxl VERSION ${MASON_STXXL_VERSION})
|
|
||||||
add_dependency_includes(${MASON_PACKAGE_stxxl_INCLUDE_DIRS})
|
|
||||||
set(MAYBE_STXXL_LIBRARY ${MASON_PACKAGE_stxxl_STATIC_LIBS})
|
|
||||||
add_definitions(-DUSE_STXXL_LIBRARY)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
mason_use(expat VERSION ${MASON_EXPAT_VERSION})
|
|
||||||
add_dependency_includes(${MASON_PACKAGE_expat_INCLUDE_DIRS})
|
|
||||||
set(EXPAT_LIBRARIES ${MASON_PACKAGE_expat_STATIC_LIBS})
|
|
||||||
|
|
||||||
mason_use(lua VERSION ${MASON_LUA_VERSION})
|
|
||||||
add_dependency_includes(${MASON_PACKAGE_lua_INCLUDE_DIRS})
|
|
||||||
set(USED_LUA_LIBRARIES ${MASON_PACKAGE_lua_STATIC_LIBS})
|
|
||||||
|
|
||||||
mason_use(bzip2 VERSION ${MASON_BZIP2_VERSION})
|
|
||||||
add_dependency_includes(${MASON_PACKAGE_bzip2_INCLUDE_DIRS})
|
|
||||||
set(BZIP2_LIBRARIES ${MASON_PACKAGE_bzip2_STATIC_LIBS})
|
|
||||||
|
|
||||||
mason_use(tbb VERSION ${MASON_TBB_VERSION})
|
|
||||||
add_dependency_includes(${MASON_PACKAGE_tbb_INCLUDE_DIRS})
|
|
||||||
set(TBB_LIBRARIES ${MASON_PACKAGE_tbb_LDFLAGS})
|
|
||||||
|
|
||||||
if(NOT MASON_PACKAGE_tbb_LIBRARY_DIRS)
|
|
||||||
message(FATAL_ERROR "MASON_PACKAGE_tbb_LIBRARY_DIRS is empty, rpath will not work")
|
|
||||||
endif()
|
|
||||||
set(TBB_LINKER_RPATHS "")
|
|
||||||
foreach(libpath ${MASON_PACKAGE_tbb_LIBRARY_DIRS})
|
|
||||||
set(TBB_LINKER_RPATHS "${TBB_LINKER_RPATHS} -Wl,-rpath -Wl,${libpath}")
|
|
||||||
file(GLOB TBBGlob ${libpath}/*.*)
|
|
||||||
install(FILES ${TBBGlob} DESTINATION lib)
|
|
||||||
endforeach()
|
|
||||||
if(APPLE)
|
|
||||||
set(LINKER_FLAGS "${TBB_LINKER_RPATHS} -Wl,-rpath -Wl,@loader_path")
|
|
||||||
elseif(UNIX)
|
|
||||||
set(LINKER_FLAGS "${TBB_LINKER_RPATHS} '-Wl,-rpath,$ORIGIN' -Wl,-z,origin")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} ${LINKER_FLAGS}")
|
|
||||||
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} ${LINKER_FLAGS}")
|
|
||||||
set(CMAKE_MODULE_LINKER_FLAGS "${CMAKE_MODULE_LINKER_FLAGS} ${LINKER_FLAGS}")
|
|
||||||
|
|
||||||
# current mason packages target -D_GLIBCXX_USE_CXX11_ABI=0
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -D_GLIBCXX_USE_CXX11_ABI=0")
|
|
||||||
|
|
||||||
# note: we avoid calling find_package(Osmium ...) here to ensure that the
|
|
||||||
# expat and bzip2 are used from mason rather than the system
|
|
||||||
include_directories(SYSTEM ${CMAKE_CURRENT_SOURCE_DIR}/third_party/libosmium/include)
|
|
||||||
|
|
||||||
include_directories(SYSTEM ${CMAKE_CURRENT_SOURCE_DIR}/third_party/rapidjson/include)
|
|
||||||
|
|
||||||
else()
|
|
||||||
|
|
||||||
find_package(Boost 1.54 REQUIRED COMPONENTS ${BOOST_COMPONENTS})
|
|
||||||
add_dependency_includes(${Boost_INCLUDE_DIRS})
|
|
||||||
if(WIN32 AND Boost_VERSION VERSION_LESS 106200)
|
|
||||||
message(FATAL_ERROR "Building with MSVC needs Boost 1.62 with CXX11_CONSTEXPR support")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
find_package(TBB REQUIRED)
|
|
||||||
add_dependency_includes(${TBB_INCLUDE_DIR})
|
|
||||||
if(WIN32 AND CMAKE_BUILD_TYPE MATCHES Debug)
|
|
||||||
set(TBB_LIBRARIES ${TBB_DEBUG_LIBRARIES})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
find_package(EXPAT REQUIRED)
|
|
||||||
add_dependency_includes(${EXPAT_INCLUDE_DIRS})
|
|
||||||
|
|
||||||
if (ENABLE_STXXL)
|
|
||||||
find_package(STXXL)
|
|
||||||
if (STXXL_FOUND)
|
|
||||||
add_dependency_includes(${STXXL_INCLUDE_DIR})
|
|
||||||
set(MAYBE_STXXL_LIBRARY ${STXXL_LIBRARY})
|
|
||||||
add_definitions(-DUSE_STXXL_LIBRARY)
|
|
||||||
else()
|
|
||||||
MESSAGE(STATUS "STXXL was requested but not found, default STL will be used")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
find_package(BZip2 REQUIRED)
|
|
||||||
add_dependency_includes(${BZIP2_INCLUDE_DIR})
|
|
||||||
|
|
||||||
find_package(Lua 5.2 REQUIRED)
|
|
||||||
if (LUA_FOUND)
|
|
||||||
message(STATUS "Using Lua ${LUA_VERSION_STRING}")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
set(USED_LUA_LIBRARIES ${LUA_LIBRARIES})
|
|
||||||
add_dependency_includes(${LUA_INCLUDE_DIR})
|
|
||||||
|
|
||||||
# add a target to generate API documentation with Doxygen
|
|
||||||
find_package(Doxygen)
|
|
||||||
if(DOXYGEN_FOUND)
|
|
||||||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/Doxyfile.in ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile @ONLY)
|
|
||||||
add_custom_target(doc
|
|
||||||
${DOXYGEN_EXECUTABLE} ${CMAKE_CURRENT_BINARY_DIR}/Doxyfile
|
|
||||||
WORKING_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}
|
|
||||||
COMMENT "Generating API documentation with Doxygen" VERBATIM
|
|
||||||
)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# note libosmium depends on expat and bzip2
|
|
||||||
list(APPEND CMAKE_MODULE_PATH "${CMAKE_CURRENT_SOURCE_DIR}/third_party/libosmium/cmake")
|
|
||||||
if(NOT OSMIUM_INCLUDE_DIR)
|
|
||||||
set(OSMIUM_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/third_party/libosmium/include")
|
|
||||||
endif()
|
|
||||||
find_package(Osmium REQUIRED COMPONENTS io)
|
|
||||||
include_directories(SYSTEM ${OSMIUM_INCLUDE_DIR})
|
|
||||||
|
|
||||||
set(RAPIDJSON_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/third_party/rapidjson/include")
|
|
||||||
include_directories(SYSTEM ${RAPIDJSON_INCLUDE_DIR})
|
|
||||||
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# prefix compilation with ccache by default if available and on clang or gcc
|
|
||||||
if(ENABLE_CCACHE AND (CMAKE_CXX_COMPILER_ID MATCHES "Clang" OR CMAKE_CXX_COMPILER_ID MATCHES "GNU"))
|
|
||||||
find_program(CCACHE_FOUND ccache)
|
|
||||||
if(CCACHE_FOUND)
|
|
||||||
message(STATUS "Using ccache to speed up incremental builds")
|
|
||||||
set_property(GLOBAL PROPERTY RULE_LAUNCH_COMPILE ccache)
|
|
||||||
set_property(GLOBAL PROPERTY RULE_LAUNCH_LINK ccache)
|
|
||||||
set(ENV{CCACHE_CPP2} "true")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# even with mason builds we want to link to system zlib
|
|
||||||
# to ensure that osrm binaries play well with other binaries like nodejs
|
|
||||||
find_package(ZLIB REQUIRED)
|
|
||||||
add_dependency_includes(${ZLIB_INCLUDE_DIRS})
|
|
||||||
|
|
||||||
if(NOT WIN32 AND NOT Boost_USE_STATIC_LIBS)
|
|
||||||
add_dependency_defines(-DBOOST_TEST_DYN_LINK)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if(NOT WIN32 AND NOT Boost_USE_STATIC_LIBS)
|
|
||||||
add_dependency_defines(-DBOOST_TEST_DYN_LINK)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_dependency_defines(-DBOOST_SPIRIT_USE_PHOENIX_V3)
|
|
||||||
add_dependency_defines(-DBOOST_RESULT_OF_USE_DECLTYPE)
|
|
||||||
add_dependency_defines(-DBOOST_FILESYSTEM_NO_DEPRECATED)
|
|
||||||
|
|
||||||
if (ENABLE_STXXL)
|
|
||||||
set(OpenMP_FIND_QUIETLY ON)
|
|
||||||
find_package(OpenMP)
|
|
||||||
if(OPENMP_FOUND)
|
|
||||||
message(STATUS "OpenMP support found. Linking just in case for stxxl")
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
add_definitions(${OSRM_DEFINES})
|
|
||||||
include_directories(SYSTEM ${DEPENDENCIES_INCLUDE_DIRS})
|
|
||||||
|
|
||||||
set(BOOST_BASE_LIBRARIES
|
|
||||||
${Boost_DATE_TIME_LIBRARY}
|
|
||||||
${Boost_CHRONO_LIBRARY}
|
|
||||||
${Boost_FILESYSTEM_LIBRARY}
|
|
||||||
${Boost_IOSTREAMS_LIBRARY}
|
|
||||||
${Boost_THREAD_LIBRARY}
|
|
||||||
${Boost_SYSTEM_LIBRARY})
|
|
||||||
|
|
||||||
set(BOOST_ENGINE_LIBRARIES
|
|
||||||
${Boost_ZLIB_LIBRARY}
|
|
||||||
${Boost_REGEX_LIBRARY}
|
|
||||||
${BOOST_BASE_LIBRARIES})
|
|
||||||
|
|
||||||
# Binaries
|
|
||||||
target_link_libraries(osrm-datastore osrm_store ${Boost_PROGRAM_OPTIONS_LIBRARY})
|
|
||||||
target_link_libraries(osrm-extract osrm_extract ${Boost_PROGRAM_OPTIONS_LIBRARY})
|
|
||||||
target_link_libraries(osrm-partition osrm_partition ${Boost_PROGRAM_OPTIONS_LIBRARY})
|
|
||||||
target_link_libraries(osrm-customize osrm_customize ${Boost_PROGRAM_OPTIONS_LIBRARY})
|
|
||||||
target_link_libraries(osrm-contract osrm_contract ${Boost_PROGRAM_OPTIONS_LIBRARY})
|
|
||||||
target_link_libraries(osrm-routed osrm ${Boost_PROGRAM_OPTIONS_LIBRARY} ${OPTIONAL_SOCKET_LIBS} ${ZLIB_LIBRARY})
|
|
||||||
|
|
||||||
set(EXTRACTOR_LIBRARIES
|
|
||||||
${BZIP2_LIBRARIES}
|
|
||||||
${Boost_REGEX_LIBRARY}
|
|
||||||
${BOOST_BASE_LIBRARIES}
|
|
||||||
${CMAKE_THREAD_LIBS_INIT}
|
|
||||||
${EXPAT_LIBRARIES}
|
|
||||||
${USED_LUA_LIBRARIES}
|
|
||||||
${OSMIUM_LIBRARIES}
|
|
||||||
${MAYBE_STXXL_LIBRARY}
|
|
||||||
${TBB_LIBRARIES}
|
|
||||||
${ZLIB_LIBRARY}
|
|
||||||
${MAYBE_COVERAGE_LIBRARIES})
|
|
||||||
set(PARTITIONER_LIBRARIES
|
|
||||||
${BOOST_ENGINE_LIBRARIES}
|
|
||||||
${CMAKE_THREAD_LIBS_INIT}
|
|
||||||
${TBB_LIBRARIES}
|
|
||||||
${MAYBE_RT_LIBRARY}
|
|
||||||
${MAYBE_COVERAGE_LIBRARIES}
|
|
||||||
${ZLIB_LIBRARY})
|
|
||||||
set(CUSTOMIZER_LIBRARIES
|
|
||||||
${BOOST_ENGINE_LIBRARIES}
|
|
||||||
${CMAKE_THREAD_LIBS_INIT}
|
|
||||||
${TBB_LIBRARIES}
|
|
||||||
${MAYBE_RT_LIBRARY}
|
|
||||||
${MAYBE_COVERAGE_LIBRARIES})
|
|
||||||
set(UPDATER_LIBRARIES
|
|
||||||
${BOOST_BASE_LIBRARIES}
|
|
||||||
${CMAKE_THREAD_LIBS_INIT}
|
|
||||||
${TBB_LIBRARIES}
|
|
||||||
${MAYBE_RT_LIBRARY}
|
|
||||||
${MAYBE_COVERAGE_LIBRARIES}
|
|
||||||
${ZLIB_LIBRARY})
|
|
||||||
set(CONTRACTOR_LIBRARIES
|
|
||||||
${BOOST_BASE_LIBRARIES}
|
|
||||||
${CMAKE_THREAD_LIBS_INIT}
|
|
||||||
${USED_LUA_LIBRARIES}
|
|
||||||
${MAYBE_STXXL_LIBRARY}
|
|
||||||
${TBB_LIBRARIES}
|
|
||||||
${MAYBE_RT_LIBRARY}
|
|
||||||
${MAYBE_COVERAGE_LIBRARIES})
|
|
||||||
set(ENGINE_LIBRARIES
|
|
||||||
${BOOST_ENGINE_LIBRARIES}
|
|
||||||
${CMAKE_THREAD_LIBS_INIT}
|
|
||||||
${TBB_LIBRARIES}
|
|
||||||
${MAYBE_RT_LIBRARY}
|
|
||||||
${MAYBE_COVERAGE_LIBRARIES}
|
|
||||||
${ZLIB_LIBRARY})
|
|
||||||
set(STORAGE_LIBRARIES
|
|
||||||
${BOOST_BASE_LIBRARIES}
|
|
||||||
${CMAKE_THREAD_LIBS_INIT}
|
|
||||||
${TBB_LIBRARIES}
|
|
||||||
${MAYBE_RT_LIBRARY}
|
|
||||||
${MAYBE_COVERAGE_LIBRARIES})
|
|
||||||
set(UTIL_LIBRARIES
|
|
||||||
${BOOST_BASE_LIBRARIES}
|
|
||||||
${CMAKE_THREAD_LIBS_INIT}
|
|
||||||
${MAYBE_STXXL_LIBRARY}
|
|
||||||
${TBB_LIBRARIES}
|
|
||||||
${MAYBE_COVERAGE_LIBRARIES})
|
|
||||||
|
|
||||||
# Libraries
|
|
||||||
target_link_libraries(osrm ${ENGINE_LIBRARIES})
|
|
||||||
target_link_libraries(osrm_update ${UPDATER_LIBRARIES})
|
|
||||||
target_link_libraries(osrm_contract ${CONTRACTOR_LIBRARIES} osrm_update osrm_store)
|
|
||||||
target_link_libraries(osrm_extract ${EXTRACTOR_LIBRARIES})
|
|
||||||
target_link_libraries(osrm_partition ${PARTITIONER_LIBRARIES})
|
|
||||||
target_link_libraries(osrm_customize ${CUSTOMIZER_LIBRARIES} osrm_update osrm_store)
|
|
||||||
target_link_libraries(osrm_store ${STORAGE_LIBRARIES})
|
|
||||||
|
|
||||||
# BUILD_COMPONENTS
|
|
||||||
add_executable(osrm-components src/tools/components.cpp $<TARGET_OBJECTS:UTIL>)
|
|
||||||
target_link_libraries(osrm-components ${TBB_LIBRARIES} ${BOOST_BASE_LIBRARIES} ${UTIL_LIBRARIES})
|
|
||||||
install(TARGETS osrm-components DESTINATION bin)
|
|
||||||
|
|
||||||
if(BUILD_TOOLS)
|
|
||||||
message(STATUS "Activating OSRM internal tools")
|
|
||||||
add_executable(osrm-io-benchmark src/tools/io-benchmark.cpp $<TARGET_OBJECTS:UTIL>)
|
|
||||||
target_link_libraries(osrm-io-benchmark ${BOOST_BASE_LIBRARIES})
|
|
||||||
|
|
||||||
install(TARGETS osrm-io-benchmark DESTINATION bin)
|
|
||||||
|
|
||||||
find_package(Shapefile)
|
|
||||||
if(SHAPEFILE_FOUND AND (Boost_VERSION VERSION_GREATER 106000 OR ENABLE_MASON))
|
|
||||||
add_executable(osrm-extract-conditionals src/tools/extract-conditionals.cpp $<TARGET_OBJECTS:UTIL>)
|
|
||||||
target_include_directories(osrm-extract-conditionals PRIVATE ${LIBSHAPEFILE_INCLUDE_DIR})
|
|
||||||
target_link_libraries(osrm-extract-conditionals ${OSMIUM_LIBRARIES} ${BOOST_BASE_LIBRARIES} ${Boost_PROGRAM_OPTIONS_LIBRARY}
|
|
||||||
${UTIL_LIBRARIES} ${BZIP2_LIBRARIES} ${ZLIB_LIBRARY} ${EXPAT_LIBRARIES} ${CMAKE_THREAD_LIBS_INIT})
|
|
||||||
install(TARGETS osrm-extract-conditionals DESTINATION bin)
|
|
||||||
endif()
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (ENABLE_ASSERTIONS)
|
|
||||||
message(STATUS "Enabling assertions")
|
|
||||||
add_definitions(-DBOOST_ENABLE_ASSERT_HANDLER)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Add RPATH info to executables so that when they are run after being installed
|
|
||||||
# (i.e., from /usr/local/bin/) the linker can find library dependencies. For
|
|
||||||
# more info see http://www.cmake.org/Wiki/CMake_RPATH_handling
|
|
||||||
set_property(TARGET osrm-extract PROPERTY INSTALL_RPATH_USE_LINK_PATH TRUE)
|
|
||||||
set_property(TARGET osrm-partition PROPERTY INSTALL_RPATH_USE_LINK_PATH TRUE)
|
|
||||||
set_property(TARGET osrm-contract PROPERTY INSTALL_RPATH_USE_LINK_PATH TRUE)
|
|
||||||
set_property(TARGET osrm-datastore PROPERTY INSTALL_RPATH_USE_LINK_PATH TRUE)
|
|
||||||
set_property(TARGET osrm-routed PROPERTY INSTALL_RPATH_USE_LINK_PATH TRUE)
|
|
||||||
|
|
||||||
file(GLOB VariantGlob third_party/variant/include/mapbox/*.hpp)
|
|
||||||
file(GLOB LibraryGlob include/osrm/*.hpp)
|
|
||||||
file(GLOB ParametersGlob include/engine/api/*_parameters.hpp)
|
|
||||||
set(EngineHeader include/engine/status.hpp include/engine/engine_config.hpp include/engine/hint.hpp include/engine/bearing.hpp include/engine/approach.hpp include/engine/phantom_node.hpp)
|
|
||||||
set(UtilHeader include/util/coordinate.hpp include/util/json_container.hpp include/util/typedefs.hpp include/util/alias.hpp include/util/exception.hpp include/util/bearing.hpp)
|
|
||||||
set(ExtractorHeader include/extractor/extractor.hpp include/storage/io_config.hpp include/extractor/extractor_config.hpp include/extractor/travel_mode.hpp)
|
|
||||||
set(PartitionerHeader include/partition/partitioner.hpp include/partition/partition_config.hpp)
|
|
||||||
set(ContractorHeader include/contractor/contractor.hpp include/contractor/contractor_config.hpp)
|
|
||||||
set(StorageHeader include/storage/storage.hpp include/storage/io_config.hpp include/storage/storage_config.hpp)
|
|
||||||
install(FILES ${EngineHeader} DESTINATION include/osrm/engine)
|
|
||||||
install(FILES ${UtilHeader} DESTINATION include/osrm/util)
|
|
||||||
install(FILES ${StorageHeader} DESTINATION include/osrm/storage)
|
|
||||||
install(FILES ${ExtractorHeader} DESTINATION include/osrm/extractor)
|
|
||||||
install(FILES ${PartitionerHeader} DESTINATION include/osrm/partition)
|
|
||||||
install(FILES ${ContractorHeader} DESTINATION include/osrm/contractor)
|
|
||||||
install(FILES ${LibraryGlob} DESTINATION include/osrm)
|
|
||||||
install(FILES ${ParametersGlob} DESTINATION include/osrm/engine/api)
|
|
||||||
install(FILES ${VariantGlob} DESTINATION include/mapbox)
|
|
||||||
install(TARGETS osrm-extract DESTINATION bin)
|
|
||||||
install(TARGETS osrm-partition DESTINATION bin)
|
|
||||||
install(TARGETS osrm-customize DESTINATION bin)
|
|
||||||
install(TARGETS osrm-contract DESTINATION bin)
|
|
||||||
install(TARGETS osrm-datastore DESTINATION bin)
|
|
||||||
install(TARGETS osrm-routed DESTINATION bin)
|
|
||||||
install(TARGETS osrm DESTINATION lib)
|
|
||||||
install(TARGETS osrm_extract DESTINATION lib)
|
|
||||||
install(TARGETS osrm_partition DESTINATION lib)
|
|
||||||
install(TARGETS osrm_customize DESTINATION lib)
|
|
||||||
install(TARGETS osrm_update DESTINATION lib)
|
|
||||||
install(TARGETS osrm_contract DESTINATION lib)
|
|
||||||
install(TARGETS osrm_store DESTINATION lib)
|
|
||||||
|
|
||||||
|
|
||||||
# Install profiles and support library to /usr/local/share/osrm/profiles by default
|
|
||||||
set(DefaultProfilesDir profiles)
|
|
||||||
install(DIRECTORY ${DefaultProfilesDir} DESTINATION share/osrm)
|
|
||||||
|
|
||||||
# Setup exporting variables for pkgconfig and subproject
|
|
||||||
#
|
|
||||||
|
|
||||||
if(BUILD_PACKAGE)
|
|
||||||
include(CPackConfig)
|
|
||||||
include(CPack)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
function(JOIN VALUES GLUE OUTPUT)
|
|
||||||
string (REPLACE ";" "${GLUE}" _TMP_STR "${VALUES}")
|
|
||||||
set (${OUTPUT} "${_TMP_STR}" PARENT_SCOPE)
|
|
||||||
endfunction()
|
|
||||||
|
|
||||||
JOIN("${OSRM_DEFINES}" " " TMP_OSRM_DEFINES)
|
|
||||||
set(LibOSRM_CXXFLAGS "${OSRM_CXXFLAGS} ${TMP_OSRM_DEFINES}")
|
|
||||||
set(LibOSRM_LDFLAGS "${OSRM_LDFLAGS}")
|
|
||||||
|
|
||||||
if(BUILD_AS_SUBPROJECT)
|
|
||||||
set(LibOSRM_CXXFLAGS "${LibOSRM_CXXFLAGS}" PARENT_SCOPE)
|
|
||||||
set(LibOSRM_INCLUDE_DIR "${CMAKE_CURRENT_SOURCE_DIR}/include" PARENT_SCOPE)
|
|
||||||
set(LibOSRM_LIBRARY_DIR "${CMAKE_CURRENT_BINARY_DIR}" PARENT_SCOPE)
|
|
||||||
set(LibOSRM_LIBRARIES "osrm" PARENT_SCOPE)
|
|
||||||
set(LibOSRM_DEPENDENT_LIBRARIES "${ENGINE_LIBRARIES}" PARENT_SCOPE)
|
|
||||||
set(LibOSRM_INCLUDE_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/include"
|
|
||||||
"${CMAKE_CURRENT_SOURCE_DIR}/include/osrm"
|
|
||||||
"${CMAKE_CURRENT_SOURCE_DIR}/third_party"
|
|
||||||
"${DEPENDENCIES_INCLUDE_DIRS}" PARENT_SCOPE)
|
|
||||||
set(LibOSRM_LIBRARY_DIRS "${LibOSRM_LIBRARY_DIR}" PARENT_SCOPE)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# pkgconfig defines
|
|
||||||
set(PKGCONFIG_OSRM_CXXFLAGS "${LibOSRM_CXXFLAGS}")
|
|
||||||
set(PKGCONFIG_OSRM_LDFLAGS "${LibOSRM_LDFLAGS}")
|
|
||||||
set(PKGCONFIG_LIBRARY_DIR "${CMAKE_INSTALL_PREFIX}/lib")
|
|
||||||
set(PKGCONFIG_INCLUDE_DIR "${CMAKE_INSTALL_PREFIX}/include")
|
|
||||||
|
|
||||||
list(APPEND DEPENDENCIES_INCLUDE_DIRS "${PKGCONFIG_INCLUDE_DIR}")
|
|
||||||
list(APPEND DEPENDENCIES_INCLUDE_DIRS "${PKGCONFIG_INCLUDE_DIR}/osrm")
|
|
||||||
JOIN("-I${DEPENDENCIES_INCLUDE_DIRS}" " -I" PKGCONFIG_OSRM_INCLUDE_FLAGS)
|
|
||||||
JOIN("${ENGINE_LIBRARIES}" " " PKGCONFIG_OSRM_DEPENDENT_LIBRARIES)
|
|
||||||
|
|
||||||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/cmake/pkgconfig.in libosrm.pc @ONLY)
|
|
||||||
install(FILES ${PROJECT_BINARY_DIR}/libosrm.pc DESTINATION ${PKGCONFIG_LIBRARY_DIR}/pkgconfig)
|
|
||||||
|
|
||||||
# uninstall target
|
|
||||||
configure_file(
|
|
||||||
"${CMAKE_CURRENT_SOURCE_DIR}/cmake/cmake_uninstall.cmake.in"
|
|
||||||
"${CMAKE_CURRENT_BINARY_DIR}/cmake/cmake_uninstall.cmake"
|
|
||||||
IMMEDIATE @ONLY)
|
|
||||||
|
|
||||||
add_custom_target(uninstall
|
|
||||||
COMMAND ${CMAKE_COMMAND} -P ${CMAKE_CURRENT_BINARY_DIR}/cmake/cmake_uninstall.cmake)
|
|
||||||
|
|
||||||
|
|
||||||
# Modular build system: each directory registered here provides its own CMakeLists.txt
|
|
||||||
add_subdirectory(unit_tests)
|
|
||||||
add_subdirectory(src/benchmarks)
|
|
||||||
|
|
||||||
if (ENABLE_GLIBC_WORKAROUND)
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -DGLIBC_WORKAROUND")
|
|
||||||
endif()
|
|
||||||
|
|
||||||
if (ENABLE_NODE_BINDINGS)
|
|
||||||
add_subdirectory(src/nodejs)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
|
|
||||||
if (ENABLE_FUZZING)
|
|
||||||
# Requires libosrm being built with sanitizers; make configurable and default to ubsan
|
|
||||||
set(FUZZ_SANITIZER "undefined" CACHE STRING "Sanitizer to be used for Fuzz testing")
|
|
||||||
set_property(CACHE FUZZ_SANITIZER PROPERTY STRINGS "undefined" "integer" "address" "memory" "thread" "leak")
|
|
||||||
|
|
||||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize-coverage=edge,indirect-calls,8bit-counters -fsanitize=address")
|
|
||||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -fsanitize=address")
|
|
||||||
set(OSRM_LDFLAGS "${OSRM_LDFLAGS} -fsanitize=address")
|
|
||||||
|
|
||||||
message(STATUS "Using -fsanitize=${FUZZ_SANITIZER} for Fuzz testing")
|
|
||||||
|
|
||||||
add_subdirectory(fuzz)
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
|
|
||||||
# add headers sanity check target that includes all headers independently
|
|
||||||
# make sure we have all deps for the nodejs sub project's includes (nan, node)
|
|
||||||
if (ENABLE_NODE_BINDINGS)
|
|
||||||
set(check_headers_dir "${PROJECT_BINARY_DIR}/check-headers")
|
|
||||||
file(GLOB_RECURSE headers_to_check
|
|
||||||
${PROJECT_BINARY_DIR}/*.hpp
|
|
||||||
${PROJECT_SOURCE_DIR}/include/*.hpp)
|
|
||||||
foreach(header ${headers_to_check})
|
|
||||||
get_filename_component(filename ${header} NAME_WE)
|
|
||||||
set(filename "${check_headers_dir}/${filename}.cpp")
|
|
||||||
if (NOT EXISTS ${filename})
|
|
||||||
file(WRITE ${filename} "#include \"${header}\"\n")
|
|
||||||
endif()
|
|
||||||
list(APPEND sources ${filename})
|
|
||||||
endforeach()
|
|
||||||
add_library(check-headers STATIC EXCLUDE_FROM_ALL ${sources})
|
|
||||||
set_target_properties(check-headers PROPERTIES ARCHIVE_OUTPUT_DIRECTORY ${check_headers_dir})
|
|
||||||
endif()
|
|
||||||
@@ -1,3 +0,0 @@
|
|||||||
# Code of conduct
|
|
||||||
|
|
||||||
Everyone is invited to participate in Project OSRM’s open source projects and public discussions: we want to create a welcoming and friendly environment. Harassment of participants or other unethical and unprofessional behavior will not be tolerated in our spaces. The [Contributor Covenant](http://contributor-covenant.org) applies to all projects under the Project-OSRM organization and we ask that you please read [the full text](http://contributor-covenant.org/version/1/2/0/).
|
|
||||||
@@ -1,81 +0,0 @@
|
|||||||
# Everyone
|
|
||||||
|
|
||||||
Please take some time to review our [code of conduct](CODE-OF-CONDUCT.md) to help guide your interactions with others on this project.
|
|
||||||
|
|
||||||
# User
|
|
||||||
|
|
||||||
Before you open a new issue, please search for older ones that cover the same issue.
|
|
||||||
In general "me too" comments/issues are frowned upon.
|
|
||||||
You can add a :+1: emoji reaction to the issue if you want to express interest in this.
|
|
||||||
|
|
||||||
# Developer
|
|
||||||
|
|
||||||
We use `clang-format` version `3.8` to consistently format the code base. There is a helper script under `scripts/format.sh`.
|
|
||||||
The format is automatically checked by the `mason-linux-release` job of a Travis CI build.
|
|
||||||
To save development time a local hook `.git/hooks/pre-push`
|
|
||||||
```
|
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
remote="$1"
|
|
||||||
if [ x"$remote" = xorigin ] ; then
|
|
||||||
if [ $(git rev-parse --abbrev-ref HEAD) = master ] ; then
|
|
||||||
echo "Rejected push to $remote/master" ; exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
./scripts/format.sh && ./scripts/error_on_dirty.sh
|
|
||||||
if [ $? -ne 0 ] ; then
|
|
||||||
echo "Unstaged format changes" ; exit 1
|
|
||||||
fi
|
|
||||||
fi
|
|
||||||
```
|
|
||||||
could check code format, modify a local repository and reject push due to unstaged formatting changes.
|
|
||||||
Also `pre-push` hook rejects direct pushes to `origin/master`.
|
|
||||||
|
|
||||||
⚠️ `scripts/format.sh` checks all local files that match `*.cpp` or `*.hpp` patterns.
|
|
||||||
|
|
||||||
|
|
||||||
In general changes that affect the API and/or increase the memory consumption need to be discussed first.
|
|
||||||
Often we don't include changes that would increase the memory consumption a lot if they are not generally usable (e.g. elevation data is a good example).
|
|
||||||
|
|
||||||
## Pull Request
|
|
||||||
|
|
||||||
Every pull-request that changes the API needs to update the docs in `docs/http.md` and add an entry to `CHANGELOG.md`.
|
|
||||||
Breaking changes need to have a BREAKING prefix. See the [releasing documentation](docs/releasing.md) on how this affects the version.
|
|
||||||
|
|
||||||
Early feedback is also important.
|
|
||||||
You will see that a lot of the PR have tags like `[not ready]` or `[wip]`.
|
|
||||||
We like to open PRs as soon as we are starting to work on something to make it visible to the rest of the team.
|
|
||||||
If your work is going in entirely the wrong direction, there is a good chance someone will pick up on this before it is too late.
|
|
||||||
Everyone is encouraged to read PRs of other people and give feedback.
|
|
||||||
|
|
||||||
For every significant code change we require a pull request review before it is merged.
|
|
||||||
If your pull request modifies the API this need to be signed of by a team discussion.
|
|
||||||
This means you will need to find another member of the team with commit access and request a review of your pull request.
|
|
||||||
|
|
||||||
Once your pull request is reviewed you can merge it! If you don't have commit access, ping someone that has commit access.
|
|
||||||
If you do have commit access there are in general two accepted styles to merging:
|
|
||||||
|
|
||||||
1. Make sure the branch is up to date with `master`. Run `git rebase master` to find out.
|
|
||||||
2. Once that is ensured you can either:
|
|
||||||
- Click the nice green merge button (for a non-fast-forward merge)
|
|
||||||
- Merge by hand using a fast-forward merge
|
|
||||||
|
|
||||||
Which merge you prefer is up to personal preference. In general it is recommended to use fast-forward merges because it creates a history that is sequential and easier to understand.
|
|
||||||
|
|
||||||
# Maintainer
|
|
||||||
|
|
||||||
## Doing a release
|
|
||||||
|
|
||||||
There is an in-depth guide around how to push out a release once it is ready [here](docs/releasing.md).
|
|
||||||
|
|
||||||
## The API
|
|
||||||
|
|
||||||
Changes to the API need to be discussed and signed off by the team. Breaking changes even more so than additive changes.
|
|
||||||
|
|
||||||
## Milestones
|
|
||||||
|
|
||||||
If a pull request or an issue is applicable for the current or next milestone, depends on the target version number.
|
|
||||||
Since we use semantic versioning we restrict breaking changes to major releases.
|
|
||||||
After a Release Candidate is released we usually don't change the API anymore if it is not critical.
|
|
||||||
Bigger code changes after a RC was released should also be avoided.
|
|
||||||
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
PROJECT_NAME = "Project OSRM"
|
|
||||||
PROJECT_BRIEF = "Open Source Routing Machine"
|
|
||||||
BUILTIN_STL_SUPPORT = YES
|
|
||||||
|
|
||||||
EXTRACT_ALL = YES
|
|
||||||
EXTRACT_PRIVATE = YES
|
|
||||||
EXTRACT_PACKAGE = YES
|
|
||||||
EXTRACT_STATIC = YES
|
|
||||||
EXTRACT_LOCAL_CLASSES = YES
|
|
||||||
EXTRACT_ANON_NSPACES = YES
|
|
||||||
|
|
||||||
QUIET = YES
|
|
||||||
|
|
||||||
INPUT = @CMAKE_CURRENT_SOURCE_DIR@
|
|
||||||
USE_MDFILE_AS_MAINPAGE = @CMAKE_CURRENT_SOURCE_DIR@/README.md
|
|
||||||
FILE_PATTERNS = *.h *.hpp *.c *.cc *.cpp *.md
|
|
||||||
RECURSIVE = YES
|
|
||||||
|
|
||||||
EXCLUDE = @CMAKE_CURRENT_SOURCE_DIR@/third_party \
|
|
||||||
@CMAKE_CURRENT_SOURCE_DIR@/build \
|
|
||||||
@CMAKE_CURRENT_SOURCE_DIR@/node_modules \
|
|
||||||
@CMAKE_CURRENT_SOURCE_DIR@/unit_tests \
|
|
||||||
@CMAKE_CURRENT_SOURCE_DIR@/benchmarks \
|
|
||||||
@CMAKE_CURRENT_SOURCE_DIR@/features
|
|
||||||
|
|
||||||
SOURCE_BROWSER = YES
|
|
||||||
|
|
||||||
CLANG_ASSISTED_PARSING = NO
|
|
||||||
|
|
||||||
HTML_COLORSTYLE_HUE = 217
|
|
||||||
HTML_COLORSTYLE_SAT = 71
|
|
||||||
HTML_COLORSTYLE_GAMMA = 50
|
|
||||||
|
|
||||||
GENERATE_TREEVIEW = YES
|
|
||||||
|
|
||||||
HAVE_DOT = @DOXYGEN_DOT_FOUND@
|
|
||||||
CALL_GRAPH = YES
|
|
||||||
CALLER_GRAPH = YES
|
|
||||||
|
|
||||||
DOT_IMAGE_FORMAT = svg
|
|
||||||
INTERACTIVE_SVG = YES
|
|
||||||
DOT_GRAPH_MAX_NODES = 500
|
|
||||||
DOT_TRANSPARENT = YES
|
|
||||||
DOT_MULTI_TARGETS = YES
|
|
||||||
@@ -1,22 +0,0 @@
|
|||||||
Copyright (c) 2017, Project OSRM contributors
|
|
||||||
All rights reserved.
|
|
||||||
|
|
||||||
Redistribution and use in source and binary forms, with or without modification,
|
|
||||||
are permitted provided that the following conditions are met:
|
|
||||||
|
|
||||||
Redistributions of source code must retain the above copyright notice, this list
|
|
||||||
of conditions and the following disclaimer.
|
|
||||||
Redistributions in binary form must reproduce the above copyright notice, this
|
|
||||||
list of conditions and the following disclaimer in the documentation and/or
|
|
||||||
other materials provided with the distribution.
|
|
||||||
|
|
||||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
|
|
||||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
|
||||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
|
||||||
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR
|
|
||||||
ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
|
||||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
||||||
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
|
||||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
||||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
|
|
||||||
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
||||||
@@ -1,175 +1,54 @@
|
|||||||
## Open Source Routing Machine
|
Overview
|
||||||
|
--------
|
||||||
| Linux / macOS | Windows | Code Coverage |
|
The repository provides a Leaflet [(1)] based web frontend to the Open Source Routing Machine (Project-OSRM [(2)]).
|
||||||
| ------------- | ------- | ------------- |
|
The frontend is implemented in Javascript.
|
||||||
| [](https://travis-ci.org/Project-OSRM/osrm-backend) | [](https://ci.appveyor.com/project/DennisOSRM/osrm-backend) | [](https://codecov.io/gh/Project-OSRM/osrm-backend) |
|
Data is fetched from routing and geocoding servers using JSONP queries.
|
||||||
|
The website is XHTML 1.0 Strict compliant.
|
||||||
High performance routing engine written in C++14 designed to run on OpenStreetMap data.
|
A deployed version of the the web frontend can be seen at [(3)].
|
||||||
|
|
||||||
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 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](http://map.project-osrm.org) 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](https://www.mapbox.com/mapping/mapping-for-navigation/).
|
|
||||||
|
|
||||||
Related [Project-OSRM](https://github.com/Project-OSRM) repositories:
|
|
||||||
- [osrm-frontend](https://github.com/Project-OSRM/osrm-frontend) - User-facing frontend with map. The demo server runs this on top of the backend
|
|
||||||
- [osrm-text-instructions](https://github.com/Project-OSRM/osrm-text-instructions) - Text instructions from OSRM route response
|
|
||||||
- [osrm-backend-docker](https://hub.docker.com/r/osrm/osrm-backend/) - Ready to use Docker images
|
|
||||||
|
|
||||||
## Documentation
|
|
||||||
|
|
||||||
### Full documentation
|
|
||||||
|
|
||||||
- [Hosted documentation](http://project-osrm.org)
|
|
||||||
- [osrm-routed HTTP API documentation](docs/http.md)
|
|
||||||
- [libosrm API documentation](docs/libosrm.md)
|
|
||||||
|
|
||||||
## Contact
|
|
||||||
|
|
||||||
- IRC: `irc.oftc.net`, channel: `#osrm` ([Webchat](https://webchat.oftc.net))
|
|
||||||
- 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](https://hub.docker.com/r/osrm/osrm-backend/), [frontend](https://hub.docker.com/r/osrm/osrm-frontend/)) on Alpine Linux and make sure they are as lightweight as possible.
|
|
||||||
|
|
||||||
Download OpenStreetMap extracts for example from [Geofabrik](http://download.geofabrik.de/)
|
|
||||||
|
|
||||||
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 osrm/osrm-backend osrm-extract -p /opt/car.lua /data/berlin-latest.osm.pbf
|
|
||||||
docker run -t -v $(pwd):/data osrm/osrm-backend osrm-partition /data/berlin-latest.osrm
|
|
||||||
docker run -t -v $(pwd):/data osrm/osrm-backend osrm-customize /data/berlin-latest.osrm
|
|
||||||
|
|
||||||
docker run -t -i -p 5000:5000 -v $(pwd):/data 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 on Docker Cloud:
|
|
||||||
|
|
||||||
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 16.04.
|
|
||||||
For instructions how to build on different distributions, macOS or Windows see our [Wiki](https://github.com/Project-OSRM/osrm-backend/wiki).
|
|
||||||
|
|
||||||
Install dependencies
|
|
||||||
|
|
||||||
```bash
|
|
||||||
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
|
|
||||||
|
|
||||||
```bash
|
|
||||||
mkdir -p build
|
|
||||||
cd build
|
|
||||||
cmake ..
|
|
||||||
cmake --build .
|
|
||||||
sudo cmake --build . --target install
|
|
||||||
```
|
|
||||||
|
|
||||||
### Request Against the Demo Server
|
|
||||||
|
|
||||||
Read the [API usage policy](https://github.com/Project-OSRM/osrm-backend/wiki/Demo-server).
|
|
||||||
|
|
||||||
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](docs/nodejs/api.md).
|
|
||||||
|
|
||||||
You will need a modern `libstdc++` toolchain (`>= GLIBCXX_3.4.20`) 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++-5-dev
|
|
||||||
```
|
|
||||||
|
|
||||||
You can install the Node.js bindings via `npm install 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.
|
|
||||||
|
|
||||||
For usage details have a look [these API docs](docs/nodejs/api.md).
|
|
||||||
|
|
||||||
An exemplary implementation by a 3rd party with Docker and Node.js can be found [here](https://github.com/door2door-io/osrm-express-server-demo).
|
|
||||||
|
|
||||||
|
|
||||||
## References in publications
|
Setup
|
||||||
|
-----
|
||||||
|
The frontend should work directly as provided.
|
||||||
|
Several settings - including the URL for the routing server and the geocoder server - can be specified in `OSRM.config.js`.
|
||||||
|
Different tile servers can be specified in `OSRM.Map.js`.
|
||||||
|
Note that the URL shortener used for generating route links only works with URLs pointing to the official Project-OSRM website.
|
||||||
|
|
||||||
When using the code in a (scientific) publication, please cite
|
|
||||||
|
|
||||||
```
|
Branches
|
||||||
@inproceedings{luxen-vetter-2011,
|
--------
|
||||||
author = {Luxen, Dennis and Vetter, Christian},
|
* The `master` branch will always point to the latest released version of the frontend.
|
||||||
title = {Real-time routing with OpenStreetMap data},
|
* The `develop` branch should always point to a working version with new features and bugfixes (think of it as a nightly-build).
|
||||||
booktitle = {Proceedings of the 19th ACM SIGSPATIAL International Conference on Advances in Geographic Information Systems},
|
* Other branches contain various work in progress.
|
||||||
series = {GIS '11},
|
|
||||||
year = {2011},
|
|
||||||
isbn = {978-1-4503-1031-4},
|
Bugtracking
|
||||||
location = {Chicago, Illinois},
|
-----------
|
||||||
pages = {513--516},
|
Please use the OSRM-Project bug tracker for submitting any bug reports or feature requests.
|
||||||
numpages = {4},
|
|
||||||
url = {http://doi.acm.org/10.1145/2093973.2094062},
|
Integration into Project-OSRM repository
|
||||||
doi = {10.1145/2093973.2094062},
|
----------------------------------------
|
||||||
acmid = {2094062},
|
The Project-OSRM repository already contains the frontend repository as a submodule.
|
||||||
publisher = {ACM},
|
It will always point to the latest deployed version.
|
||||||
address = {New York, NY, USA},
|
To successfully work a repository that contains submodules, use the following git commands (available in git 1.7.1+):
|
||||||
}
|
|
||||||
```
|
* `git clone --recursive`
|
||||||
|
to clone a repository and the contained submodules
|
||||||
|
|
||||||
|
* `git pull && git submodule update`
|
||||||
|
to pull the latest version of the repository and update its submodules if required
|
||||||
|
|
||||||
|
Note that the frontend can also be checked out independently of the Project-OSRM repository.
|
||||||
|
|
||||||
|
|
||||||
|
References
|
||||||
|
----------
|
||||||
|
[(1)] Cloudmade Leaflet: http://leaflet.cloudmade.com/
|
||||||
|
[(2)] Project OSRM: http://project-osrm.org/
|
||||||
|
[(3)] Project OSRM Frontend: http://map.project-osrm.org/
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
[(1)]: http://leaflet.cloudmade.com/ "Cloudmade Leaflet"
|
||||||
|
[(2)]: http://project-osrm.org/ "Project OSRM"
|
||||||
|
[(3)]: http://map.project-osrm.org/ "Project-OSRM Frontend"
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
/*
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU AFFERO General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
or see http://www.gnu.org/licenses/agpl.txt.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Leaflet bugfixes
|
||||||
|
// [assorted bugfixes to Leaflet functions we use]
|
||||||
|
|
||||||
|
|
||||||
|
// return closest point on segment or distance to that point
|
||||||
|
L.LineUtil._sqClosestPointOnSegment = function (p, p1, p2, sqDist) {
|
||||||
|
var x = p1.x,
|
||||||
|
y = p1.y,
|
||||||
|
dx = p2.x - x,
|
||||||
|
dy = p2.y - y,
|
||||||
|
dot = dx * dx + dy * dy,
|
||||||
|
t;
|
||||||
|
|
||||||
|
if (dot > 0) {
|
||||||
|
t = ((p.x - x) * dx + (p.y - y) * dy) / dot;
|
||||||
|
|
||||||
|
if (t > 1) {
|
||||||
|
x = p2.x;
|
||||||
|
y = p2.y;
|
||||||
|
} else if (t > 0) {
|
||||||
|
x += dx * t;
|
||||||
|
y += dy * t;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dx = p.x - x;
|
||||||
|
dy = p.y - y;
|
||||||
|
|
||||||
|
// DS_CHANGE: modified return values
|
||||||
|
if(sqDist)
|
||||||
|
return dx*dx + dy*dy;
|
||||||
|
else {
|
||||||
|
var p = new L.Point(x,y);
|
||||||
|
p._sqDist = dx*dx + dy*dy;
|
||||||
|
return p;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// makes requestAnimFrame respect the immediate paramter -> prevents drag events after dragend events
|
||||||
|
// (alternatively: add if(!this.dragging ) return to L.Draggable._updatePosition, but must be done in leaflet.js!)
|
||||||
|
// [TODO: In Leaflet 0.4 use L.Util.cancelAnimFrame(this._animRequest) in L.Draggable._onUp() instead, also has to be done in leaflet.js!]
|
||||||
|
L.Util.requestAnimFrame = (function () {
|
||||||
|
function timeoutDefer(callback) {
|
||||||
|
window.setTimeout(callback, 1000 / 60);
|
||||||
|
}
|
||||||
|
|
||||||
|
var requestFn = window.requestAnimationFrame ||
|
||||||
|
window.webkitRequestAnimationFrame ||
|
||||||
|
window.mozRequestAnimationFrame ||
|
||||||
|
window.oRequestAnimationFrame ||
|
||||||
|
window.msRequestAnimationFrame ||
|
||||||
|
timeoutDefer;
|
||||||
|
|
||||||
|
return function (callback, context, immediate, contextEl) {
|
||||||
|
callback = context ? L.Util.bind(callback, context) : callback;
|
||||||
|
if (immediate ) { // DS_CHANGE: removed additional condition requestFn === timeoutDefer
|
||||||
|
callback();
|
||||||
|
} else {
|
||||||
|
requestFn(callback, contextEl);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}());
|
||||||
@@ -0,0 +1,60 @@
|
|||||||
|
/*
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU AFFERO General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
or see http://www.gnu.org/licenses/agpl.txt.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Leaflet extension: Dashed Polyline
|
||||||
|
// [adds dashed optionally dashed lines when using SVG or VML rendering]
|
||||||
|
|
||||||
|
|
||||||
|
// dashed polyline class
|
||||||
|
L.DashedPolyline = L.Polyline.extend({
|
||||||
|
initialize: function(latlngs, options) {
|
||||||
|
L.Polyline.prototype.initialize.call(this, latlngs, options);
|
||||||
|
},
|
||||||
|
|
||||||
|
options: {
|
||||||
|
dashed: true
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// svg rendering
|
||||||
|
L.DashedPolyline = !L.Browser.svg ? L.DashedPolyline : L.DashedPolyline.extend({
|
||||||
|
_updateStyle: function () {
|
||||||
|
L.Polyline.prototype._updateStyle.call(this);
|
||||||
|
if (this.options.stroke) {
|
||||||
|
if (this.options.dashed == true)
|
||||||
|
this._path.setAttribute('stroke-dasharray', '8,6');
|
||||||
|
else
|
||||||
|
this._path.setAttribute('stroke-dasharray', '');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// vml rendering
|
||||||
|
L.DashedPolyline = L.Browser.svg || !L.Browser.vml ? L.DashedPolyline : L.DashedPolyline.extend({
|
||||||
|
_updateStyle: function () {
|
||||||
|
L.Polyline.prototype._updateStyle.call(this);
|
||||||
|
if (this.options.stroke) {
|
||||||
|
if (this.options.dashed == true)
|
||||||
|
this._stroke.dashstyle = "dash";
|
||||||
|
else
|
||||||
|
this._stroke.dashstyle = "solid";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
@@ -0,0 +1,64 @@
|
|||||||
|
/*
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU AFFERO General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
or see http://www.gnu.org/licenses/agpl.txt.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Leaflet extension: MouseMarker
|
||||||
|
// [marker class that propagates modifier and button presses in mouse click events and allows for changing icons]
|
||||||
|
|
||||||
|
|
||||||
|
// extended marker class
|
||||||
|
L.MouseMarker = L.Marker.extend({
|
||||||
|
initialize: function (latlng, options) {
|
||||||
|
L.Marker.prototype.initialize.apply(this, arguments);
|
||||||
|
},
|
||||||
|
|
||||||
|
switchIcon: function( icon ) {
|
||||||
|
this.options.icon = icon;
|
||||||
|
|
||||||
|
if (this._map) {
|
||||||
|
this._changeIcon();
|
||||||
|
this._reset();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_changeIcon: function () {
|
||||||
|
var options = this.options;
|
||||||
|
|
||||||
|
if (this._icon) {
|
||||||
|
this._icon = options.icon.switchIcon( this._icon );
|
||||||
|
this._icon.title = options.title;
|
||||||
|
}
|
||||||
|
|
||||||
|
var panes = this._map._panes;
|
||||||
|
|
||||||
|
if (this._shadow)
|
||||||
|
panes.shadowPane.removeChild(this._shadow);
|
||||||
|
this._shadow = options.icon.createShadow();
|
||||||
|
if (this._shadow)
|
||||||
|
panes.shadowPane.appendChild(this._shadow);
|
||||||
|
},
|
||||||
|
|
||||||
|
_onMouseClick: function (e) {
|
||||||
|
L.DomEvent.stopPropagation(e);
|
||||||
|
if (this.dragging && this.dragging.moved()) { return; }
|
||||||
|
this.fire(e.type, {
|
||||||
|
altKey: e.altKey,
|
||||||
|
ctrlKey: e.ctrlKey,
|
||||||
|
shiftKey: e.shiftKey,
|
||||||
|
button: e.button
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
@@ -0,0 +1,115 @@
|
|||||||
|
/*
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU AFFERO General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
or see http://www.gnu.org/licenses/agpl.txt.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// Leaflet extension: SwitchableIcon
|
||||||
|
// [will be an extension of L.Icon in Leaflet 0.4, for now it is a copy with added functionality]
|
||||||
|
|
||||||
|
|
||||||
|
// icon class with functions to simply switch the icon images
|
||||||
|
L.SwitchableIcon = L.Class.extend({
|
||||||
|
options: {
|
||||||
|
/*
|
||||||
|
iconUrl: (String) (required)
|
||||||
|
iconSize: (Point) (can be set through CSS)
|
||||||
|
iconAnchor: (Point) (centered by default if size is specified, can be set in CSS with negative margins)
|
||||||
|
popupAnchor: (Point) (if not specified, popup opens in the anchor point)
|
||||||
|
shadowUrl: (Point) (no shadow by default)
|
||||||
|
shadowSize: (Point)
|
||||||
|
*/
|
||||||
|
className: ''
|
||||||
|
},
|
||||||
|
|
||||||
|
initialize: function (options) {
|
||||||
|
L.Util.setOptions(this, options);
|
||||||
|
},
|
||||||
|
|
||||||
|
createIcon: function () {
|
||||||
|
return this._createIcon('icon');
|
||||||
|
},
|
||||||
|
|
||||||
|
createShadow: function () {
|
||||||
|
return this.options.shadowUrl ? this._createIcon('shadow') : null;
|
||||||
|
},
|
||||||
|
|
||||||
|
_createIcon: function (name) {
|
||||||
|
var img = this._createImg(this.options[name + 'Url']);
|
||||||
|
this._setIconStyles(img, name);
|
||||||
|
return img;
|
||||||
|
},
|
||||||
|
|
||||||
|
_setIconStyles: function (img, name) {
|
||||||
|
var options = this.options,
|
||||||
|
size = options[name + 'Size'],
|
||||||
|
anchor = options.iconAnchor;
|
||||||
|
|
||||||
|
if (!anchor && size) {
|
||||||
|
anchor = size.divideBy(2, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (name === 'shadow' && anchor && options.shadowOffset) {
|
||||||
|
anchor._add(options.shadowOffset);
|
||||||
|
}
|
||||||
|
|
||||||
|
img.className = 'leaflet-marker-' + name + ' ' + options.className;
|
||||||
|
|
||||||
|
if (anchor) {
|
||||||
|
img.style.marginLeft = (-anchor.x) + 'px';
|
||||||
|
img.style.marginTop = (-anchor.y) + 'px';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (size) {
|
||||||
|
img.style.width = size.x + 'px';
|
||||||
|
img.style.height = size.y + 'px';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
_createImg: function (src) {
|
||||||
|
var el;
|
||||||
|
if (!L.Browser.ie6) {
|
||||||
|
el = document.createElement('img');
|
||||||
|
el.src = src;
|
||||||
|
} else {
|
||||||
|
el = document.createElement('div');
|
||||||
|
el.style.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="' + src + '")';
|
||||||
|
}
|
||||||
|
return el;
|
||||||
|
},
|
||||||
|
|
||||||
|
// new functions start here
|
||||||
|
switchIcon: function (el) {
|
||||||
|
return this._switchIcon('icon', el);
|
||||||
|
},
|
||||||
|
|
||||||
|
switchShadow: function (el) {
|
||||||
|
return this.options.shadowUrl ? this._switchIcon('shadow', el) : null;
|
||||||
|
},
|
||||||
|
|
||||||
|
_switchIcon: function (name, el) {
|
||||||
|
var img = this._switchImg(this.options[name + 'Url'], el);
|
||||||
|
this._setIconStyles(img, name);
|
||||||
|
return img;
|
||||||
|
},
|
||||||
|
|
||||||
|
_switchImg: function (src, el) {
|
||||||
|
if (!L.Browser.ie6) {
|
||||||
|
el.src = src;
|
||||||
|
} else {
|
||||||
|
el.style.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="' + src + '")';
|
||||||
|
}
|
||||||
|
return el;
|
||||||
|
}
|
||||||
|
});
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
/*
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU AFFERO General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
or see http://www.gnu.org/licenses/agpl.txt.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// OSRM old browser support
|
||||||
|
// [simple browser detection and routines to support some old browsers]
|
||||||
|
|
||||||
|
|
||||||
|
// browser detection (runs anonymous function to prevent local variables cluttering global namespace)
|
||||||
|
(function() {
|
||||||
|
var useragent = navigator.userAgent;
|
||||||
|
|
||||||
|
OSRM.Browser = {
|
||||||
|
FF3: useragent.search(/Firefox\/3/),
|
||||||
|
IE6_9: useragent.search(/MSIE (6|7|8|9)/)
|
||||||
|
};
|
||||||
|
}());
|
||||||
|
|
||||||
|
|
||||||
|
// compatibility tools for old browsers
|
||||||
|
function getElementsByClassName(node, classname) {
|
||||||
|
var a = [];
|
||||||
|
var re = new RegExp('(^| )'+classname+'( |$)');
|
||||||
|
var els = node.getElementsByTagName("*");
|
||||||
|
for(var i=0,j=els.length; i<j; i++)
|
||||||
|
if(re.test(els[i].className))a.push(els[i]);
|
||||||
|
return a;
|
||||||
|
}
|
||||||
|
document.head = document.head || document.getElementsByTagName('head')[0];
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
/*
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU AFFERO General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
or see http://www.gnu.org/licenses/agpl.txt.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// OSRM EventHandler
|
||||||
|
// [adds simple event handling: other classes can derive from this class to acquire custom event handling]
|
||||||
|
|
||||||
|
|
||||||
|
OSRM.EventHandler = function() {
|
||||||
|
this._listeners = {};
|
||||||
|
};
|
||||||
|
|
||||||
|
OSRM.extend( OSRM.EventHandler, {
|
||||||
|
|
||||||
|
// add listener
|
||||||
|
addListener: function(type, listener) {
|
||||||
|
if( this._listeners[type] == undefined)
|
||||||
|
this._listeners[type] = [];
|
||||||
|
this._listeners[type].push(listener);
|
||||||
|
},
|
||||||
|
|
||||||
|
//remove event listener
|
||||||
|
removeListener: function(type, listener) {
|
||||||
|
if( this._listeners[type] != undefined) {
|
||||||
|
for(var i=0; i<this._listeners[type].length; i++)
|
||||||
|
if( this._listeners[type][i] == listener) {
|
||||||
|
this._listeners[type].splice(i,1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// fire event
|
||||||
|
fire: function(event) {
|
||||||
|
if( typeof event == "string")
|
||||||
|
event = {type:event};
|
||||||
|
if( !event.target )
|
||||||
|
event.target = this;
|
||||||
|
|
||||||
|
if( !event.type )
|
||||||
|
throw new Error("event object missing type property!");
|
||||||
|
|
||||||
|
if( this._listeners[type] != undefined)
|
||||||
|
for(var listener in this._listeners[event.type])
|
||||||
|
listener.call(this, event);
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
@@ -0,0 +1,103 @@
|
|||||||
|
/*
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU AFFERO General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
or see http://www.gnu.org/licenses/agpl.txt.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// OSRM GUI functionality
|
||||||
|
// [responsible for all non-routing related GUI behaviour]
|
||||||
|
|
||||||
|
|
||||||
|
OSRM.GUI = {
|
||||||
|
|
||||||
|
// defaults
|
||||||
|
visible: null,
|
||||||
|
width: null,
|
||||||
|
|
||||||
|
// init GUI
|
||||||
|
init: function() {
|
||||||
|
OSRM.GUI.visible = true;
|
||||||
|
OSRM.GUI.width = document.getElementById("main-wrapper").clientWidth;
|
||||||
|
|
||||||
|
// translate
|
||||||
|
document.getElementById("open-josm").innerHTML = OSRM.loc("OPEN_JOSM");
|
||||||
|
document.getElementById("open-osmbugs").innerHTML = OSRM.loc("OPEN_OSMBUGS");
|
||||||
|
document.getElementById("gui-reset").innerHTML = OSRM.loc("GUI_RESET");
|
||||||
|
document.getElementById("gui-reverse").innerHTML = OSRM.loc("GUI_REVERSE");
|
||||||
|
document.getElementById("gui-option-highlight-nonames-label").innerHTML = OSRM.loc("GUI_HIGHLIGHT_UNNAMED_ROADS");
|
||||||
|
document.getElementById("options-toggle").innerHTML = OSRM.loc("GUI_OPTIONS");
|
||||||
|
document.getElementById("gui-search-source").innerHTML = OSRM.loc("GUI_SEARCH");
|
||||||
|
document.getElementById("gui-search-target").innerHTML = OSRM.loc("GUI_SEARCH");
|
||||||
|
document.getElementById("gui-search-source-label").innerHTML = OSRM.loc("GUI_START")+":";
|
||||||
|
document.getElementById("gui-search-target-label").innerHTML = OSRM.loc("GUI_END")+":";
|
||||||
|
document.getElementById("input-source-name").title = OSRM.loc("GUI_START_TOOLTIP");
|
||||||
|
document.getElementById("input-target-name").title = OSRM.loc("GUI_END_TOOLTIP");
|
||||||
|
document.getElementById("legal-notice").innerHTML = OSRM.loc("GUI_LEGAL_NOTICE");
|
||||||
|
|
||||||
|
document.getElementById('input-source-name').value = OSRM.DEFAULTS.ONLOAD_SOURCE;
|
||||||
|
document.getElementById('input-target-name').value = OSRM.DEFAULTS.ONLOAD_TARGET;
|
||||||
|
},
|
||||||
|
|
||||||
|
// show/hide main-gui
|
||||||
|
toggleMain: function() {
|
||||||
|
// show main-gui
|
||||||
|
if( OSRM.GUI.visible == false ) {
|
||||||
|
getElementsByClassName(document,'leaflet-control-zoom')[0].style.visibility="hidden";
|
||||||
|
getElementsByClassName(document,'leaflet-control-zoom')[0].style.left=(OSRM.GUI.width+10)+"px";;
|
||||||
|
|
||||||
|
document.getElementById('blob-wrapper').style.visibility="hidden";
|
||||||
|
document.getElementById('main-wrapper').style.left="5px";
|
||||||
|
// hide main-gui
|
||||||
|
} else {
|
||||||
|
getElementsByClassName(document,'leaflet-control-zoom')[0].style.visibility="hidden";
|
||||||
|
getElementsByClassName(document,'leaflet-control-zoom')[0].style.left="30px";
|
||||||
|
|
||||||
|
document.getElementById('main-wrapper').style.left=-OSRM.GUI.width+"px";
|
||||||
|
}
|
||||||
|
|
||||||
|
// execute after animation
|
||||||
|
if( OSRM.Browser.FF3==-1 && OSRM.Browser.IE6_9==-1 ) {
|
||||||
|
document.getElementById('main-wrapper').addEventListener("transitionend", OSRM.GUI.onMainTransitionEnd, false);
|
||||||
|
document.getElementById('main-wrapper').addEventListener("webkitTransitionEnd", OSRM.GUI.onMainTransitionEnd, false);
|
||||||
|
document.getElementById('main-wrapper').addEventListener("oTransitionEnd", OSRM.GUI.onMainTransitionEnd, false);
|
||||||
|
document.getElementById('main-wrapper').addEventListener("MSTransitionEnd", OSRM.GUI.onMainTransitionEnd, false);
|
||||||
|
} else {
|
||||||
|
OSRM.GUI.onMainTransitionEnd();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// do stuff after main-gui animation finished
|
||||||
|
onMainTransitionEnd: function() {
|
||||||
|
// after hiding main-gui
|
||||||
|
if( OSRM.GUI.visible == true ) {
|
||||||
|
document.getElementById('blob-wrapper').style.visibility="visible";
|
||||||
|
getElementsByClassName(document,'leaflet-control-zoom')[0].style.visibility="visible";
|
||||||
|
OSRM.GUI.visible = false;
|
||||||
|
// after showing main-gui
|
||||||
|
} else {
|
||||||
|
getElementsByClassName(document,'leaflet-control-zoom')[0].style.visibility="visible";
|
||||||
|
OSRM.GUI.visible = true;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// show/hide small options bubble
|
||||||
|
toggleOptions: function() {
|
||||||
|
if(document.getElementById('options-box').style.visibility=="visible") {
|
||||||
|
document.getElementById('options-box').style.visibility="hidden";
|
||||||
|
} else {
|
||||||
|
document.getElementById('options-box').style.visibility="visible";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
@@ -0,0 +1,206 @@
|
|||||||
|
/*
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU AFFERO General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
or see http://www.gnu.org/licenses/agpl.txt.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// OSRM geocoding routines
|
||||||
|
// [geocoder query, management and display of geocoder results]
|
||||||
|
|
||||||
|
// some constants
|
||||||
|
OSRM.CONSTANTS.SOURCE_LABEL = "source";
|
||||||
|
OSRM.CONSTANTS.TARGET_LABEL = "target";
|
||||||
|
OSRM.CONSTANTS.VIA_LABEL = "via";
|
||||||
|
OSRM.CONSTANTS.DO_FALLBACK_TO_LAT_LNG = true;
|
||||||
|
|
||||||
|
|
||||||
|
OSRM.Geocoder = {
|
||||||
|
|
||||||
|
//[normal geocoding]
|
||||||
|
|
||||||
|
// process input request and call geocoder if needed
|
||||||
|
call: function(marker_id, query) {
|
||||||
|
if(query=="")
|
||||||
|
return;
|
||||||
|
|
||||||
|
//geo coordinates given -> directly draw results
|
||||||
|
if(query.match(/^\s*[-+]?[0-9]*\.?[0-9]+\s*[,;]\s*[-+]?[0-9]*\.?[0-9]+\s*$/)){
|
||||||
|
var coord = query.split(/[,;]/);
|
||||||
|
OSRM.Geocoder._onclickResult(marker_id, coord[0], coord[1]);
|
||||||
|
OSRM.Geocoder.updateAddress( marker_id );
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
//build request for geocoder
|
||||||
|
var call = OSRM.DEFAULTS.HOST_GEOCODER_URL + "?format=json" + OSRM.DEFAULTS.GEOCODER_BOUNDS + "&q=" + query;
|
||||||
|
OSRM.JSONP.call( call, OSRM.Geocoder._showResults, OSRM.Geocoder._showResults_Timeout, OSRM.DEFAULTS.JSONP_TIMEOUT, "geocoder_"+marker_id, {marker_id:marker_id,query:query} );
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
// helper function for clicks on geocoder search results
|
||||||
|
_onclickResult: function(marker_id, lat, lon) {
|
||||||
|
var index;
|
||||||
|
if( marker_id == OSRM.C.SOURCE_LABEL )
|
||||||
|
index = OSRM.G.markers.setSource( new L.LatLng(lat, lon) );
|
||||||
|
else if( marker_id == OSRM.C.TARGET_LABEL )
|
||||||
|
index = OSRM.G.markers.setTarget( new L.LatLng(lat, lon) );
|
||||||
|
else
|
||||||
|
return;
|
||||||
|
|
||||||
|
OSRM.G.markers.route[index].show();
|
||||||
|
OSRM.G.markers.route[index].centerView();
|
||||||
|
OSRM.Routing.getRoute();
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
// process geocoder response
|
||||||
|
_showResults: function(response, parameters) {
|
||||||
|
if(!response){
|
||||||
|
OSRM.Geocoder._showResults_Empty(parameters);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(response.length == 0) {
|
||||||
|
OSRM.Geocoder._showResults_Empty(parameters);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// show possible results for input
|
||||||
|
var html = "";
|
||||||
|
html += '<table class="results-table">';
|
||||||
|
for(var i=0; i < response.length; i++){
|
||||||
|
var result = response[i];
|
||||||
|
|
||||||
|
//odd or even ?
|
||||||
|
var rowstyle='results-odd';
|
||||||
|
if(i%2==0) { rowstyle='results-even'; }
|
||||||
|
|
||||||
|
html += '<tr class="'+rowstyle+'">';
|
||||||
|
html += '<td class="result-counter"><span">'+(i+1)+'.</span></td>';
|
||||||
|
html += '<td class="result-items">';
|
||||||
|
|
||||||
|
if(result.display_name){
|
||||||
|
html += '<div class="result-item" onclick="OSRM.Geocoder._onclickResult(\''+parameters.marker_id+'\', '+result.lat+', '+result.lon+');">'+result.display_name+'</div>';
|
||||||
|
}
|
||||||
|
html += "</td></tr>";
|
||||||
|
}
|
||||||
|
html += '</table>';
|
||||||
|
|
||||||
|
document.getElementById('information-box-headline').innerHTML = OSRM.loc("SEARCH_RESULTS")+":";
|
||||||
|
document.getElementById('information-box').innerHTML = html;
|
||||||
|
|
||||||
|
OSRM.Geocoder._onclickResult(parameters.marker_id, response[0].lat, response[0].lon);
|
||||||
|
},
|
||||||
|
_showResults_Empty: function(parameters) {
|
||||||
|
document.getElementById('information-box-headline').innerHTML = OSRM.loc("SEARCH_RESULTS")+":";
|
||||||
|
if(parameters.marker_id == OSRM.C.SOURCE_LABEL)
|
||||||
|
document.getElementById('information-box').innerHTML = "<br><p style='font-size:14px;font-weight:bold;text-align:center;'>"+OSRM.loc("NO_RESULTS_FOUND_SOURCE")+": "+parameters.query +".<p>";
|
||||||
|
else if(parameters.marker_id == OSRM.C.TARGET_LABEL)
|
||||||
|
document.getElementById('information-box').innerHTML = "<br><p style='font-size:14px;font-weight:bold;text-align:center;'>"+OSRM.loc("NO_RESULTS_FOUND_TARGET")+": "+parameters.query +".<p>";
|
||||||
|
else
|
||||||
|
document.getElementById('information-box').innerHTML = "<br><p style='font-size:14px;font-weight:bold;text-align:center;'>"+OSRM.loc("NO_RESULTS_FOUND")+": "+parameters.query +".<p>";
|
||||||
|
},
|
||||||
|
_showResults_Timeout: function() {
|
||||||
|
document.getElementById('information-box-headline').innerHTML = OSRM.loc("SEARCH_RESULTS")+":";
|
||||||
|
document.getElementById('information-box').innerHTML = "<br><p style='font-size:14px;font-weight:bold;text-align:center;'>"+OSRM.loc("TIMED_OUT")+".<p>";
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
// [reverse geocoding]
|
||||||
|
|
||||||
|
//update geo coordinates in input boxes
|
||||||
|
updateLocation: function(marker_id) {
|
||||||
|
if (marker_id == OSRM.C.SOURCE_LABEL && OSRM.G.markers.hasSource()) {
|
||||||
|
document.getElementById("input-source-name").value = OSRM.G.markers.route[0].getLat().toFixed(6) + ", " + OSRM.G.markers.route[0].getLng().toFixed(6);
|
||||||
|
} else if (marker_id == OSRM.C.TARGET_LABEL && OSRM.G.markers.hasTarget()) {
|
||||||
|
document.getElementById("input-target-name").value = OSRM.G.markers.route[OSRM.G.markers.route.length-1].getLat().toFixed(6) + ", " + OSRM.G.markers.route[OSRM.G.markers.route.length-1].getLng().toFixed(6);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
// update address in input boxes
|
||||||
|
updateAddress: function(marker_id, do_fallback_to_lat_lng) {
|
||||||
|
// build request for reverse geocoder
|
||||||
|
var lat = null;
|
||||||
|
var lng = null;
|
||||||
|
|
||||||
|
if(marker_id == OSRM.C.SOURCE_LABEL && OSRM.G.markers.hasSource()) {
|
||||||
|
lat = OSRM.G.markers.route[0].getLat();
|
||||||
|
lng = OSRM.G.markers.route[0].getLng();
|
||||||
|
} else if(marker_id == OSRM.C.TARGET_LABEL && OSRM.G.markers.hasTarget() ) {
|
||||||
|
lat = OSRM.G.markers.route[OSRM.G.markers.route.length-1].getLat();
|
||||||
|
lng = OSRM.G.markers.route[OSRM.G.markers.route.length-1].getLng();
|
||||||
|
} else
|
||||||
|
return;
|
||||||
|
|
||||||
|
var call = OSRM.DEFAULTS.HOST_REVERSE_GEOCODER_URL + "?format=json" + "&lat=" + lat + "&lon=" + lng;
|
||||||
|
OSRM.JSONP.call( call, OSRM.Geocoder._showReverseResults, OSRM.Geocoder._showReverseResults_Timeout, OSRM.DEFAULTS.JSONP_TIMEOUT, "reverse_geocoder_"+marker_id, {marker_id:marker_id, do_fallback: do_fallback_to_lat_lng} );
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
// processing JSONP response of reverse geocoder
|
||||||
|
_showReverseResults: function(response, parameters) {
|
||||||
|
if(!response) {
|
||||||
|
OSRM.Geocoder._showReverseResults_Timeout(response, parameters);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if(response.address == undefined) {
|
||||||
|
OSRM.Geocoder._showReverseResults_Timeout(response, parameters);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// build reverse geocoding address
|
||||||
|
var used_address_data = 0;
|
||||||
|
var address = "";
|
||||||
|
if( response.address.road) {
|
||||||
|
address += response.address.road;
|
||||||
|
used_address_data++;
|
||||||
|
}
|
||||||
|
if( response.address.city ) {
|
||||||
|
if( used_address_data > 0 )
|
||||||
|
address += ", ";
|
||||||
|
address += response.address.city;
|
||||||
|
used_address_data++;
|
||||||
|
} else if( response.address.village ) {
|
||||||
|
if( used_address_data > 0 )
|
||||||
|
address += ", ";
|
||||||
|
address += response.address.village;
|
||||||
|
used_address_data++;
|
||||||
|
}
|
||||||
|
if( used_address_data < 2 && response.address.country ) {
|
||||||
|
if( used_address_data > 0 )
|
||||||
|
address += ", ";
|
||||||
|
address += response.address.country;
|
||||||
|
used_address_data++;
|
||||||
|
}
|
||||||
|
if( used_address_data == 0 ) {
|
||||||
|
OSRM.Geocoder._showReverseResults_Timeout(response, parameters);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// add result to DOM
|
||||||
|
if(parameters.marker_id == OSRM.C.SOURCE_LABEL && OSRM.G.markers.hasSource() )
|
||||||
|
document.getElementById("input-source-name").value = address;
|
||||||
|
else if(parameters.marker_id == OSRM.C.TARGET_LABEL && OSRM.G.markers.hasTarget() )
|
||||||
|
document.getElementById("input-target-name").value = address;
|
||||||
|
},
|
||||||
|
_showReverseResults_Timeout: function(response, parameters) {
|
||||||
|
if(!parameters.do_fallback)
|
||||||
|
return;
|
||||||
|
|
||||||
|
updateLocation(parameters.marker_id);
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
@@ -0,0 +1,103 @@
|
|||||||
|
/*
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU AFFERO General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
or see http://www.gnu.org/licenses/agpl.txt.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// OSRM JSONP call wrapper
|
||||||
|
// [wrapper for JSONP calls with DOM cleaning, fencing, timout handling]
|
||||||
|
|
||||||
|
|
||||||
|
OSRM.JSONP = {
|
||||||
|
|
||||||
|
// storage to keep track of unfinished JSONP calls
|
||||||
|
fences: {},
|
||||||
|
callbacks: {},
|
||||||
|
timeouts: {},
|
||||||
|
timers: {},
|
||||||
|
|
||||||
|
|
||||||
|
// default callback routines
|
||||||
|
late: function() { /*OSRM.debug.log("[jsonp] reply too late");*/ },
|
||||||
|
empty: function() { /*OSRM.debug.log("[jsonp] empty callback");*/ },
|
||||||
|
|
||||||
|
|
||||||
|
// init JSONP call
|
||||||
|
call: function(source, callback_function, timeout_function, timeout, id, parameters) {
|
||||||
|
// only one active JSONP call per id
|
||||||
|
if (OSRM.JSONP.fences[id] == true)
|
||||||
|
return false;
|
||||||
|
OSRM.JSONP.fences[id] = true;
|
||||||
|
|
||||||
|
// wrap timeout function
|
||||||
|
OSRM.JSONP.timeouts[id] = function(response) {
|
||||||
|
try {
|
||||||
|
timeout_function(response, parameters);
|
||||||
|
} finally {
|
||||||
|
OSRM.JSONP.callbacks[id] = OSRM.JSONP.late; // clean functions
|
||||||
|
OSRM.JSONP.timeouts[id] = OSRM.JSONP.empty;
|
||||||
|
OSRM.JSONP.fences[id] = undefined; // clean fence
|
||||||
|
}
|
||||||
|
|
||||||
|
// OSRM.debug.log("[jsonp] timout handling: "+id);
|
||||||
|
};
|
||||||
|
|
||||||
|
// wrap callback function
|
||||||
|
OSRM.JSONP.callbacks[id] = function(response) {
|
||||||
|
clearTimeout(OSRM.JSONP.timers[id]); // clear timeout timer
|
||||||
|
OSRM.JSONP.timers[id] = undefined;
|
||||||
|
|
||||||
|
try {
|
||||||
|
callback_function(response, parameters); // actual wrapped callback
|
||||||
|
} finally {
|
||||||
|
OSRM.JSONP.callbacks[id] = OSRM.JSONP.empty; // clean functions
|
||||||
|
OSRM.JSONP.timeouts[id] = OSRM.JSONP.late;
|
||||||
|
OSRM.JSONP.fences[id] = undefined; // clean fence
|
||||||
|
}
|
||||||
|
|
||||||
|
// OSRM.JSONP.sum[id] += new Number( new Date() - OSRM.JSONP.durations[id] );
|
||||||
|
// OSRM.debug.log("[jsonp] response handling: "+id+" "+ (OSRM.JSONP.sum[id]/OSRM.JSONP.counter[id]).toFixed(2) );
|
||||||
|
};
|
||||||
|
|
||||||
|
// clean DOM (unfortunately, script elements cannot be reused by all browsers)
|
||||||
|
var jsonp = document.getElementById('jsonp_'+id);
|
||||||
|
if(jsonp)
|
||||||
|
jsonp.parentNode.removeChild(jsonp);
|
||||||
|
|
||||||
|
// add script to DOM
|
||||||
|
var script = document.createElement('script');
|
||||||
|
script.type = 'text/javascript';
|
||||||
|
script.id = 'jsonp_'+id;
|
||||||
|
script.src = source + "&json_callback=OSRM.JSONP.callbacks."+id + "&jsonp=OSRM.JSONP.callbacks."+id;
|
||||||
|
document.head.appendChild(script);
|
||||||
|
|
||||||
|
// start timeout timer
|
||||||
|
OSRM.JSONP.timers[id] = setTimeout(OSRM.JSONP.timeouts[id], timeout);
|
||||||
|
|
||||||
|
// if(!OSRM.JSONP.durations) { OSRM.JSONP.durations = {}; OSRM.JSONP.counter = {}; OSRM.JSONP.sum = {}; }
|
||||||
|
// if(OSRM.JSONP.counter[id]) OSRM.JSONP.counter[id]++; else {OSRM.JSONP.counter[id] = 1;OSRM.JSONP.sum[id] = 0;}
|
||||||
|
// OSRM.JSONP.durations[id] = new Date();
|
||||||
|
// OSRM.debug.log("[jsonp] init: "+id);
|
||||||
|
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
|
||||||
|
// reset all data
|
||||||
|
reset: function() {
|
||||||
|
OSRM.JSONP.fences = {};
|
||||||
|
OSRM.JSONP.callbacks = {};
|
||||||
|
OSRM.JSONP.timeouts = {};
|
||||||
|
OSRM.JSONP.timers = {};
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -0,0 +1,122 @@
|
|||||||
|
/*
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU AFFERO General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
or see http://www.gnu.org/licenses/agpl.txt.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// OSRM localization
|
||||||
|
// [basic localization options]
|
||||||
|
|
||||||
|
|
||||||
|
OSRM.Localization = {
|
||||||
|
|
||||||
|
// if existing, return localized string -> English string -> input string
|
||||||
|
translate: function(text) {
|
||||||
|
if( OSRM.Localization[OSRM.DEFAULTS.LANGUAGE][text] )
|
||||||
|
return OSRM.Localization[OSRM.DEFAULTS.LANGUAGE][text];
|
||||||
|
else if( OSRM.Localization["en"][text] )
|
||||||
|
return OSRM.Localization["en"][text];
|
||||||
|
else
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// shorter call to translate function
|
||||||
|
OSRM.loc = OSRM.Localization.translate;
|
||||||
|
|
||||||
|
|
||||||
|
// German language support
|
||||||
|
OSRM.Localization["de"] = {
|
||||||
|
//gui
|
||||||
|
"OPEN_JOSM": "JOSM",
|
||||||
|
"OPEN_OSMBUGS": "OSM Bugs",
|
||||||
|
"GUI_START": "Start",
|
||||||
|
"GUI_END": "Ziel",
|
||||||
|
"GUI_RESET": "Reset",
|
||||||
|
"GUI_SEARCH": "Zeigen",
|
||||||
|
"GUI_REVERSE": "Umdrehen",
|
||||||
|
"GUI_OPTIONS": "Kartenwerkzeuge",
|
||||||
|
"GUI_HIGHLIGHT_UNNAMED_ROADS": "Unbenannte Straßen hervorheben",
|
||||||
|
"GUI_START_TOOLTIP": "Startposition eingeben",
|
||||||
|
"GUI_END_TOOLTIP": "Zielposition eingeben",
|
||||||
|
"GUI_LEGAL_NOTICE": "GUI2 v"+OSRM.VERSION+" "+OSRM.DATE+" - OSRM hosting by <a href='http://algo2.iti.kit.edu/'>KIT</a> - Geocoder by <a href='http://www.osm.org/'>OSM</a>",
|
||||||
|
// geocoder
|
||||||
|
"SEARCH_RESULTS": "Suchergebnisse",
|
||||||
|
"TIMED_OUT": "Zeitüberschreitung",
|
||||||
|
"NO_RESULTS_FOUND": "Keine Ergebnisse gefunden",
|
||||||
|
"NO_RESULTS_FOUND_SOURCE": "Keine Ergebnisse gefunden für Start",
|
||||||
|
"NO_RESULTS_FOUND_TARGET": "Keine Ergebnisse gefunden für Ziel",
|
||||||
|
// routing
|
||||||
|
"ROUTE_DESCRIPTION": "Routenbeschreibung",
|
||||||
|
"GET_LINK_TO_ROUTE": "Generiere Link",
|
||||||
|
"GENERATE_LINK_TO_ROUTE": "Warte auf Antwort",
|
||||||
|
"LINK_TO_ROUTE_TIMEOUT": "nicht möglich",
|
||||||
|
"GPX_FILE": "GPX Datei",
|
||||||
|
"DISTANCE": "Distanz",
|
||||||
|
"DURATION": "Dauer",
|
||||||
|
"YOUR_ROUTE_IS_BEING_COMPUTED": "Ihre Route wird berechnet",
|
||||||
|
"NO_ROUTE_FOUND": "Keine Route hierher möglich",
|
||||||
|
// directions
|
||||||
|
"N": "Norden",
|
||||||
|
"O": "Ost",
|
||||||
|
"S": "Süden",
|
||||||
|
"W": "Westen",
|
||||||
|
"NO": "Nordost",
|
||||||
|
"SO": "Südost",
|
||||||
|
"SW": "Südwest",
|
||||||
|
"NW": "Nordwest"
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// English language support
|
||||||
|
OSRM.Localization["en"] = {
|
||||||
|
//gui
|
||||||
|
"OPEN_JOSM": "JOSM",
|
||||||
|
"OPEN_OSMBUGS": "OSM Bugs",
|
||||||
|
"GUI_START": "Start",
|
||||||
|
"GUI_END": "End",
|
||||||
|
"GUI_RESET": " Reset ",
|
||||||
|
"GUI_SEARCH": " Show ",
|
||||||
|
"GUI_REVERSE": "Reverse",
|
||||||
|
"GUI_OPTIONS": "Mapping Tools",
|
||||||
|
"GUI_HIGHLIGHT_UNNAMED_ROADS": "Highlight unnamed streets",
|
||||||
|
"GUI_START_TOOLTIP": "Enter start",
|
||||||
|
"GUI_END_TOOLTIP": "Enter destination",
|
||||||
|
"GUI_LEGAL_NOTICE": "GUI2 v"+OSRM.VERSION+" "+OSRM.DATE+" - OSRM hosting by <a href='http://algo2.iti.kit.edu/'>KIT</a> - Geocoder by <a href='http://www.osm.org/'>OSM</a>",
|
||||||
|
// geocoder
|
||||||
|
"SEARCH_RESULTS": "Search Results",
|
||||||
|
"TIMED_OUT": "Timed Out",
|
||||||
|
"NO_RESULTS_FOUND": "No results found",
|
||||||
|
"NO_RESULTS_FOUND_SOURCE": "No results found for start",
|
||||||
|
"NO_RESULTS_FOUND_TARGET": "No results found for end",
|
||||||
|
//routing
|
||||||
|
"ROUTE_DESCRIPTION": "Route Description",
|
||||||
|
"GET_LINK_TO_ROUTE": "Generate Link",
|
||||||
|
"GENERATE_LINK_TO_ROUTE": "waiting for link",
|
||||||
|
"LINK_TO_ROUTE_TIMEOUT": "not available",
|
||||||
|
"GPX_FILE": "GPX File",
|
||||||
|
"DISTANCE": "Distance",
|
||||||
|
"DURATION": "Duration",
|
||||||
|
"YOUR_ROUTE_IS_BEING_COMPUTED": "Your route is being computed",
|
||||||
|
"NO_ROUTE_FOUND": "No route possible",
|
||||||
|
// directions
|
||||||
|
"N": "north",
|
||||||
|
"E": "east",
|
||||||
|
"S": "south",
|
||||||
|
"W": "west",
|
||||||
|
"NE": "northeast",
|
||||||
|
"SE": "southeast",
|
||||||
|
"SW": "southwest",
|
||||||
|
"NW": "northwest"
|
||||||
|
};
|
||||||
@@ -0,0 +1,151 @@
|
|||||||
|
/*
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU AFFERO General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
or see http://www.gnu.org/licenses/agpl.txt.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// OSRM map handling
|
||||||
|
// [initialization, event handling, centering relative to UI]
|
||||||
|
|
||||||
|
// will hold the map object
|
||||||
|
OSRM.GLOBALS.map = null;
|
||||||
|
|
||||||
|
|
||||||
|
// map view/model
|
||||||
|
// [extending Leaflet L.Map with setView/fitBounds methods that respect UI visibility]
|
||||||
|
OSRM.MapView = L.Map.extend({
|
||||||
|
setViewUI: function(position, zoom) {
|
||||||
|
if( OSRM.GUI.visible == true ) {
|
||||||
|
var point = OSRM.G.map.project( position, zoom);
|
||||||
|
point.x-=OSRM.GUI.width/2;
|
||||||
|
position = OSRM.G.map.unproject(point,zoom);
|
||||||
|
}
|
||||||
|
this.setView( position, zoom);
|
||||||
|
},
|
||||||
|
fitBoundsUI: function(bounds) {
|
||||||
|
var southwest = bounds.getSouthWest();
|
||||||
|
var northeast = bounds.getNorthEast();
|
||||||
|
var zoom = OSRM.G.map.getBoundsZoom(bounds);
|
||||||
|
var sw_point = OSRM.G.map.project( southwest, zoom);
|
||||||
|
if( OSRM.GUI.visible == true )
|
||||||
|
sw_point.x-=OSRM.GUI.width/2;
|
||||||
|
else
|
||||||
|
sw_point.x-=10;
|
||||||
|
sw_point.y+=10;
|
||||||
|
var ne_point = OSRM.G.map.project( northeast, zoom);
|
||||||
|
ne_point.y-=10;
|
||||||
|
sw_point.x+=10;
|
||||||
|
bounds.extend( OSRM.G.map.unproject(sw_point,zoom) );
|
||||||
|
bounds.extend( OSRM.G.map.unproject(ne_point,zoom) );
|
||||||
|
this.fitBounds( bounds );
|
||||||
|
},
|
||||||
|
getCenterUI: function(unbounded) {
|
||||||
|
var viewHalf = this.getSize();
|
||||||
|
if( OSRM.GUI.visible == true )
|
||||||
|
viewHalf.x += OSRM.GUI.width;
|
||||||
|
var centerPoint = this._getTopLeftPoint().add(viewHalf.divideBy(2));
|
||||||
|
|
||||||
|
return this.unproject(centerPoint, this._zoom, unbounded);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// map controller
|
||||||
|
// [map initialization, event handling]
|
||||||
|
OSRM.Map = {
|
||||||
|
|
||||||
|
// map initialization
|
||||||
|
init: function() {
|
||||||
|
// check if GUI is initialized!
|
||||||
|
if(OSRM.GUI.visible == null)
|
||||||
|
OSRM.GUI.init();
|
||||||
|
|
||||||
|
// setup tile servers
|
||||||
|
var osmorgURL = 'http://{s}.tile.openstreetmap.org/{z}/{x}/{y}.png',
|
||||||
|
osmorgAttribution = 'Map data © 2011 OpenStreetMap contributors, Imagery © 2011 Mapnik',
|
||||||
|
osmorgOptions = {maxZoom: 18, attribution: osmorgAttribution};
|
||||||
|
|
||||||
|
var osmdeURL = 'http://{s}.tile.openstreetmap.de/tiles/osmde/{z}/{x}/{y}.png',
|
||||||
|
osmdeAttribution = 'Map data © 2011 OpenStreetMap contributors, Imagery © 2011 Mapnik',
|
||||||
|
osmdeOptions = {maxZoom: 18, attribution: osmdeAttribution};
|
||||||
|
|
||||||
|
var mapquestURL = 'http://otile{s}.mqcdn.com/tiles/1.0.0/osm/{z}/{x}/{y}.png',
|
||||||
|
mapquestAttribution = 'Map data © 2011 OpenStreetMap contributors, Imagery © 2011 MapQuest',
|
||||||
|
mapquestOptions = {maxZoom: 18, attribution: mapquestAttribution, subdomains: '1234'};
|
||||||
|
|
||||||
|
var cloudmadeURL = 'http://{s}.tile.cloudmade.com/BC9A493B41014CAABB98F0471D759707/997/256/{z}/{x}/{y}.png',
|
||||||
|
cloudmadeAttribution = 'Map data © 2011 OpenStreetMap contributors, Imagery © 2011 CloudMade',
|
||||||
|
cloudmadeOptions = {maxZoom: 18, attribution: cloudmadeAttribution};
|
||||||
|
|
||||||
|
var osmorg = new L.TileLayer(osmorgURL, osmorgOptions),
|
||||||
|
osmde = new L.TileLayer(osmdeURL, osmdeOptions),
|
||||||
|
mapquest = new L.TileLayer(mapquestURL, mapquestOptions),
|
||||||
|
cloudmade = new L.TileLayer(cloudmadeURL, cloudmadeOptions);
|
||||||
|
|
||||||
|
// setup map
|
||||||
|
OSRM.G.map = new OSRM.MapView('map', {
|
||||||
|
center: new L.LatLng(51.505, -0.09),
|
||||||
|
zoom: 13,
|
||||||
|
zoomAnimation: false, // false: removes animations and hiding of routes during zoom
|
||||||
|
fadeAnimation: false,
|
||||||
|
layers: [osmorg]
|
||||||
|
});
|
||||||
|
|
||||||
|
// add tileservers
|
||||||
|
var baseMaps = {
|
||||||
|
"osm.org": osmorg,
|
||||||
|
"osm.de": osmde,
|
||||||
|
"MapQuest": mapquest,
|
||||||
|
"CloudMade": cloudmade
|
||||||
|
};
|
||||||
|
|
||||||
|
var overlayMaps = {};
|
||||||
|
var layersControl = new L.Control.Layers(baseMaps, overlayMaps);
|
||||||
|
OSRM.G.map.addControl(layersControl);
|
||||||
|
|
||||||
|
// move zoom markers
|
||||||
|
getElementsByClassName(document,'leaflet-control-zoom')[0].style.left=(OSRM.GUI.width+10)+"px";
|
||||||
|
getElementsByClassName(document,'leaflet-control-zoom')[0].style.top="5px";
|
||||||
|
|
||||||
|
// initial map position and zoom
|
||||||
|
var position = new L.LatLng( OSRM.DEFAULTS.ONLOAD_LATITUDE, OSRM.DEFAULTS.ONLOAD_LONGITUDE);
|
||||||
|
OSRM.G.map.setViewUI( position, OSRM.DEFAULTS.ZOOM_LEVEL);
|
||||||
|
|
||||||
|
// map events
|
||||||
|
OSRM.G.map.on('zoomend', OSRM.Map.zoomed );
|
||||||
|
OSRM.G.map.on('click', OSRM.Map.click );
|
||||||
|
OSRM.G.map.on('contextmenu', OSRM.Map.contextmenu );
|
||||||
|
OSRM.G.map.on('mousemove', OSRM.Map.mousemove );
|
||||||
|
},
|
||||||
|
|
||||||
|
// map event handlers
|
||||||
|
zoomed: function(e) { OSRM.Routing.getRoute(); },
|
||||||
|
contextmenu: function(e) {;},
|
||||||
|
mousemove: function(e) { OSRM.Via.drawDragMarker(e); },
|
||||||
|
click: function(e) {
|
||||||
|
if( !OSRM.G.markers.hasSource() ) {
|
||||||
|
var index = OSRM.G.markers.setSource( e.latlng );
|
||||||
|
OSRM.Geocoder.updateAddress( OSRM.C.SOURCE_LABEL, OSRM.C.DO_FALLBACK_TO_LAT_LNG );
|
||||||
|
OSRM.G.markers.route[index].show();
|
||||||
|
OSRM.G.markers.route[index].centerView( OSRM.G.map.getZoom() );
|
||||||
|
OSRM.Routing.getRoute();
|
||||||
|
} else if( !OSRM.G.markers.hasTarget() ) {
|
||||||
|
var index = OSRM.G.markers.setTarget( e.latlng );
|
||||||
|
OSRM.Geocoder.updateAddress( OSRM.C.TARGET_LABEL, OSRM.C.DO_FALLBACK_TO_LAT_LNG );
|
||||||
|
OSRM.G.markers.route[index].show();
|
||||||
|
OSRM.G.markers.route[index].centerView( OSRM.G.map.getZoom() );
|
||||||
|
OSRM.Routing.getRoute();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -0,0 +1,245 @@
|
|||||||
|
/*
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU AFFERO General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
or see http://www.gnu.org/licenses/agpl.txt.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// OSRM markers
|
||||||
|
// [base marker class, derived highlight marker and route marker classes, marker management]
|
||||||
|
|
||||||
|
|
||||||
|
// base marker class (wraps Leaflet markers)
|
||||||
|
OSRM.Marker = function( label, style, position ) {
|
||||||
|
this.label = label ? label : "marker";
|
||||||
|
this.position = position ? position : new L.LatLng(0,0);
|
||||||
|
|
||||||
|
this.marker = new L.MouseMarker( this.position, style );
|
||||||
|
this.marker.parent = this;
|
||||||
|
|
||||||
|
this.shown = false;
|
||||||
|
this.hint = null;
|
||||||
|
};
|
||||||
|
OSRM.extend( OSRM.Marker,{
|
||||||
|
show: function() {
|
||||||
|
OSRM.G.map.addLayer(this.marker);
|
||||||
|
this.shown = true;
|
||||||
|
},
|
||||||
|
hide: function() {
|
||||||
|
OSRM.G.map.removeLayer(this.marker);
|
||||||
|
this.shown = false;
|
||||||
|
},
|
||||||
|
setPosition: function( position ) {
|
||||||
|
this.position = position;
|
||||||
|
this.marker.setLatLng( position );
|
||||||
|
this.hint = null;
|
||||||
|
},
|
||||||
|
getPosition: function() {
|
||||||
|
return this.position;
|
||||||
|
},
|
||||||
|
getLat: function() {
|
||||||
|
return this.position.lat;
|
||||||
|
},
|
||||||
|
getLng: function() {
|
||||||
|
return this.position.lng;
|
||||||
|
},
|
||||||
|
isShown: function() {
|
||||||
|
return this.shown;
|
||||||
|
},
|
||||||
|
centerView: function(zoom) {
|
||||||
|
if( zoom == undefined )
|
||||||
|
zoom = OSRM.DEFAULTS.ZOOM_LEVEL;
|
||||||
|
OSRM.G.map.setViewUI( this.position, zoom );
|
||||||
|
},
|
||||||
|
toString: function() {
|
||||||
|
return "OSRM.Marker: \""+this.label+"\", "+this.position+")";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// route marker class (draggable, invokes route drawing routines)
|
||||||
|
OSRM.RouteMarker = function ( label, style, position ) {
|
||||||
|
style.baseicon = style.icon;
|
||||||
|
OSRM.RouteMarker.prototype.base.constructor.apply( this, arguments );
|
||||||
|
this.label = label ? label : "route_marker";
|
||||||
|
|
||||||
|
this.marker.on( 'click', this.onClick );
|
||||||
|
this.marker.on( 'drag', this.onDrag );
|
||||||
|
this.marker.on( 'dragstart', this.onDragStart );
|
||||||
|
this.marker.on( 'dragend', this.onDragEnd );
|
||||||
|
};
|
||||||
|
OSRM.inheritFrom( OSRM.RouteMarker, OSRM.Marker );
|
||||||
|
OSRM.extend( OSRM.RouteMarker, {
|
||||||
|
onClick: function(e) {
|
||||||
|
for( var i=0; i<OSRM.G.markers.route.length; i++) {
|
||||||
|
if( OSRM.G.markers.route[i].marker === this ) {
|
||||||
|
OSRM.G.markers.removeMarker( i );
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
OSRM.Routing.getRoute();
|
||||||
|
OSRM.G.markers.highlight.hide();
|
||||||
|
},
|
||||||
|
onDrag: function(e) {
|
||||||
|
this.parent.setPosition( e.target.getLatLng() );
|
||||||
|
if(OSRM.G.markers.route.length>1)
|
||||||
|
OSRM.Routing.getDragRoute();
|
||||||
|
OSRM.Geocoder.updateLocation( this.parent.label );
|
||||||
|
},
|
||||||
|
onDragStart: function(e) {
|
||||||
|
OSRM.G.dragging = true;
|
||||||
|
this.switchIcon(this.options.dragicon);
|
||||||
|
|
||||||
|
// store id of dragged marker
|
||||||
|
for( var i=0; i<OSRM.G.markers.route.length; i++)
|
||||||
|
if( OSRM.G.markers.route[i].marker === this ) {
|
||||||
|
OSRM.G.dragid = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( this.parent != OSRM.G.markers.highlight)
|
||||||
|
OSRM.G.markers.highlight.hide();
|
||||||
|
if (OSRM.G.route.isShown())
|
||||||
|
OSRM.G.route.showOldRoute();
|
||||||
|
},
|
||||||
|
onDragEnd: function(e) {
|
||||||
|
OSRM.G.dragging = false;
|
||||||
|
this.switchIcon(this.options.baseicon);
|
||||||
|
|
||||||
|
this.parent.setPosition( e.target.getLatLng() );
|
||||||
|
OSRM.Routing.getRoute();
|
||||||
|
if (OSRM.G.route.isShown()) {
|
||||||
|
OSRM.G.route.hideOldRoute();
|
||||||
|
OSRM.G.route.hideUnnamedRoute();
|
||||||
|
}
|
||||||
|
|
||||||
|
if(OSRM.G.route.isShown()==false)
|
||||||
|
OSRM.Geocoder.updateAddress(this.parent.label);
|
||||||
|
},
|
||||||
|
toString: function() {
|
||||||
|
return "OSRM.RouteMarker: \""+this.label+"\", "+this.position+")";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
//drag marker class (draggable, invokes route drawing routines)
|
||||||
|
OSRM.DragMarker = function ( label, style, position ) {
|
||||||
|
OSRM.DragMarker.prototype.base.constructor.apply( this, arguments );
|
||||||
|
this.label = label ? label : "drag_marker";
|
||||||
|
};
|
||||||
|
OSRM.inheritFrom( OSRM.DragMarker, OSRM.RouteMarker );
|
||||||
|
OSRM.extend( OSRM.DragMarker, {
|
||||||
|
onClick: function(e) {
|
||||||
|
this.parent.hide();
|
||||||
|
},
|
||||||
|
onDragStart: function(e) {
|
||||||
|
var new_via_index = OSRM.Via.findViaIndex( e.target.getLatLng() );
|
||||||
|
OSRM.G.markers.route.splice(new_via_index+1,0, this.parent );
|
||||||
|
|
||||||
|
OSRM.RouteMarker.prototype.onDragStart.call(this,e);
|
||||||
|
},
|
||||||
|
onDragEnd: function(e) {
|
||||||
|
OSRM.G.markers.route[OSRM.G.dragid] = new OSRM.RouteMarker(OSRM.C.VIA_LABEL, {draggable:true,icon:OSRM.G.icons['marker-via'],dragicon:OSRM.G.icons['marker-via-drag']}, e.target.getLatLng() );
|
||||||
|
OSRM.G.markers.route[OSRM.G.dragid].show();
|
||||||
|
|
||||||
|
OSRM.RouteMarker.prototype.onDragEnd.call(this,e);
|
||||||
|
this.parent.hide();
|
||||||
|
},
|
||||||
|
toString: function() {
|
||||||
|
return "OSRM.DragMarker: \""+this.label+"\", "+this.position+")";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// marker management class (all route markers should only be set and deleted with these routines!)
|
||||||
|
// [this holds the vital information of the route]
|
||||||
|
OSRM.Markers = function() {
|
||||||
|
this.route = new Array();
|
||||||
|
this.highlight = new OSRM.DragMarker("highlight", {draggable:true,icon:OSRM.G.icons['marker-highlight'],dragicon:OSRM.G.icons['marker-highlight-drag']});;
|
||||||
|
this.dragger = new OSRM.DragMarker("drag", {draggable:true,icon:OSRM.G.icons['marker-drag'],dragicon:OSRM.G.icons['marker-drag']});;
|
||||||
|
};
|
||||||
|
OSRM.extend( OSRM.Markers,{
|
||||||
|
removeAll: function() {
|
||||||
|
for(var i=0; i<this.route.length;i++)
|
||||||
|
this.route[i].hide();
|
||||||
|
this.route.splice(0, this.route.length);
|
||||||
|
document.getElementById('delete-source-marker').style.visibility = "hidden";
|
||||||
|
document.getElementById('delete-target-marker').style.visibility = "hidden";
|
||||||
|
},
|
||||||
|
removeVias: function() {
|
||||||
|
// assert correct route array s - v - t
|
||||||
|
for(var i=1; i<this.route.length-1;i++)
|
||||||
|
this.route[i].hide();
|
||||||
|
this.route.splice(1, this.route.length-2);
|
||||||
|
},
|
||||||
|
setSource: function(position) {
|
||||||
|
// source node is always first node
|
||||||
|
if( this.route[0] && this.route[0].label == OSRM.C.SOURCE_LABEL )
|
||||||
|
this.route[0].setPosition(position);
|
||||||
|
else
|
||||||
|
this.route.splice(0,0, new OSRM.RouteMarker(OSRM.C.SOURCE_LABEL, {draggable:true,icon:OSRM.G.icons['marker-source'],dragicon:OSRM.G.icons['marker-source-drag']}, position));
|
||||||
|
document.getElementById('delete-source-marker').style.visibility = "visible";
|
||||||
|
return 0;
|
||||||
|
},
|
||||||
|
setTarget: function(position) {
|
||||||
|
// target node is always last node
|
||||||
|
if( this.route[this.route.length-1] && this.route[ this.route.length-1 ].label == OSRM.C.TARGET_LABEL )
|
||||||
|
this.route[this.route.length-1].setPosition(position);
|
||||||
|
else
|
||||||
|
this.route.splice( this.route.length,0, new OSRM.RouteMarker(OSRM.C.TARGET_LABEL, {draggable:true,icon:OSRM.G.icons['marker-target'],dragicon:OSRM.G.icons['marker-target-drag']}, position));
|
||||||
|
document.getElementById('delete-target-marker').style.visibility = "visible";
|
||||||
|
return this.route.length-1;
|
||||||
|
},
|
||||||
|
setVia: function(id, position) {
|
||||||
|
// via nodes only between source and target nodes
|
||||||
|
if( this.route.length<2 || id > this.route.length-2 )
|
||||||
|
return -1;
|
||||||
|
|
||||||
|
this.route.splice(id+1,0, new OSRM.RouteMarker(OSRM.C.VIA_LABEL, {draggable:true,icon:OSRM.G.icons['marker-via'],dragicon:OSRM.G.icons['marker-via-drag']}, position));
|
||||||
|
return id+1;
|
||||||
|
},
|
||||||
|
removeMarker: function(id) {
|
||||||
|
if( id >= this.route.length )
|
||||||
|
return;
|
||||||
|
|
||||||
|
// also remove vias if source or target are removed
|
||||||
|
if( id==0 && this.route[0].label == OSRM.C.SOURCE_LABEL ) {
|
||||||
|
this.removeVias();
|
||||||
|
document.getElementById('input-source-name').value = "";
|
||||||
|
document.getElementById('information-box').innerHTML = "";
|
||||||
|
document.getElementById('information-box-headline').innerHTML = "";
|
||||||
|
document.getElementById('delete-source-marker').style.visibility = "hidden";
|
||||||
|
} else if( id == this.route.length-1 && this.route[ this.route.length-1 ].label == OSRM.C.TARGET_LABEL ) {
|
||||||
|
this.removeVias();
|
||||||
|
id = this.route.length-1;
|
||||||
|
document.getElementById('input-target-name').value = "";
|
||||||
|
document.getElementById('information-box').innerHTML = "";
|
||||||
|
document.getElementById('information-box-headline').innerHTML = "";
|
||||||
|
document.getElementById('delete-target-marker').style.visibility = "hidden";
|
||||||
|
}
|
||||||
|
|
||||||
|
this.route[id].hide();
|
||||||
|
this.route.splice(id, 1);
|
||||||
|
},
|
||||||
|
hasSource: function() {
|
||||||
|
if( OSRM.G.markers.route[0] && OSRM.G.markers.route[0].label == OSRM.C.SOURCE_LABEL )
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
hasTarget: function() {
|
||||||
|
if( OSRM.G.markers.route[OSRM.G.markers.route.length-1] && OSRM.G.markers.route[OSRM.G.markers.route.length-1].label == OSRM.C.TARGET_LABEL )
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
});
|
||||||
@@ -0,0 +1,193 @@
|
|||||||
|
/*
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU AFFERO General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
or see http://www.gnu.org/licenses/agpl.txt.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// OSRM routes
|
||||||
|
// [drawing of all types of route geometry]
|
||||||
|
|
||||||
|
|
||||||
|
// simple route class (wraps Leaflet Polyline)
|
||||||
|
OSRM.SimpleRoute = function (label, style) {
|
||||||
|
this.label = (label ? label : "route");
|
||||||
|
this.route = new L.DashedPolyline();
|
||||||
|
this.route.setLatLngs( [] );
|
||||||
|
if(style) this.route.setStyle( style );
|
||||||
|
|
||||||
|
this.shown = false;
|
||||||
|
};
|
||||||
|
OSRM.extend( OSRM.SimpleRoute,{
|
||||||
|
show: function() {
|
||||||
|
OSRM.G.map.addLayer(this.route);
|
||||||
|
this.shown = true;
|
||||||
|
},
|
||||||
|
hide: function() {
|
||||||
|
OSRM.G.map.removeLayer(this.route);
|
||||||
|
this.shown = false;
|
||||||
|
},
|
||||||
|
isShown: function() {
|
||||||
|
return this.shown;
|
||||||
|
},
|
||||||
|
getPoints: function() {
|
||||||
|
return this.route._originalPoints;
|
||||||
|
},
|
||||||
|
getPositions: function() {
|
||||||
|
return this.route.getLatLngs();
|
||||||
|
},
|
||||||
|
setPositions: function(positions) {
|
||||||
|
this.route.setLatLngs( positions );
|
||||||
|
},
|
||||||
|
setStyle: function(style) {
|
||||||
|
this.route.setStyle(style);
|
||||||
|
},
|
||||||
|
centerView: function() {
|
||||||
|
var bounds = new L.LatLngBounds( this.getPositions() );
|
||||||
|
OSRM.g.map.fitBoundsUI( bounds );
|
||||||
|
},
|
||||||
|
toString: function() {
|
||||||
|
return "OSRM.Route("+ this.label + ", " + this.route.getLatLngs().length + " points)";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// multiroute class (wraps Leaflet LayerGroup to hold several disjoint routes)
|
||||||
|
OSRM.MultiRoute = function (label) {
|
||||||
|
this.label = (label ? label : "multiroute");
|
||||||
|
this.route = new L.LayerGroup();
|
||||||
|
|
||||||
|
this.shown = false;
|
||||||
|
};
|
||||||
|
OSRM.extend( OSRM.MultiRoute,{
|
||||||
|
show: function() {
|
||||||
|
OSRM.G.map.addLayer(this.route);
|
||||||
|
this.shown = true;
|
||||||
|
},
|
||||||
|
hide: function() {
|
||||||
|
OSRM.G.map.removeLayer(this.route);
|
||||||
|
this.shown = false;
|
||||||
|
},
|
||||||
|
isShown: function() {
|
||||||
|
return this.shown;
|
||||||
|
},
|
||||||
|
addRoute: function(positions) {
|
||||||
|
var line = new L.DashedPolyline( positions );
|
||||||
|
line.on('click', function(e) { OSRM.G.route.fire('click',e); });
|
||||||
|
this.route.addLayer( line );
|
||||||
|
},
|
||||||
|
clearRoutes: function() {
|
||||||
|
this.route.clearLayers();
|
||||||
|
},
|
||||||
|
setStyle: function(style) {
|
||||||
|
this.route.invoke('setStyle', style);
|
||||||
|
},
|
||||||
|
toString: function() {
|
||||||
|
return "OSRM.MultiRoute("+ this.label + ")";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
// route management (handles drawing of route geometry - current route, old route, unnamed route, highlight unnamed streets)
|
||||||
|
// [this holds the route geometry]
|
||||||
|
OSRM.Route = function() {
|
||||||
|
this._current_route = new OSRM.SimpleRoute("current" , {dashed:false} );
|
||||||
|
this._old_route = new OSRM.SimpleRoute("old", {dashed:false,color:"#123"} );
|
||||||
|
this._unnamed_route = new OSRM.MultiRoute("unnamed");
|
||||||
|
|
||||||
|
this._current_route_style = {dashed:false,color:'#0033FF', weight:5};
|
||||||
|
this._current_noroute_style = {dashed:true, color:'#222222', weight:2};
|
||||||
|
this._old_route_style = {dashed:false,color:'#112233', weight:5};
|
||||||
|
this._old_noroute_style = {dashed:true, color:'#000000', weight:2};
|
||||||
|
this._unnamed_route_style = {dashed:false, color:'#FF00FF', weight:10};
|
||||||
|
this._old_unnamed_route_style = {dashed:false, color:'#990099', weight:10};
|
||||||
|
|
||||||
|
this._noroute = OSRM.Route.ROUTE;
|
||||||
|
};
|
||||||
|
OSRM.Route.NOROUTE = true;
|
||||||
|
OSRM.Route.ROUTE = false;
|
||||||
|
OSRM.extend( OSRM.Route,{
|
||||||
|
|
||||||
|
showRoute: function(positions, noroute) {
|
||||||
|
this._noroute = noroute;
|
||||||
|
this._current_route.setPositions( positions );
|
||||||
|
if ( this._noroute == OSRM.Route.NOROUTE )
|
||||||
|
this._current_route.setStyle( this._current_noroute_style );
|
||||||
|
else
|
||||||
|
this._current_route.setStyle( this._current_route_style );
|
||||||
|
this._current_route.show();
|
||||||
|
//this._raiseUnnamedRoute();
|
||||||
|
},
|
||||||
|
hideRoute: function() {
|
||||||
|
this._current_route.hide();
|
||||||
|
this._unnamed_route.hide();
|
||||||
|
},
|
||||||
|
hideAll: function() {
|
||||||
|
this._current_route.hide();
|
||||||
|
this._unnamed_route.hide();
|
||||||
|
this._old_route.hide();
|
||||||
|
this._noroute = OSRM.Route.ROUTE;
|
||||||
|
},
|
||||||
|
|
||||||
|
showUnnamedRoute: function(positions) {
|
||||||
|
this._unnamed_route.clearRoutes();
|
||||||
|
for(var i=0; i<positions.length; i++) {
|
||||||
|
this._unnamed_route.addRoute(positions[i]);
|
||||||
|
}
|
||||||
|
this._unnamed_route.setStyle( this._unnamed_route_style );
|
||||||
|
this._unnamed_route.show();
|
||||||
|
},
|
||||||
|
hideUnnamedRoute: function() {
|
||||||
|
this._unnamed_route.hide();
|
||||||
|
},
|
||||||
|
// TODO: hack to put unnamed_route above old_route -> easier way in will be available Leaflet 0.4
|
||||||
|
_raiseUnnamedRoute: function() {
|
||||||
|
if(this._unnamed_route.isShown()) {
|
||||||
|
this._unnamed_route.hide();
|
||||||
|
this._unnamed_route.show();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
showOldRoute: function() {
|
||||||
|
this._old_route.setPositions( this._current_route.getPositions() );
|
||||||
|
if ( this._noroute == OSRM.Route.NOROUTE)
|
||||||
|
this._old_route.setStyle( this._old_noroute_style );
|
||||||
|
else
|
||||||
|
this._old_route.setStyle( this._old_route_style );
|
||||||
|
this._old_route.show();
|
||||||
|
this._raiseUnnamedRoute();
|
||||||
|
// change color of unnamed route highlighting - no separate object as dragged route does not have unnamed route highlighting
|
||||||
|
this._unnamed_route.setStyle( this._old_unnamed_route_style );
|
||||||
|
},
|
||||||
|
hideOldRoute: function() {
|
||||||
|
this._old_route.hide();
|
||||||
|
},
|
||||||
|
|
||||||
|
isShown: function() {
|
||||||
|
return this._current_route.isShown();
|
||||||
|
},
|
||||||
|
isRoute: function() {
|
||||||
|
return !(this._noroute);
|
||||||
|
},
|
||||||
|
getPositions: function() {
|
||||||
|
return this._current_route.getPositions();
|
||||||
|
},
|
||||||
|
getPoints: function() {
|
||||||
|
return this._current_route.getPoints();
|
||||||
|
},
|
||||||
|
fire: function(type,event) {
|
||||||
|
this._current_route.route.fire(type,event);
|
||||||
|
},
|
||||||
|
centerView: function() {
|
||||||
|
this._current_route.centerView();
|
||||||
|
}
|
||||||
|
});
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
/*
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU AFFERO General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
or see http://www.gnu.org/licenses/agpl.txt.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// OSRM utility functions
|
||||||
|
// [mixed functions]
|
||||||
|
|
||||||
|
|
||||||
|
OSRM.Utils = {
|
||||||
|
|
||||||
|
// [human readabilty functions]
|
||||||
|
|
||||||
|
// human readable time
|
||||||
|
secondsToTime: function(seconds){
|
||||||
|
seconds = parseInt(seconds);
|
||||||
|
minutes = parseInt(seconds/60);
|
||||||
|
seconds = seconds%60;
|
||||||
|
hours = parseInt(minutes/60);
|
||||||
|
minutes = minutes%60;
|
||||||
|
if(hours==0){
|
||||||
|
return minutes + ' ' + 'min';
|
||||||
|
}
|
||||||
|
else{
|
||||||
|
return hours + ' ' + 'h' + ' ' + minutes + ' ' + 'min';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
//human readable distance
|
||||||
|
metersToDistance: function(distance){
|
||||||
|
distance = parseInt(distance);
|
||||||
|
|
||||||
|
if(distance >= 100000){ return (parseInt(distance/1000))+' ' + 'km'; }
|
||||||
|
else if(distance >= 10000){ return (parseInt(distance/1000).toFixed(1))+' ' + 'km'; }
|
||||||
|
else if(distance >= 1000){ return (parseFloat(distance/1000).toFixed(2))+' ' + 'km'; }
|
||||||
|
else{ return distance+' ' + 'm'; }
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
// [verification routines]
|
||||||
|
|
||||||
|
// verify angles
|
||||||
|
isLatitude: function(value) {
|
||||||
|
if( value >=-90 && value <=90)
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
isLongitude: function(value) {
|
||||||
|
if( value >=-180 && value <=180)
|
||||||
|
return true;
|
||||||
|
else
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
@@ -0,0 +1,121 @@
|
|||||||
|
/*
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU AFFERO General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
or see http://www.gnu.org/licenses/agpl.txt.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// OSRM via marker routines
|
||||||
|
// [find correct position for a via marker]
|
||||||
|
|
||||||
|
// store location of via points returned by server
|
||||||
|
OSRM.GLOBALS.via_points = null;
|
||||||
|
|
||||||
|
|
||||||
|
OSRM.Via = {
|
||||||
|
|
||||||
|
// find route segment of current route geometry that is closest to the new via node (marked by index of its endpoint)
|
||||||
|
_findNearestRouteSegment: function( new_via ) {
|
||||||
|
var min_dist = Number.MAX_VALUE;
|
||||||
|
var min_index = undefined;
|
||||||
|
|
||||||
|
var p = OSRM.G.map.latLngToLayerPoint( new_via );
|
||||||
|
var positions = OSRM.G.route.getPoints();
|
||||||
|
for(var i=1; i<positions.length; i++) {
|
||||||
|
var _sqDist = L.LineUtil._sqClosestPointOnSegment(p, positions[i-1], positions[i], true);
|
||||||
|
if( _sqDist < min_dist) {
|
||||||
|
min_dist = _sqDist;
|
||||||
|
min_index = i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return min_index;
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
// find the correct index among all via nodes to insert the new via node, and insert it
|
||||||
|
findViaIndex: function( new_via_position ) {
|
||||||
|
// find route segment that is closest to click position (marked by last index)
|
||||||
|
var nearest_index = OSRM.Via._findNearestRouteSegment( new_via_position );
|
||||||
|
|
||||||
|
// find correct index to insert new via node
|
||||||
|
var new_via_index = OSRM.G.via_points.length;
|
||||||
|
var via_index = Array();
|
||||||
|
for(var i=0; i<OSRM.G.via_points.length; i++) {
|
||||||
|
via_index[i] = OSRM.Via._findNearestRouteSegment( new L.LatLng(OSRM.G.via_points[i][0], OSRM.G.via_points[i][1]) );
|
||||||
|
if(via_index[i] > nearest_index) {
|
||||||
|
new_via_index = i;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// add via node
|
||||||
|
return new_via_index;
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
//function that draws a drag marker
|
||||||
|
dragTimer: new Date(),
|
||||||
|
|
||||||
|
drawDragMarker: function(event) {
|
||||||
|
if( OSRM.G.route.isShown() == false)
|
||||||
|
return;
|
||||||
|
if( OSRM.G.dragging == true )
|
||||||
|
return;
|
||||||
|
|
||||||
|
// throttle computation
|
||||||
|
if( (new Date() - OSRM.Via.dragTimer) < 25 )
|
||||||
|
return;
|
||||||
|
OSRM.Via.dragTimer = new Date();
|
||||||
|
|
||||||
|
// get distance to route
|
||||||
|
var minpoint = OSRM.G.route._current_route.route.closestLayerPoint( event.layerPoint );
|
||||||
|
var min_dist = minpoint._sqDist;
|
||||||
|
|
||||||
|
// get distance to markers
|
||||||
|
var mouse = event.latlng;
|
||||||
|
for(var i=0, size=OSRM.G.markers.route.length; i<size; i++) {
|
||||||
|
if(OSRM.G.markers.route[i].label=='drag')
|
||||||
|
continue;
|
||||||
|
var position = OSRM.G.markers.route[i].getPosition();
|
||||||
|
var dist = OSRM.G.map.project(mouse).distanceTo(OSRM.G.map.project(position));
|
||||||
|
if( dist < 20 )
|
||||||
|
min_dist = 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
// check whether mouse is over another marker
|
||||||
|
var pos = OSRM.G.map.layerPointToContainerPoint(event.layerPoint);
|
||||||
|
var obj = document.elementFromPoint(pos.x,pos.y);
|
||||||
|
for(var i=0, size=OSRM.G.markers.route.length; i<size; i++) {
|
||||||
|
if(OSRM.G.markers.route[i].label=='drag')
|
||||||
|
continue;
|
||||||
|
if( obj == OSRM.G.markers.route[i].marker._icon)
|
||||||
|
min_dist = 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
// special care for highlight marker
|
||||||
|
if( OSRM.G.markers.highlight.isShown() ) {
|
||||||
|
if( OSRM.G.map.project(mouse).distanceTo(OSRM.G.map.project( OSRM.G.markers.highlight.getPosition() ) ) < 20 )
|
||||||
|
min_dist = 1000;
|
||||||
|
else if( obj == OSRM.G.markers.highlight.marker._icon)
|
||||||
|
min_dist = 1000;
|
||||||
|
}
|
||||||
|
|
||||||
|
if( min_dist < 400) {
|
||||||
|
OSRM.G.markers.dragger.setPosition( OSRM.G.map.layerPointToLatLng(minpoint) );
|
||||||
|
OSRM.G.markers.dragger.show();
|
||||||
|
} else
|
||||||
|
OSRM.G.markers.dragger.hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
/*
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU AFFERO General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
or see http://www.gnu.org/licenses/agpl.txt.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// OSRM base class
|
||||||
|
// [has to be loaded before all other OSRM classes]
|
||||||
|
|
||||||
|
var OSRM = {};
|
||||||
|
OSRM.VERSION = '0.1.3';
|
||||||
|
OSRM.DATE = '120402';
|
||||||
|
OSRM.CONSTANTS = {};
|
||||||
|
OSRM.DEFAULTS = {};
|
||||||
|
OSRM.GLOBALS = {};
|
||||||
|
OSRM.G = OSRM.GLOBALS; // abbreviations
|
||||||
|
OSRM.C = OSRM.CONSTANTS;
|
||||||
|
|
||||||
|
|
||||||
|
// declare one class to be a subclass of another class
|
||||||
|
// (runs anonymous function to prevent local functions cluttering global namespace)
|
||||||
|
(function() {
|
||||||
|
var _inheritFromHelper = function() {};
|
||||||
|
OSRM.inheritFrom = function( sub_class, base_class ) {
|
||||||
|
_inheritFromHelper.prototype = base_class.prototype;
|
||||||
|
sub_class.prototype = new _inheritFromHelper();
|
||||||
|
sub_class.prototype.constructor = sub_class;
|
||||||
|
sub_class.prototype.base = base_class.prototype;
|
||||||
|
};
|
||||||
|
}());
|
||||||
|
|
||||||
|
|
||||||
|
// extend prototypes of a class -> used to add member values and functions
|
||||||
|
OSRM.extend = function( target_class, properties ) {
|
||||||
|
for( property in properties ) {
|
||||||
|
target_class.prototype[property] = properties[property];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// [usage of convenience functions]
|
||||||
|
// SubClass = function() {
|
||||||
|
// SubClass.prototype.base.constructor.apply(this, arguments);
|
||||||
|
// }
|
||||||
|
// OSRM.inheritFrom( SubClass, BaseClass );
|
||||||
|
// OSRM.extend( SubClass, { property:value } );
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
/*
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU AFFERO General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
or see http://www.gnu.org/licenses/agpl.txt.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// OSRM config file
|
||||||
|
// [has to be loaded directly after OSRM.base]
|
||||||
|
|
||||||
|
OSRM.DEFAULTS = {
|
||||||
|
HOST_ROUTING_URL: 'http://router.project-osrm.org/viaroute',
|
||||||
|
HOST_SHORTENER_URL: 'http://map.project-osrm.org/shorten/',
|
||||||
|
HOST_GEOCODER_URL: 'http://nominatim.openstreetmap.org/search',
|
||||||
|
HOST_REVERSE_GEOCODER_URL: 'http://nominatim.openstreetmap.org/reverse',
|
||||||
|
WEBSITE_URL: document.URL.replace(/#*(\?.*|$)/i,""), // truncates URL before first ?, and removes tailing #
|
||||||
|
JSONP_TIMEOUT: 5000,
|
||||||
|
ZOOM_LEVEL: 14,
|
||||||
|
ONLOAD_LATITUDE: 48.84,
|
||||||
|
ONLOAD_LONGITUDE: 10.10,
|
||||||
|
ONLOAD_SOURCE: "",
|
||||||
|
ONLOAD_TARGET: "",
|
||||||
|
HIGHLIGHT_ZOOM_LEVEL: 16,
|
||||||
|
LANGUAGE: "en",
|
||||||
|
GEOCODER_BOUNDS: '&bounded=1&viewbox=-27.0,72.0,46.0,36.0'
|
||||||
|
};
|
||||||
@@ -0,0 +1,66 @@
|
|||||||
|
/*
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU AFFERO General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
or see http://www.gnu.org/licenses/agpl.txt.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// debug code for OSRM
|
||||||
|
// [works better than console.log in older browsers and for logging event handling]
|
||||||
|
|
||||||
|
OSRM.debug = {};
|
||||||
|
|
||||||
|
|
||||||
|
// access functions
|
||||||
|
OSRM.debug.log = function(text) {
|
||||||
|
OSRM.debug.content.innerHTML += text + "<hr style='border:none; margin:2px; height:1px; color:#F0F0F0; background:#F0F0F0;'/>";
|
||||||
|
OSRM.debug.content.scrollTop = OSRM.debug.content.scrollHeight;
|
||||||
|
};
|
||||||
|
OSRM.debug.clear = function() {
|
||||||
|
OSRM.debug.content.innerHTML = "";
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// add elements to DOM
|
||||||
|
OSRM.debug.init = function() {
|
||||||
|
//create DOM objects for debug output
|
||||||
|
var wrapper = document.createElement('div');
|
||||||
|
wrapper.id = "OSRM.debug-wrapper";
|
||||||
|
wrapper.className = "gui-wrapper";
|
||||||
|
wrapper.style.cssText = "width:410px;height:95%;top:5px;right:50px;";
|
||||||
|
|
||||||
|
var box = document.createElement('div');
|
||||||
|
box.id = "OSRM.debug-box";
|
||||||
|
box.className = "gui-box";
|
||||||
|
box.style.cssText = "width:390px;top:0px;bottom:0px;";
|
||||||
|
|
||||||
|
var clear = document.createElement('a');
|
||||||
|
clear.id = "OSRM.debug-clear";
|
||||||
|
clear.className = "button not-selectable";
|
||||||
|
clear.innerHTML = "clear";
|
||||||
|
clear.onclick = OSRM.debug.clear;
|
||||||
|
|
||||||
|
OSRM.debug.content= document.createElement('div');
|
||||||
|
OSRM.debug.content.id = "OSRM.debug-content";
|
||||||
|
OSRM.debug.content.style.cssText = "position:absolute;bottom:0px;top:20px;width:380px;font-size:11px;overflow:auto;margin:5px;";
|
||||||
|
|
||||||
|
// add elements
|
||||||
|
document.body.appendChild(wrapper);
|
||||||
|
wrapper.appendChild(box);
|
||||||
|
box.appendChild(clear);
|
||||||
|
box.appendChild(OSRM.debug.content);
|
||||||
|
};
|
||||||
|
if(document.addEventListener) // FF, CH
|
||||||
|
document.addEventListener("DOMContentLoaded", OSRM.debug.init, false);
|
||||||
|
else // IE
|
||||||
|
OSRM.debug.init();
|
||||||
|
After Width: | Height: | Size: 402 B |
|
After Width: | Height: | Size: 484 B |
|
After Width: | Height: | Size: 483 B |
|
After Width: | Height: | Size: 414 B |
|
After Width: | Height: | Size: 240 B |
|
After Width: | Height: | Size: 462 B |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 10 KiB |
|
After Width: | Height: | Size: 477 B |
|
After Width: | Height: | Size: 480 B |
|
After Width: | Height: | Size: 488 B |
|
After Width: | Height: | Size: 716 B |
|
After Width: | Height: | Size: 617 B |
|
After Width: | Height: | Size: 530 B |
|
After Width: | Height: | Size: 746 B |
|
After Width: | Height: | Size: 635 B |
|
After Width: | Height: | Size: 607 B |
|
After Width: | Height: | Size: 489 B |
|
After Width: | Height: | Size: 676 B |
|
After Width: | Height: | Size: 656 B |
|
After Width: | Height: | Size: 778 B |
|
After Width: | Height: | Size: 3.6 KiB |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 2.5 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 963 B |
|
After Width: | Height: | Size: 959 B |
@@ -0,0 +1,323 @@
|
|||||||
|
/* required styles */
|
||||||
|
|
||||||
|
.leaflet-map-pane,
|
||||||
|
.leaflet-tile,
|
||||||
|
.leaflet-marker-icon,
|
||||||
|
.leaflet-marker-shadow,
|
||||||
|
.leaflet-tile-pane,
|
||||||
|
.leaflet-overlay-pane,
|
||||||
|
.leaflet-shadow-pane,
|
||||||
|
.leaflet-marker-pane,
|
||||||
|
.leaflet-popup-pane,
|
||||||
|
.leaflet-overlay-pane svg,
|
||||||
|
.leaflet-zoom-box,
|
||||||
|
.leaflet-image-layer { /* TODO optimize classes */
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
.leaflet-container {
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
.leaflet-tile-pane, .leaflet-container {
|
||||||
|
-webkit-transform: translate3d(0,0,0);
|
||||||
|
}
|
||||||
|
.leaflet-tile,
|
||||||
|
.leaflet-marker-icon,
|
||||||
|
.leaflet-marker-shadow {
|
||||||
|
-moz-user-select: none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
.leaflet-marker-icon,
|
||||||
|
.leaflet-marker-shadow {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
.leaflet-clickable {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
.leaflet-container img {
|
||||||
|
max-width: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.leaflet-tile-pane { z-index: 2; }
|
||||||
|
|
||||||
|
.leaflet-objects-pane { z-index: 3; }
|
||||||
|
.leaflet-overlay-pane { z-index: 4; }
|
||||||
|
.leaflet-shadow-pane { z-index: 5; }
|
||||||
|
.leaflet-marker-pane { z-index: 6; }
|
||||||
|
.leaflet-popup-pane { z-index: 7; }
|
||||||
|
|
||||||
|
.leaflet-zoom-box {
|
||||||
|
width: 0;
|
||||||
|
height: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.leaflet-tile {
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
.leaflet-tile-loaded {
|
||||||
|
visibility: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
a.leaflet-active {
|
||||||
|
outline: 2px solid orange;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Leaflet controls */
|
||||||
|
|
||||||
|
.leaflet-control {
|
||||||
|
position: relative;
|
||||||
|
z-index: 7;
|
||||||
|
}
|
||||||
|
.leaflet-top,
|
||||||
|
.leaflet-bottom {
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
.leaflet-top {
|
||||||
|
top: 0;
|
||||||
|
}
|
||||||
|
.leaflet-right {
|
||||||
|
right: 0;
|
||||||
|
}
|
||||||
|
.leaflet-bottom {
|
||||||
|
bottom: 0;
|
||||||
|
}
|
||||||
|
.leaflet-left {
|
||||||
|
left: 0;
|
||||||
|
}
|
||||||
|
.leaflet-control {
|
||||||
|
float: left;
|
||||||
|
clear: both;
|
||||||
|
}
|
||||||
|
.leaflet-right .leaflet-control {
|
||||||
|
float: right;
|
||||||
|
}
|
||||||
|
.leaflet-top .leaflet-control {
|
||||||
|
margin-top: 10px;
|
||||||
|
}
|
||||||
|
.leaflet-bottom .leaflet-control {
|
||||||
|
margin-bottom: 10px;
|
||||||
|
}
|
||||||
|
.leaflet-left .leaflet-control {
|
||||||
|
margin-left: 10px;
|
||||||
|
}
|
||||||
|
.leaflet-right .leaflet-control {
|
||||||
|
margin-right: 10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.leaflet-control-zoom, .leaflet-control-layers {
|
||||||
|
-moz-border-radius: 7px;
|
||||||
|
-webkit-border-radius: 7px;
|
||||||
|
border-radius: 7px;
|
||||||
|
}
|
||||||
|
.leaflet-control-zoom {
|
||||||
|
padding: 5px;
|
||||||
|
background: rgba(0, 0, 0, 0.25);
|
||||||
|
}
|
||||||
|
.leaflet-control-zoom a {
|
||||||
|
background-color: rgba(255, 255, 255, 0.75);
|
||||||
|
}
|
||||||
|
.leaflet-control-zoom a, .leaflet-control-layers a {
|
||||||
|
background-position: 50% 50%;
|
||||||
|
background-repeat: no-repeat;
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
.leaflet-control-zoom a {
|
||||||
|
-moz-border-radius: 4px;
|
||||||
|
-webkit-border-radius: 4px;
|
||||||
|
border-radius: 4px;
|
||||||
|
width: 19px;
|
||||||
|
height: 19px;
|
||||||
|
}
|
||||||
|
.leaflet-control-zoom a:hover {
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
.leaflet-big-buttons .leaflet-control-zoom a {
|
||||||
|
width: 27px;
|
||||||
|
height: 27px;
|
||||||
|
}
|
||||||
|
.leaflet-control-zoom-in {
|
||||||
|
background-image: url(images/zoom-in.png);
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
.leaflet-control-zoom-out {
|
||||||
|
background-image: url(images/zoom-out.png);
|
||||||
|
}
|
||||||
|
|
||||||
|
.leaflet-control-layers {
|
||||||
|
-moz-box-shadow: 0 0 7px #999;
|
||||||
|
-webkit-box-shadow: 0 0 7px #999;
|
||||||
|
box-shadow: 0 0 7px #999;
|
||||||
|
|
||||||
|
background: #f8f8f9;
|
||||||
|
}
|
||||||
|
.leaflet-control-layers a {
|
||||||
|
background-image: url(images/layers.png);
|
||||||
|
width: 36px;
|
||||||
|
height: 36px;
|
||||||
|
}
|
||||||
|
.leaflet-big-buttons .leaflet-control-layers a {
|
||||||
|
width: 44px;
|
||||||
|
height: 44px;
|
||||||
|
}
|
||||||
|
.leaflet-control-layers .leaflet-control-layers-list,
|
||||||
|
.leaflet-control-layers-expanded .leaflet-control-layers-toggle {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.leaflet-control-layers-expanded .leaflet-control-layers-list {
|
||||||
|
display: block;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
.leaflet-control-layers-expanded {
|
||||||
|
padding: 6px 10px 6px 6px;
|
||||||
|
font: 12px/1.5 "Helvetica Neue", Arial, Helvetica, sans-serif;
|
||||||
|
color: #333;
|
||||||
|
background: #fff;
|
||||||
|
}
|
||||||
|
.leaflet-control-layers input {
|
||||||
|
margin-top: 2px;
|
||||||
|
position: relative;
|
||||||
|
top: 1px;
|
||||||
|
}
|
||||||
|
.leaflet-control-layers label {
|
||||||
|
display: block;
|
||||||
|
}
|
||||||
|
.leaflet-control-layers-separator {
|
||||||
|
height: 0;
|
||||||
|
border-top: 1px solid #ddd;
|
||||||
|
margin: 5px -10px 5px -6px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.leaflet-container .leaflet-control-attribution {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0 5px;
|
||||||
|
|
||||||
|
font: 11px/1.5 "Helvetica Neue", Arial, Helvetica, sans-serif;
|
||||||
|
color: #333;
|
||||||
|
|
||||||
|
background-color: rgba(255, 255, 255, 0.7);
|
||||||
|
|
||||||
|
-moz-box-shadow: 0 0 7px #ccc;
|
||||||
|
-webkit-box-shadow: 0 0 7px #ccc;
|
||||||
|
box-shadow: 0 0 7px #ccc;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Fade animations */
|
||||||
|
|
||||||
|
.leaflet-fade-anim .leaflet-tile {
|
||||||
|
opacity: 0;
|
||||||
|
|
||||||
|
-webkit-transition: opacity 0.2s linear;
|
||||||
|
-moz-transition: opacity 0.2s linear;
|
||||||
|
-o-transition: opacity 0.2s linear;
|
||||||
|
transition: opacity 0.2s linear;
|
||||||
|
}
|
||||||
|
.leaflet-fade-anim .leaflet-tile-loaded {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.leaflet-fade-anim .leaflet-popup {
|
||||||
|
opacity: 0;
|
||||||
|
|
||||||
|
-webkit-transition: opacity 0.2s linear;
|
||||||
|
-moz-transition: opacity 0.2s linear;
|
||||||
|
-o-transition: opacity 0.2s linear;
|
||||||
|
transition: opacity 0.2s linear;
|
||||||
|
}
|
||||||
|
.leaflet-fade-anim .leaflet-map-pane .leaflet-popup {
|
||||||
|
opacity: 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
.leaflet-zoom-anim .leaflet-tile {
|
||||||
|
-webkit-transition: none;
|
||||||
|
-moz-transition: none;
|
||||||
|
-o-transition: none;
|
||||||
|
transition: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.leaflet-zoom-anim .leaflet-objects-pane {
|
||||||
|
visibility: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Popup layout */
|
||||||
|
|
||||||
|
.leaflet-popup {
|
||||||
|
position: absolute;
|
||||||
|
text-align: center;
|
||||||
|
-webkit-transform: translate3d(0,0,0);
|
||||||
|
}
|
||||||
|
.leaflet-popup-content-wrapper {
|
||||||
|
padding: 1px;
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
.leaflet-popup-content {
|
||||||
|
margin: 19px;
|
||||||
|
}
|
||||||
|
.leaflet-popup-tip-container {
|
||||||
|
margin: 0 auto;
|
||||||
|
width: 40px;
|
||||||
|
height: 16px;
|
||||||
|
position: relative;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
.leaflet-popup-tip {
|
||||||
|
width: 15px;
|
||||||
|
height: 15px;
|
||||||
|
padding: 1px;
|
||||||
|
|
||||||
|
margin: -8px auto 0;
|
||||||
|
|
||||||
|
-moz-transform: rotate(45deg);
|
||||||
|
-webkit-transform: rotate(45deg);
|
||||||
|
-ms-transform: rotate(45deg);
|
||||||
|
-o-transform: rotate(45deg);
|
||||||
|
transform: rotate(45deg);
|
||||||
|
}
|
||||||
|
.leaflet-popup-close-button {
|
||||||
|
position: absolute;
|
||||||
|
top: 9px;
|
||||||
|
right: 9px;
|
||||||
|
|
||||||
|
width: 10px;
|
||||||
|
height: 10px;
|
||||||
|
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
.leaflet-popup-content p {
|
||||||
|
margin: 18px 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Visual appearance */
|
||||||
|
|
||||||
|
.leaflet-container {
|
||||||
|
background: #ddd;
|
||||||
|
}
|
||||||
|
.leaflet-container a {
|
||||||
|
color: #0078A8;
|
||||||
|
}
|
||||||
|
.leaflet-zoom-box {
|
||||||
|
border: 2px dotted #05f;
|
||||||
|
background: white;
|
||||||
|
opacity: 0.5;
|
||||||
|
}
|
||||||
|
.leaflet-popup-content-wrapper, .leaflet-popup-tip {
|
||||||
|
background: white;
|
||||||
|
|
||||||
|
box-shadow: 0 1px 10px #888;
|
||||||
|
-moz-box-shadow: 0 1px 10px #888;
|
||||||
|
-webkit-box-shadow: 0 1px 14px #999;
|
||||||
|
}
|
||||||
|
.leaflet-popup-content-wrapper {
|
||||||
|
-moz-border-radius: 20px;
|
||||||
|
-webkit-border-radius: 20px;
|
||||||
|
border-radius: 20px;
|
||||||
|
}
|
||||||
|
.leaflet-popup-content {
|
||||||
|
font: 12px/1.4 "Helvetica Neue", Arial, Helvetica, sans-serif;
|
||||||
|
}
|
||||||
|
.leaflet-popup-close-button {
|
||||||
|
background: white url(images/popup-close.png);
|
||||||
|
}
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
.leaflet-tile {
|
||||||
|
filter: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
.leaflet-vml-shape {
|
||||||
|
width: 1px;
|
||||||
|
height: 1px;
|
||||||
|
}
|
||||||
|
.lvml {
|
||||||
|
behavior: url(#default#VML);
|
||||||
|
display: inline-block;
|
||||||
|
position: absolute;
|
||||||
|
}
|
||||||
|
|
||||||
|
.leaflet-control {
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
|
||||||
|
.leaflet-popup-tip {
|
||||||
|
width: 21px;
|
||||||
|
_width: 27px;
|
||||||
|
margin: 0 auto;
|
||||||
|
_margin-top: -3px;
|
||||||
|
|
||||||
|
filter: progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678);
|
||||||
|
-ms-filter: "progid:DXImageTransform.Microsoft.Matrix(M11=0.70710678, M12=0.70710678, M21=-0.70710678, M22=0.70710678)";
|
||||||
|
}
|
||||||
|
.leaflet-popup-tip-container {
|
||||||
|
margin-top: -1px;
|
||||||
|
}
|
||||||
|
.leaflet-popup-content-wrapper, .leaflet-popup-tip {
|
||||||
|
border: 1px solid #bbb;
|
||||||
|
}
|
||||||
|
|
||||||
|
.leaflet-control-zoom {
|
||||||
|
filter: progid:DXImageTransform.Microsoft.gradient(startColorStr='#3F000000',EndColorStr='#3F000000');
|
||||||
|
}
|
||||||
|
.leaflet-control-zoom a {
|
||||||
|
background-color: #eee;
|
||||||
|
}
|
||||||
|
.leaflet-control-zoom a:hover {
|
||||||
|
background-color: #fff;
|
||||||
|
}
|
||||||
|
.leaflet-control-layers-toggle {
|
||||||
|
}
|
||||||
|
.leaflet-control-attribution, .leaflet-control-layers {
|
||||||
|
background: white;
|
||||||
|
}
|
||||||
@@ -0,0 +1,370 @@
|
|||||||
|
/*
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU AFFERO General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
or see http://www.gnu.org/licenses/agpl.txt.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* OSRM CSS styles */
|
||||||
|
|
||||||
|
|
||||||
|
/* map -> fullscreen */
|
||||||
|
body {
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
html, body, #map {
|
||||||
|
height: 100%;
|
||||||
|
}
|
||||||
|
#map {
|
||||||
|
z-index: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* styles for gui */
|
||||||
|
.vquad
|
||||||
|
{
|
||||||
|
height:10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.gui-wrapper
|
||||||
|
{
|
||||||
|
position:absolute;
|
||||||
|
border-radius:10px;
|
||||||
|
-moz-border-radius:10px;
|
||||||
|
-webkit-border-radius:10px;
|
||||||
|
background-color:#666666;
|
||||||
|
background-color:rgba(0, 0, 0, 0.25);
|
||||||
|
transition:left 1s;
|
||||||
|
-moz-transition:left 1s;
|
||||||
|
-webkit-transition:left 1s;
|
||||||
|
-o-transition:left 1s;
|
||||||
|
-ms-transition:left 1s;
|
||||||
|
}
|
||||||
|
.gui-box
|
||||||
|
{
|
||||||
|
position:absolute;
|
||||||
|
background-color:#ffffff;
|
||||||
|
background-color:rgba(255,255,255,1);
|
||||||
|
border-radius:10px;
|
||||||
|
-moz-border-radius:10px;
|
||||||
|
-webkit-border-radius:10px;
|
||||||
|
margin:5px;
|
||||||
|
padding:5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#main-wrapper
|
||||||
|
{
|
||||||
|
width:410px;
|
||||||
|
height:95%;
|
||||||
|
top:5px;
|
||||||
|
left:5px;
|
||||||
|
}
|
||||||
|
#main-input
|
||||||
|
{
|
||||||
|
width:390px;
|
||||||
|
height:200px;
|
||||||
|
}
|
||||||
|
#main-output
|
||||||
|
{
|
||||||
|
width:390px;
|
||||||
|
top:220px;
|
||||||
|
bottom:0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
#blob-wrapper
|
||||||
|
{
|
||||||
|
left:-5px;
|
||||||
|
top:5px;
|
||||||
|
width:36px;
|
||||||
|
height:36px;
|
||||||
|
border-top-left-radius:0px;
|
||||||
|
border-bottom-left-radius:0px;
|
||||||
|
-moz-border-radius-topleft:0px;
|
||||||
|
-moz-border-radius-bottomleft:0px;
|
||||||
|
-webkit-border-top-left-radius:0px;
|
||||||
|
-webkit-border-bottom-left-radius:0px;
|
||||||
|
visibility:hidden;
|
||||||
|
}
|
||||||
|
#blob-input
|
||||||
|
{
|
||||||
|
width:26px;
|
||||||
|
height:26px;
|
||||||
|
border-top-left-radius:0px;
|
||||||
|
border-bottom-left-radius:0px;
|
||||||
|
-moz-border-radius-topleft:0px;
|
||||||
|
-moz-border-radius-bottomleft:0px;
|
||||||
|
-webkit-border-top-left-radius:0px;
|
||||||
|
-webkit-border-bottom-left-radius:0px;
|
||||||
|
padding:0px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.main-toggle-out
|
||||||
|
{
|
||||||
|
cursor:pointer;
|
||||||
|
position:absolute;
|
||||||
|
right:5px;
|
||||||
|
top:5px;
|
||||||
|
width:16px;
|
||||||
|
height:16px;
|
||||||
|
background-image:url("images/cancel.png");
|
||||||
|
}
|
||||||
|
.main-toggle-out:hover
|
||||||
|
{
|
||||||
|
background-image:url("images/cancel_hover.png");
|
||||||
|
}
|
||||||
|
.main-toggle-out:active
|
||||||
|
{
|
||||||
|
background-image:url("images/cancel_active.png");
|
||||||
|
}
|
||||||
|
.main-toggle-in
|
||||||
|
{
|
||||||
|
cursor:pointer;
|
||||||
|
position:absolute;
|
||||||
|
right:5px;
|
||||||
|
top:5px;
|
||||||
|
width:16px;
|
||||||
|
height:16px;
|
||||||
|
background-image:url("images/restore.png");
|
||||||
|
}
|
||||||
|
.main-toggle-in:hover
|
||||||
|
{
|
||||||
|
background-image:url("images/restore_hover.png");
|
||||||
|
}
|
||||||
|
.main-toggle-in:active
|
||||||
|
{
|
||||||
|
background-image:url("images/restore_active.png");
|
||||||
|
}
|
||||||
|
|
||||||
|
.main-options
|
||||||
|
{
|
||||||
|
position:relative;
|
||||||
|
font-size:10px;
|
||||||
|
}
|
||||||
|
.main-options-left-box
|
||||||
|
{
|
||||||
|
position:absolute;
|
||||||
|
left:5px;
|
||||||
|
top:0px;
|
||||||
|
}
|
||||||
|
.main-options-right-box
|
||||||
|
{
|
||||||
|
position:absolute;
|
||||||
|
right:5px;
|
||||||
|
top:5px;
|
||||||
|
}
|
||||||
|
#options-toggle
|
||||||
|
{
|
||||||
|
cursor:pointer;
|
||||||
|
color:#0000ff
|
||||||
|
}
|
||||||
|
#options-toggle:hover
|
||||||
|
{
|
||||||
|
color:#ff0000
|
||||||
|
}
|
||||||
|
#options-box
|
||||||
|
{
|
||||||
|
visibility:hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
#osrm-logo
|
||||||
|
{
|
||||||
|
display: block;
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
width: 192px;
|
||||||
|
height: 50px;
|
||||||
|
text-align:center;
|
||||||
|
vertical-align: middle;
|
||||||
|
}
|
||||||
|
|
||||||
|
.input-box
|
||||||
|
{
|
||||||
|
width: 250px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.full
|
||||||
|
{
|
||||||
|
width:100%;
|
||||||
|
}
|
||||||
|
.right
|
||||||
|
{
|
||||||
|
text-align:right;
|
||||||
|
}
|
||||||
|
.center
|
||||||
|
{
|
||||||
|
text-align:center;
|
||||||
|
}
|
||||||
|
|
||||||
|
#information-box
|
||||||
|
{
|
||||||
|
position:absolute;
|
||||||
|
bottom:15px;
|
||||||
|
top:60px;
|
||||||
|
width:380px;
|
||||||
|
font-size:12px;
|
||||||
|
overflow:auto;
|
||||||
|
margin:5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.route-summary
|
||||||
|
{
|
||||||
|
font-size: 12px;
|
||||||
|
}
|
||||||
|
#gpx-link
|
||||||
|
{
|
||||||
|
color:#0000ff;
|
||||||
|
text-decoration:none;
|
||||||
|
cursor:pointer;
|
||||||
|
}
|
||||||
|
#gpx-link:hover
|
||||||
|
{
|
||||||
|
color:#ff0000;
|
||||||
|
}
|
||||||
|
.results-table
|
||||||
|
{
|
||||||
|
border-spacing:0px;
|
||||||
|
}
|
||||||
|
.results-odd
|
||||||
|
{
|
||||||
|
background-color: #FAF3E9; //#ffffff;
|
||||||
|
}
|
||||||
|
.results-even
|
||||||
|
{
|
||||||
|
background-color: #F2DE9C; //#ffffe0;
|
||||||
|
}
|
||||||
|
.result-counter
|
||||||
|
{
|
||||||
|
text-align:right;
|
||||||
|
vertical-align: top;
|
||||||
|
width:30px;
|
||||||
|
font-weight:bold;
|
||||||
|
padding-left:5px;
|
||||||
|
padding-right:5px;
|
||||||
|
padding-top:1px;
|
||||||
|
padding-bottom:1px;
|
||||||
|
}
|
||||||
|
.result-items
|
||||||
|
{
|
||||||
|
text-align:left;
|
||||||
|
vertical-align: middle;
|
||||||
|
width:100%;
|
||||||
|
padding-left:1px;
|
||||||
|
padding-right:1px;
|
||||||
|
padding-top:1px;
|
||||||
|
padding-bottom:1px;
|
||||||
|
}
|
||||||
|
.result-direction
|
||||||
|
{
|
||||||
|
width:30px;
|
||||||
|
padding-left:1px;
|
||||||
|
padding-right:1px;
|
||||||
|
padding-top:1px;
|
||||||
|
padding-bottom:1px;
|
||||||
|
}
|
||||||
|
.result-distance
|
||||||
|
{
|
||||||
|
text-align:right;
|
||||||
|
vertical-align: middle;
|
||||||
|
width:30px;
|
||||||
|
padding-left:1px;
|
||||||
|
padding-right:1px;
|
||||||
|
padding-top:1px;
|
||||||
|
padding-bottom:1px;
|
||||||
|
}
|
||||||
|
.result-item
|
||||||
|
{
|
||||||
|
cursor:pointer;
|
||||||
|
color:#000000
|
||||||
|
}
|
||||||
|
.result-item:hover
|
||||||
|
{
|
||||||
|
color:#ff0000
|
||||||
|
}
|
||||||
|
|
||||||
|
#legal-notice
|
||||||
|
{
|
||||||
|
position:absolute;
|
||||||
|
right:0px;
|
||||||
|
bottom:0px;
|
||||||
|
padding:5px;
|
||||||
|
font-size:10px;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* utility styles (defined above buttons, so that buttons retain cursor:pointer)*/
|
||||||
|
.not-selectable
|
||||||
|
{
|
||||||
|
cursor:default;
|
||||||
|
-moz-user-select: -moz-none;
|
||||||
|
-webkit-user-select: none;
|
||||||
|
-ms-user-select: none;
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.text-selectable
|
||||||
|
{
|
||||||
|
cursor:default;
|
||||||
|
-moz-user-select: text;
|
||||||
|
-webkit-user-select: text;
|
||||||
|
-ms-user-select: text;
|
||||||
|
user-select: text;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* buttons */
|
||||||
|
.button
|
||||||
|
{
|
||||||
|
cursor:pointer;
|
||||||
|
padding:2px 10px 2px 10px;
|
||||||
|
border-radius:5px;
|
||||||
|
-moz-border-radius:5px;
|
||||||
|
background-color:#EEEEEE;
|
||||||
|
border:1px solid #999999;
|
||||||
|
color:#333333;
|
||||||
|
text-decoration:none;
|
||||||
|
font-size:11px;
|
||||||
|
outline-style:none;
|
||||||
|
}
|
||||||
|
.button:hover
|
||||||
|
{
|
||||||
|
background-color:#F9F9F9;
|
||||||
|
color:#000000;
|
||||||
|
}
|
||||||
|
.button:active
|
||||||
|
{
|
||||||
|
background-color:#F4F4F4;
|
||||||
|
color:#FF0000;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.delete-marker
|
||||||
|
{
|
||||||
|
cursor:pointer;
|
||||||
|
position:absolute;
|
||||||
|
right:5px;
|
||||||
|
top:3px;
|
||||||
|
width:16px;
|
||||||
|
height:16px;
|
||||||
|
background-image:url("images/cancel.png");
|
||||||
|
visibility:hidden;
|
||||||
|
}
|
||||||
|
.delete-marker:hover
|
||||||
|
{
|
||||||
|
background-image:url("images/cancel_hover.png");
|
||||||
|
}
|
||||||
|
.delete-marker:active
|
||||||
|
{
|
||||||
|
background-image:url("images/cancel_active.png");
|
||||||
|
}
|
||||||
@@ -0,0 +1,144 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||||
|
|
||||||
|
<!--
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU AFFERO General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
or see http://www.gnu.org/licenses/agpl.txt.
|
||||||
|
-->
|
||||||
|
|
||||||
|
<html xmlns="http://www.w3.org/1999/xhtml">
|
||||||
|
|
||||||
|
|
||||||
|
<!-- head -->
|
||||||
|
<head>
|
||||||
|
|
||||||
|
<!-- metatags -->
|
||||||
|
<meta http-equiv="content-type" content="text/html; charset=UTF-8" />
|
||||||
|
<title>OSRM Website</title>
|
||||||
|
<meta name="description" content="OSRM Website"/>
|
||||||
|
<meta name="author" content="Dennis Schieferdecker" />
|
||||||
|
|
||||||
|
<!-- favicon -->
|
||||||
|
<link rel="shortcut icon" href="images/osrm-favicon.ico" type="image/x-icon" />
|
||||||
|
|
||||||
|
<!-- stylesheets -->
|
||||||
|
<link rel="stylesheet" href="leaflet/leaflet.css" type="text/css"/>
|
||||||
|
<!--[if lte IE 8]><link rel="stylesheet" href="leaflet/leaflet.ie.css" type="text/css"/><![endif]-->
|
||||||
|
<link rel="stylesheet" href="main.css" type="text/css"/>
|
||||||
|
|
||||||
|
<!-- scripts -->
|
||||||
|
<script src="leaflet/leaflet-src.js" type="text/javascript"></script>
|
||||||
|
<script src="L.Bugfixes.js" type="text/javascript"></script>
|
||||||
|
<script src="L.DashedPolyline.js" type="text/javascript"></script>
|
||||||
|
<script src="L.MouseMarker.js" type="text/javascript"></script>
|
||||||
|
<script src="L.SwitchableIcon.js" type="text/javascript"></script>
|
||||||
|
|
||||||
|
<script src="OSRM.base.js" type="text/javascript"></script>
|
||||||
|
<script src="OSRM.config.js" type="text/javascript"></script>
|
||||||
|
<!-- <script defer="defer" src="OSRM.debug.js" type="text/javascript"></script> -->
|
||||||
|
<script src="main.js" type="text/javascript"></script>
|
||||||
|
|
||||||
|
<script src="OSRM.Markers.js" type="text/javascript"></script>
|
||||||
|
<script src="OSRM.Route.js" type="text/javascript"></script>
|
||||||
|
|
||||||
|
<script src="OSRM.Map.js" type="text/javascript"></script>
|
||||||
|
<script src="OSRM.GUI.js" type="text/javascript"></script>
|
||||||
|
<script src="routing/OSRM.Routing.js" type="text/javascript"></script>
|
||||||
|
<script src="routing/OSRM.RoutingDescription.js" type="text/javascript"></script>
|
||||||
|
<script src="routing/OSRM.RoutingGeometry.js" type="text/javascript"></script>
|
||||||
|
<script src="routing/OSRM.RoutingGUI.js" type="text/javascript"></script>
|
||||||
|
<script src="routing/OSRM.RoutingNoNames.js" type="text/javascript"></script>
|
||||||
|
<script src="OSRM.Via.js" type="text/javascript"></script>
|
||||||
|
<script src="OSRM.Geocoder.js" type="text/javascript"></script>
|
||||||
|
|
||||||
|
<script src="OSRM.Browser.js" type="text/javascript"></script>
|
||||||
|
<script src="OSRM.JSONP.js" type="text/javascript"></script>
|
||||||
|
<script src="OSRM.Localization.js" type="text/javascript"></script>
|
||||||
|
<script src="OSRM.Utils.js" type="text/javascript"></script>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- body -->
|
||||||
|
<body onload="OSRM.init();">
|
||||||
|
|
||||||
|
<!--map-->
|
||||||
|
<div id="map"></div>
|
||||||
|
|
||||||
|
<!-- show ui blob -->
|
||||||
|
<div id="blob-wrapper" class="gui-wrapper">
|
||||||
|
<div id="blob-input" class="gui-box">
|
||||||
|
<div class="main-toggle-in" onclick="OSRM.GUI.toggleMain()"></div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- show main gui -->
|
||||||
|
<div id="main-wrapper" class="gui-wrapper">
|
||||||
|
|
||||||
|
<!-- input box -->
|
||||||
|
<div class="gui-box not-selectable" id="main-input">
|
||||||
|
<div class="main-toggle-out" onclick="OSRM.GUI.toggleMain()"></div>
|
||||||
|
<img id="osrm-logo" alt="OSRM Logo" src="images/osrm-logo.png" />
|
||||||
|
|
||||||
|
<!-- source/target input -->
|
||||||
|
<table class="full">
|
||||||
|
<tr>
|
||||||
|
<td id="gui-search-source-label">Start:</td>
|
||||||
|
<td><div style="position:relative;">
|
||||||
|
<input id="input-source-name" class="input-box" type="text" maxlength="200" value="" title="Startposition eingeben" onchange="OSRM.RoutingGUI.inputChanged(OSRM.C.SOURCE_LABEL);" />
|
||||||
|
<div id="delete-source-marker" class="delete-marker" onclick="OSRM.RoutingGUI.deleteMarker('source')"></div></div></td>
|
||||||
|
<td class="right"><a class="button not-selectable" id="gui-search-source" onclick="OSRM.RoutingGUI.showMarker('source')">Zeigen</a></td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td id="gui-search-target-label">Ende:</td>
|
||||||
|
<td><div style="position:relative;">
|
||||||
|
<input id="input-target-name" class="input-box" type="text" maxlength="200" value="" title="Zielposition eingeben" onchange="OSRM.RoutingGUI.inputChanged(OSRM.C.TARGET_LABEL);" />
|
||||||
|
<div id="delete-target-marker" class="delete-marker" onclick="OSRM.RoutingGUI.deleteMarker('target')"></div></div></td>
|
||||||
|
<td class="right"><a class="button not-selectable" id="gui-search-target" onclick="OSRM.RoutingGUI.showMarker('target');">Zeigen</a></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<!-- action buttons -->
|
||||||
|
<div class="vquad"></div>
|
||||||
|
<table style="width:100%">
|
||||||
|
<tr>
|
||||||
|
<td> <a class="button not-selectable" id="gui-reset" onclick="OSRM.RoutingGUI.resetRouting();">Reset</a></td>
|
||||||
|
<td class="right"> <a class="button not-selectable" id="gui-reverse" onclick="OSRM.RoutingGUI.reverseRouting();">Umdrehen</a></td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<!-- options -->
|
||||||
|
<span class="main-options" id="options-toggle" onclick="OSRM.GUI.toggleOptions()">Kartenwerkzeuge</span>
|
||||||
|
<div class="main-options" id="options-box">
|
||||||
|
<span class="main-options-left-box">
|
||||||
|
<input type="checkbox" id="option-highlight-nonames" name="main-options" value="highlight-nonames" onclick="OSRM.Routing.getRoute();" /><span id="gui-option-highlight-nonames-label">Unbenannte Straßen hervorheben</span>
|
||||||
|
</span>
|
||||||
|
<span class="main-options-right-box">
|
||||||
|
<a class="button not-selectable" id="open-josm" onclick="OSRM.RoutingGUI.openJOSM();">JOSM</a>
|
||||||
|
<a class="button not-selectable" id="open-osmbugs" onclick="OSRM.RoutingGUI.openOSMBugs();">OSM Bugs</a>
|
||||||
|
</span>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<!-- output box -->
|
||||||
|
<div class="gui-box not-selectable" id="main-output">
|
||||||
|
<div id="information-box-headline"></div>
|
||||||
|
<div id="information-box"></div>
|
||||||
|
<div id="legal-notice">GUI2 v0.1.1 120316 - OSRM hosting by <a href='http://algo2.iti.kit.edu/'>KIT</a> - Geocoder by <a href='http://www.osm.org/'>OSM</a></div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
@@ -0,0 +1,183 @@
|
|||||||
|
/*
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU AFFERO General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
or see http://www.gnu.org/licenses/agpl.txt.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// OSRM initialization
|
||||||
|
// [initialization, image prefetching]
|
||||||
|
|
||||||
|
// will hold the Leaflet map object
|
||||||
|
OSRM.GLOBALS.map = null;
|
||||||
|
|
||||||
|
|
||||||
|
// onload initialization routine
|
||||||
|
OSRM.init = function() {
|
||||||
|
OSRM.prefetchImages();
|
||||||
|
OSRM.prefetchIcons();
|
||||||
|
|
||||||
|
OSRM.GUI.init();
|
||||||
|
OSRM.Map.init();
|
||||||
|
OSRM.Routing.init();
|
||||||
|
|
||||||
|
// check if the URL contains some GET parameter, e.g. for showing a route
|
||||||
|
OSRM.checkURL();
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// prefetch images
|
||||||
|
OSRM.GLOBALS.images = Array();
|
||||||
|
OSRM.prefetchImages = function() {
|
||||||
|
var images = [ 'images/marker-source.png',
|
||||||
|
'images/marker-target.png',
|
||||||
|
'images/marker-via.png',
|
||||||
|
'images/marker-highlight.png',
|
||||||
|
'images/marker-source-drag.png',
|
||||||
|
'images/marker-target-drag.png',
|
||||||
|
'images/marker-via-drag.png',
|
||||||
|
'images/marker-highlight-drag.png',
|
||||||
|
'images/marker-drag.png',
|
||||||
|
'images/cancel.png',
|
||||||
|
'images/cancel_active.png',
|
||||||
|
'images/cancel_hover.png',
|
||||||
|
'images/restore.png',
|
||||||
|
'images/restore_active.png',
|
||||||
|
'images/restore_hover.png'
|
||||||
|
];
|
||||||
|
|
||||||
|
for(var i=0; i<images.length; i++) {
|
||||||
|
OSRM.G.images[i] = new Image();
|
||||||
|
OSRM.G.images[i].src = images[i];
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// prefetch icons
|
||||||
|
OSRM.GLOBALS.icons = Array();
|
||||||
|
OSRM.prefetchIcons = function() {
|
||||||
|
var images = [ 'marker-source',
|
||||||
|
'marker-target',
|
||||||
|
'marker-via',
|
||||||
|
'marker-highlight',
|
||||||
|
'marker-source-drag',
|
||||||
|
'marker-target-drag',
|
||||||
|
'marker-via-drag',
|
||||||
|
'marker-highlight-drag',
|
||||||
|
'marker-drag'
|
||||||
|
];
|
||||||
|
|
||||||
|
for(var i=0; i<images.length; i++) {
|
||||||
|
var icon = {
|
||||||
|
iconUrl: 'images/'+images[i]+'.png', iconSize: new L.Point(25, 41), iconAnchor: new L.Point(13, 41),
|
||||||
|
shadowUrl: L.ROOT_URL + 'images/marker-shadow.png', shadowSize: new L.Point(41, 41),
|
||||||
|
popupAnchor: new L.Point(0, -33)
|
||||||
|
};
|
||||||
|
OSRM.G.icons[images[i]] = new L.SwitchableIcon(icon);
|
||||||
|
}
|
||||||
|
|
||||||
|
// special values for drag marker
|
||||||
|
OSRM.G.icons['marker-drag'] = new L.SwitchableIcon( {iconUrl: 'images/marker-drag.png', iconSize: new L.Point(18, 18) } );
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
// parse URL GET parameters if any exist
|
||||||
|
OSRM.checkURL = function(){
|
||||||
|
var called_url = document.location.search.substr(1,document.location.search.length);
|
||||||
|
|
||||||
|
// reject messages that are clearly too long or too small
|
||||||
|
if( called_url.length > 1000 || called_url.length == 0)
|
||||||
|
return;
|
||||||
|
|
||||||
|
// storage for parameter values
|
||||||
|
var positions = [];
|
||||||
|
var zoom = null;
|
||||||
|
var center = null;
|
||||||
|
var destination = null;
|
||||||
|
var destination_name = null;
|
||||||
|
|
||||||
|
// parse input
|
||||||
|
var splitted_url = called_url.split('&');
|
||||||
|
for(var i=0; i<splitted_url.length; i++) {
|
||||||
|
var name_val = splitted_url[i].split('=');
|
||||||
|
if(name_val.length!=2)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if(name_val[0] == 'loc') {
|
||||||
|
var coordinates = unescape(name_val[1]).split(',');
|
||||||
|
if(coordinates.length!=2 || !OSRM.Utils.isLatitude(coordinates[0]) || !OSRM.Utils.isLongitude(coordinates[1]) )
|
||||||
|
return;
|
||||||
|
positions.push ( new L.LatLng( coordinates[0], coordinates[1]) );
|
||||||
|
}
|
||||||
|
else if(name_val[0] == 'dest') {
|
||||||
|
var coordinates = unescape(name_val[1]).split(',');
|
||||||
|
if(coordinates.length!=2 || !OSRM.Utils.isLatitude(coordinates[0]) || !OSRM.Utils.isLongitude(coordinates[1]) )
|
||||||
|
return;
|
||||||
|
destination = new L.LatLng( coordinates[0], coordinates[1]);
|
||||||
|
}
|
||||||
|
else if(name_val[0] == 'destname') {
|
||||||
|
destination_name = decodeURI(name_val[1]).replace(/<\/?[^>]+(>|$)/g ,""); // discard tags
|
||||||
|
}
|
||||||
|
else if(name_val[0] == 'z') {
|
||||||
|
zoom = name_val[1];
|
||||||
|
if( zoom<0 || zoom > 18)
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
else if(name_val[0] == 'center') {
|
||||||
|
var coordinates = unescape(name_val[1]).split(',');
|
||||||
|
if(coordinates.length!=2 || !OSRM.Utils.isLatitude(coordinates[0]) || !OSRM.Utils.isLongitude(coordinates[1]) )
|
||||||
|
return;
|
||||||
|
center = new L.LatLng( coordinates[0], coordinates[1]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// case 1: destination given
|
||||||
|
if( destination != undefined ) {
|
||||||
|
var index = OSRM.G.markers.setTarget( e.latlng );
|
||||||
|
if( destination_name == null )
|
||||||
|
OSRM.Geocoder.updateAddress( OSRM.C.TARGET_LABEL, OSRM.C.DO_FALLBACK_TO_LAT_LNG );
|
||||||
|
else
|
||||||
|
document.getElementById("input-target-name").value = destination_name;
|
||||||
|
OSRM.G.markers.route[index].show();
|
||||||
|
OSRM.G.markers.route[index].centerView();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// case 2: locations given
|
||||||
|
if( positions != []) {
|
||||||
|
// draw via points
|
||||||
|
if( positions.length > 0) {
|
||||||
|
OSRM.G.markers.setSource( positions[0] );
|
||||||
|
OSRM.Geocoder.updateAddress( OSRM.C.SOURCE_LABEL, OSRM.C.DO_FALLBACK_TO_LAT_LNG );
|
||||||
|
}
|
||||||
|
if(positions.length > 1) {
|
||||||
|
OSRM.G.markers.setTarget( positions[positions.length-1] );
|
||||||
|
OSRM.Geocoder.updateAddress( OSRM.C.TARGET_LABEL, OSRM.C.DO_FALLBACK_TO_LAT_LNG );
|
||||||
|
}
|
||||||
|
for(var i=1; i<positions.length-1;i++)
|
||||||
|
OSRM.G.markers.setVia( i-1, positions[i] );
|
||||||
|
for(var i=0; i<OSRM.G.markers.route.length;i++)
|
||||||
|
OSRM.G.markers.route[i].show();
|
||||||
|
|
||||||
|
// center on route (support for old links) / move to given view (new behaviour)
|
||||||
|
if(zoom == null || center == null) {
|
||||||
|
var bounds = new L.LatLngBounds( positions );
|
||||||
|
OSRM.G.map.fitBoundsUI( bounds );
|
||||||
|
} else {
|
||||||
|
OSRM.G.map.setView(center, zoom);
|
||||||
|
}
|
||||||
|
|
||||||
|
// compute route
|
||||||
|
OSRM.Routing.getRoute();
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -0,0 +1,148 @@
|
|||||||
|
/*
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU AFFERO General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
or see http://www.gnu.org/licenses/agpl.txt.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// OSRM routing
|
||||||
|
// [management of routing requests and processing of responses]
|
||||||
|
|
||||||
|
// some variables
|
||||||
|
OSRM.GLOBALS.route = null;
|
||||||
|
OSRM.GLOBALS.markers = null;
|
||||||
|
|
||||||
|
OSRM.GLOBALS.dragging = null;
|
||||||
|
OSRM.GLOBALS.dragid = null;
|
||||||
|
OSRM.GLOBALS.pending = false;
|
||||||
|
OSRM.GLOBALS.pendingTimer = null;
|
||||||
|
|
||||||
|
|
||||||
|
OSRM.Routing = {
|
||||||
|
|
||||||
|
// init routing data structures
|
||||||
|
init: function() {
|
||||||
|
OSRM.G.route = new OSRM.Route();
|
||||||
|
OSRM.G.markers = new OSRM.Markers();
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
// -- JSONP processing --
|
||||||
|
|
||||||
|
// process JSONP response of routing server
|
||||||
|
timeoutRouteSimple: function() {
|
||||||
|
OSRM.RoutingGeometry.showNA();
|
||||||
|
OSRM.RoutingDescription.showNA( OSRM.loc("TIMED_OUT") );
|
||||||
|
},
|
||||||
|
timeoutRoute: function() {
|
||||||
|
OSRM.RoutingGeometry.showNA();
|
||||||
|
OSRM.RoutingNoNames.showNA();
|
||||||
|
OSRM.RoutingDescription.showNA( OSRM.loc("TIMED_OUT") );
|
||||||
|
},
|
||||||
|
showRouteSimple: function(response) {
|
||||||
|
if(!response)
|
||||||
|
return;
|
||||||
|
if( !OSRM.G.dragging ) // prevent simple routing when no longer dragging
|
||||||
|
return;
|
||||||
|
|
||||||
|
if( response.status == 207) {
|
||||||
|
OSRM.RoutingGeometry.showNA();
|
||||||
|
OSRM.RoutingDescription.showNA( OSRM.loc("YOUR_ROUTE_IS_BEING_COMPUTED") );
|
||||||
|
} else {
|
||||||
|
OSRM.RoutingGeometry.show(response);
|
||||||
|
OSRM.RoutingDescription.showSimple(response);
|
||||||
|
}
|
||||||
|
OSRM.Routing._updateHints(response);
|
||||||
|
|
||||||
|
if(OSRM.G.pending)
|
||||||
|
OSRM.G.pendingTimer = setTimeout(OSRM.Routing.draggingTimeout,1);
|
||||||
|
},
|
||||||
|
showRoute: function(response) {
|
||||||
|
if(!response)
|
||||||
|
return;
|
||||||
|
|
||||||
|
OSRM.G.via_points = response.via_points.slice(0);
|
||||||
|
if(response.status == 207) {
|
||||||
|
OSRM.RoutingGeometry.showNA();
|
||||||
|
OSRM.RoutingNoNames.showNA();
|
||||||
|
OSRM.RoutingDescription.showNA( OSRM.loc("NO_ROUTE_FOUND") );
|
||||||
|
} else {
|
||||||
|
OSRM.RoutingGeometry.show(response);
|
||||||
|
OSRM.RoutingNoNames.show(response);
|
||||||
|
OSRM.RoutingDescription.show(response);
|
||||||
|
OSRM.Routing._snapRoute();
|
||||||
|
}
|
||||||
|
OSRM.Routing._updateHints(response);
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//-- main function --
|
||||||
|
|
||||||
|
//generate server calls to query routes
|
||||||
|
getRoute: function() {
|
||||||
|
|
||||||
|
// if source or target are not set -> hide route
|
||||||
|
if( OSRM.G.markers.route.length < 2 ) {
|
||||||
|
OSRM.G.route.hideRoute();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
OSRM.JSONP.call(OSRM.Routing._buildCall()+'&instructions=true', OSRM.Routing.showRoute, OSRM.Routing.timeoutRoute, OSRM.DEFAULTS.JSONP_TIMEOUT, 'route');
|
||||||
|
},
|
||||||
|
getDragRoute: function() {
|
||||||
|
OSRM.G.pending = !OSRM.JSONP.call(OSRM.Routing._buildCall()+'&instructions=false', OSRM.Routing.showRouteSimple, OSRM.Routing.timeoutRouteSimple, OSRM.DEFAULTS.JSONP_TIMEOUT, 'dragging');;
|
||||||
|
},
|
||||||
|
draggingTimeout: function() {
|
||||||
|
OSRM.G.markers.route[OSRM.G.dragid].hint = null;
|
||||||
|
OSRM.Routing.getDragRoute();
|
||||||
|
},
|
||||||
|
|
||||||
|
_buildCall: function() {
|
||||||
|
var source = OSRM.DEFAULTS.HOST_ROUTING_URL;
|
||||||
|
source += '?z=' + OSRM.G.map.getZoom() + '&output=json&geomformat=cmp';
|
||||||
|
if(OSRM.G.markers.checksum)
|
||||||
|
source += '&checksum=' + OSRM.G.markers.checksum;
|
||||||
|
for(var i=0,size=OSRM.G.markers.route.length; i<size; i++) {
|
||||||
|
source += '&loc=' + OSRM.G.markers.route[i].getLat() + ',' + OSRM.G.markers.route[i].getLng();
|
||||||
|
if( OSRM.G.markers.route[i].hint)
|
||||||
|
source += '&hint=' + OSRM.G.markers.route[i].hint;
|
||||||
|
}
|
||||||
|
return source;
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
//-- helper functions --
|
||||||
|
|
||||||
|
// update hints of all markers
|
||||||
|
_updateHints: function(response) {
|
||||||
|
var hint_locations = response.hint_data.locations;
|
||||||
|
OSRM.G.markers.checksum = response.hint_data.checksum;
|
||||||
|
for(var i=0; i<hint_locations.length; i++)
|
||||||
|
OSRM.G.markers.route[i].hint = hint_locations[i];
|
||||||
|
},
|
||||||
|
|
||||||
|
// snap all markers to the received route
|
||||||
|
_snapRoute: function() {
|
||||||
|
var positions = OSRM.G.route.getPositions();
|
||||||
|
|
||||||
|
OSRM.G.markers.route[0].setPosition( positions[0] );
|
||||||
|
OSRM.G.markers.route[OSRM.G.markers.route.length-1].setPosition( positions[positions.length-1] );
|
||||||
|
for(var i=0; i<OSRM.G.via_points.length; i++)
|
||||||
|
OSRM.G.markers.route[i+1].setPosition( new L.LatLng(OSRM.G.via_points[i][0], OSRM.G.via_points[i][1]) );
|
||||||
|
|
||||||
|
OSRM.Geocoder.updateAddress(OSRM.C.SOURCE_LABEL);
|
||||||
|
OSRM.Geocoder.updateAddress(OSRM.C.TARGET_LABEL);
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
@@ -0,0 +1,174 @@
|
|||||||
|
/*
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU AFFERO General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
or see http://www.gnu.org/licenses/agpl.txt.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// OSRM routing description
|
||||||
|
// [renders routing description and manages events]
|
||||||
|
|
||||||
|
|
||||||
|
OSRM.RoutingDescription = {
|
||||||
|
|
||||||
|
// route description events
|
||||||
|
onClickRouteDescription: function(geometry_index) {
|
||||||
|
var positions = OSRM.G.route.getPositions();
|
||||||
|
|
||||||
|
OSRM.G.markers.highlight.setPosition( positions[geometry_index] );
|
||||||
|
OSRM.G.markers.highlight.show();
|
||||||
|
OSRM.G.markers.highlight.centerView(OSRM.DEFAULTS.HIGHLIGHT_ZOOM_LEVEL);
|
||||||
|
},
|
||||||
|
onClickCreateShortcut: function(src){
|
||||||
|
src += '&z='+ OSRM.G.map.getZoom() + '¢er=' + OSRM.G.map.getCenter().lat + ',' + OSRM.G.map.getCenter().lng;
|
||||||
|
OSRM.JSONP.call(OSRM.DEFAULTS.HOST_SHORTENER_URL+src, OSRM.RoutingDescription.showRouteLink, OSRM.RoutingDescription.showRouteLink_TimeOut, OSRM.DEFAULTS.JSONP_TIMEOUT, 'shortener');
|
||||||
|
document.getElementById('route-prelink').innerHTML = '['+OSRM.loc("GENERATE_LINK_TO_ROUTE")+']';
|
||||||
|
},
|
||||||
|
showRouteLink: function(response){
|
||||||
|
document.getElementById('route-prelink').innerHTML = '[<a id="gpx-link" class = "text-selectable" href="' +response.ShortURL+ '">'+response.ShortURL+'</a>]';
|
||||||
|
// document.getElementById('route-prelink').innerHTML = '[<input class="text-selectable output-box" style="border:none" value="'+response.ShortURL+'" type="text" onfocus="this.select()" readonly="readonly"/>]';
|
||||||
|
},
|
||||||
|
showRouteLink_TimeOut: function(){
|
||||||
|
document.getElementById('route-prelink').innerHTML = '['+OSRM.loc("LINK_TO_ROUTE_TIMEOUT")+']';
|
||||||
|
},
|
||||||
|
|
||||||
|
// handling of routing description
|
||||||
|
show: function(response) {
|
||||||
|
// compute query string
|
||||||
|
var query_string = '?rebuild=1';
|
||||||
|
for(var i=0; i<OSRM.G.markers.route.length; i++)
|
||||||
|
query_string += '&loc=' + OSRM.G.markers.route[i].getLat() + ',' + OSRM.G.markers.route[i].getLng();
|
||||||
|
|
||||||
|
// create link to the route
|
||||||
|
var route_link ='<span class="route-summary" id="route-prelink">[<a id="gpx-link" onclick="OSRM.RoutingDescription.onClickCreateShortcut(\'' + OSRM.DEFAULTS.WEBSITE_URL + query_string + '\')">'+OSRM.loc("GET_LINK_TO_ROUTE")+'</a>]</span>';
|
||||||
|
|
||||||
|
// create GPX link
|
||||||
|
var gpx_link = '<span class="route-summary">[<a id="gpx-link" onClick="document.location.href=\'' + OSRM.DEFAULTS.HOST_ROUTING_URL + query_string + '&output=gpx\';">'+OSRM.loc("GPX_FILE")+'</a>]</span>';
|
||||||
|
|
||||||
|
// create route description
|
||||||
|
var route_desc = "";
|
||||||
|
route_desc += '<table class="results-table">';
|
||||||
|
|
||||||
|
for(var i=0; i < response.route_instructions.length; i++){
|
||||||
|
//odd or even ?
|
||||||
|
var rowstyle='results-odd';
|
||||||
|
if(i%2==0) { rowstyle='results-even'; }
|
||||||
|
|
||||||
|
route_desc += '<tr class="'+rowstyle+'">';
|
||||||
|
|
||||||
|
route_desc += '<td class="result-directions">';
|
||||||
|
route_desc += '<img width="18px" src="images/'+OSRM.RoutingDescription.getDirectionIcon(response.route_instructions[i][0])+'" alt="" />';
|
||||||
|
route_desc += "</td>";
|
||||||
|
|
||||||
|
route_desc += '<td class="result-items">';
|
||||||
|
route_desc += '<span class="result-item" onclick="OSRM.RoutingDescription.onClickRouteDescription('+response.route_instructions[i][3]+')">';
|
||||||
|
route_desc += response.route_instructions[i][0];
|
||||||
|
if( i == 0 )
|
||||||
|
route_desc += ' ' + OSRM.loc( response.route_instructions[i][6] );
|
||||||
|
if( response.route_instructions[i][1] != "" ) {
|
||||||
|
route_desc += ' on ';
|
||||||
|
route_desc += '<b>' + response.route_instructions[i][1] + '</b>';
|
||||||
|
}
|
||||||
|
//route_desc += ' for ';
|
||||||
|
route_desc += '</span>';
|
||||||
|
route_desc += "</td>";
|
||||||
|
|
||||||
|
route_desc += '<td class="result-distance">';
|
||||||
|
if( i != response.route_instructions.length-1 )
|
||||||
|
route_desc += '<b>'+OSRM.Utils.metersToDistance(response.route_instructions[i][2])+'</b>';
|
||||||
|
route_desc += "</td>";
|
||||||
|
|
||||||
|
route_desc += "</tr>";
|
||||||
|
}
|
||||||
|
|
||||||
|
route_desc += '</table>';
|
||||||
|
headline = "";
|
||||||
|
headline += OSRM.loc("ROUTE_DESCRIPTION")+":<br>";
|
||||||
|
headline += '<div style="float:left;width:40%">';
|
||||||
|
headline += "<span class='route-summary'>"
|
||||||
|
+ OSRM.loc("DISTANCE")+": " + OSRM.Utils.metersToDistance(response.route_summary.total_distance)
|
||||||
|
+ "<br>"
|
||||||
|
+ OSRM.loc("DURATION")+": " + OSRM.Utils.secondsToTime(response.route_summary.total_time)
|
||||||
|
+ "</span>";
|
||||||
|
headline += '</div>';
|
||||||
|
headline += '<div style="float:left;text-align:right;width:60%;">'+route_link+'<br>'+gpx_link+'</div>';
|
||||||
|
|
||||||
|
var output = "";
|
||||||
|
output += route_desc;
|
||||||
|
|
||||||
|
document.getElementById('information-box-headline').innerHTML = headline;
|
||||||
|
document.getElementById('information-box').innerHTML = output;
|
||||||
|
},
|
||||||
|
|
||||||
|
// simple description
|
||||||
|
showSimple: function(response) {
|
||||||
|
headline = OSRM.loc("ROUTE_DESCRIPTION")+":<br>";
|
||||||
|
headline += "<span class='route-summary'>"
|
||||||
|
+ OSRM.loc("DISTANCE")+": " + OSRM.Utils.metersToDistance(response.route_summary.total_distance)
|
||||||
|
+ "<br>"
|
||||||
|
+ OSRM.loc("DURATION")+": " + OSRM.Utils.secondsToTime(response.route_summary.total_time)
|
||||||
|
+ "</span>";
|
||||||
|
headline += '<br><br>';
|
||||||
|
|
||||||
|
document.getElementById('information-box-headline').innerHTML = headline;
|
||||||
|
document.getElementById('information-box').innerHTML = "<br><p style='font-size:14px;font-weight:bold;text-align:center;'>"+OSRM.loc("YOUR_ROUTE_IS_BEING_COMPUTED")+".<p>";
|
||||||
|
},
|
||||||
|
|
||||||
|
// no description
|
||||||
|
showNA: function( display_text ) {
|
||||||
|
headline = OSRM.loc("ROUTE_DESCRIPTION")+":<br>";
|
||||||
|
headline += "<span class='route-summary'>"
|
||||||
|
+ OSRM.loc("DISTANCE")+": N/A"
|
||||||
|
+ "<br>"
|
||||||
|
+ OSRM.loc("DURATION")+": N/A"
|
||||||
|
+ "</span>";
|
||||||
|
headline += '<br><br>';
|
||||||
|
|
||||||
|
document.getElementById('information-box-headline').innerHTML = headline;
|
||||||
|
document.getElementById('information-box').innerHTML = "<br><p style='font-size:14px;font-weight:bold;text-align:center;'>"+display_text+".<p>";
|
||||||
|
},
|
||||||
|
|
||||||
|
// map driving instructions to icons
|
||||||
|
// [TODO: language-safe implementation]
|
||||||
|
getDirectionIcon: function(name) {
|
||||||
|
var directions = {
|
||||||
|
"Turn left":"turn-left.png",
|
||||||
|
"Turn right":"turn-right.png",
|
||||||
|
"U-Turn":"u-turn.png",
|
||||||
|
"Head":"continue.png",
|
||||||
|
"Continue":"continue.png",
|
||||||
|
"Turn slight left":"slight-left.png",
|
||||||
|
"Turn slight right":"slight-right.png",
|
||||||
|
"Turn sharp left":"sharp-left.png",
|
||||||
|
"Turn sharp right":"sharp-right.png",
|
||||||
|
"Enter roundabout and leave at first exit":"round-about.png",
|
||||||
|
"Enter roundabout and leave at second exit":"round-about.png",
|
||||||
|
"Enter roundabout and leave at third exit":"round-about.png",
|
||||||
|
"Enter roundabout and leave at fourth exit":"round-about.png",
|
||||||
|
"Enter roundabout and leave at fifth exit":"round-about.png",
|
||||||
|
"Enter roundabout and leave at sixth exit":"round-about.png",
|
||||||
|
"Enter roundabout and leave at seventh exit":"round-about.png",
|
||||||
|
"Enter roundabout and leave at eighth exit":"round-about.png",
|
||||||
|
"Enter roundabout and leave at nineth exit":"round-about.png",
|
||||||
|
"Enter roundabout and leave at tenth exit":"round-about.png",
|
||||||
|
"Enter roundabout and leave at one of the too many exit":"round-about.png",
|
||||||
|
"You have reached your destination":"target.png"
|
||||||
|
};
|
||||||
|
|
||||||
|
if( directions[name] )
|
||||||
|
return directions[name];
|
||||||
|
else
|
||||||
|
return "default.png";
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
@@ -0,0 +1,129 @@
|
|||||||
|
/*
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU AFFERO General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
or see http://www.gnu.org/licenses/agpl.txt.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// OSRM routing
|
||||||
|
// [handles GUI events]
|
||||||
|
|
||||||
|
|
||||||
|
OSRM.RoutingGUI = {
|
||||||
|
|
||||||
|
// click: button "reset"
|
||||||
|
resetRouting: function() {
|
||||||
|
document.getElementById('input-source-name').value = "";
|
||||||
|
document.getElementById('input-target-name').value = "";
|
||||||
|
|
||||||
|
OSRM.G.route.hideAll();
|
||||||
|
OSRM.G.markers.removeAll();
|
||||||
|
OSRM.G.markers.highlight.hide();
|
||||||
|
|
||||||
|
document.getElementById('information-box').innerHTML = "";
|
||||||
|
document.getElementById('information-box-headline').innerHTML = "";
|
||||||
|
|
||||||
|
OSRM.JSONP.reset();
|
||||||
|
},
|
||||||
|
|
||||||
|
// click: button "reverse"
|
||||||
|
reverseRouting: function() {
|
||||||
|
// invert input boxes
|
||||||
|
var tmp = document.getElementById("input-source-name").value;
|
||||||
|
document.getElementById("input-source-name").value = document.getElementById("input-target-name").value;
|
||||||
|
document.getElementById("input-target-name").value = tmp;
|
||||||
|
|
||||||
|
// invert route
|
||||||
|
OSRM.G.markers.route.reverse();
|
||||||
|
if(OSRM.G.markers.route.length == 1) {
|
||||||
|
if(OSRM.G.markers.route[0].label == OSRM.C.TARGET_LABEL) {
|
||||||
|
OSRM.G.markers.route[0].label = OSRM.C.SOURCE_LABEL;
|
||||||
|
OSRM.G.markers.route[0].marker.setIcon( new L.Icon('images/marker-source.png') );
|
||||||
|
} else if(OSRM.G.markers.route[0].label == OSRM.C.SOURCE_LABEL) {
|
||||||
|
OSRM.G.markers.route[0].label = OSRM.C.TARGET_LABEL;
|
||||||
|
OSRM.G.markers.route[0].marker.setIcon( new L.Icon('images/marker-target.png') );
|
||||||
|
}
|
||||||
|
} else if(OSRM.G.markers.route.length > 1){
|
||||||
|
OSRM.G.markers.route[0].label = OSRM.C.SOURCE_LABEL;
|
||||||
|
OSRM.G.markers.route[0].marker.setIcon( new L.Icon('images/marker-source.png') );
|
||||||
|
|
||||||
|
OSRM.G.markers.route[OSRM.G.markers.route.length-1].label = OSRM.C.TARGET_LABEL;
|
||||||
|
OSRM.G.markers.route[OSRM.G.markers.route.length-1].marker.setIcon( new L.Icon('images/marker-target.png') );
|
||||||
|
}
|
||||||
|
|
||||||
|
// recompute route
|
||||||
|
if( OSRM.G.route.isShown() ) {
|
||||||
|
OSRM.Routing.getRoute();
|
||||||
|
OSRM.G.markers.highlight.hide();
|
||||||
|
} else {
|
||||||
|
document.getElementById('information-box').innerHTML = "";
|
||||||
|
document.getElementById('information-box-headline').innerHTML = "";
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
// click: button "show"
|
||||||
|
showMarker: function(marker_id) {
|
||||||
|
if( OSRM.JSONP.fences["geocoder_source"] || OSRM.JSONP.fences["geocoder_target"] )
|
||||||
|
return;
|
||||||
|
|
||||||
|
if( marker_id == OSRM.C.SOURCE_LABEL && OSRM.G.markers.hasSource() )
|
||||||
|
OSRM.G.markers.route[0].centerView();
|
||||||
|
else if( marker_id == OSRM.C.TARGET_LABEL && OSRM.G.markers.hasTarget() )
|
||||||
|
OSRM.G.markers.route[OSRM.G.markers.route.length-1].centerView();
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
// changed: any inputbox (is called when return is pressed [after] or focus is lost [before])
|
||||||
|
inputChanged: function(marker_id) {
|
||||||
|
if( marker_id == OSRM.C.SOURCE_LABEL)
|
||||||
|
OSRM.Geocoder.call(OSRM.C.SOURCE_LABEL, document.getElementById('input-source-name').value);
|
||||||
|
else if( marker_id == OSRM.C.TARGET_LABEL)
|
||||||
|
OSRM.Geocoder.call(OSRM.C.TARGET_LABEL, document.getElementById('input-target-name').value);
|
||||||
|
},
|
||||||
|
|
||||||
|
// click: button "open JOSM"
|
||||||
|
openJOSM: function() {
|
||||||
|
var x = OSRM.G.map.getCenterUI();
|
||||||
|
var ydelta = 0.01;
|
||||||
|
var xdelta = ydelta * 2;
|
||||||
|
var p = [ 'left=' + (x.lng - xdelta), 'bottom=' + (x.lat - ydelta), 'right=' + (x.lng + xdelta), 'top=' + (x.lat + ydelta)];
|
||||||
|
var url = 'http://localhost:8111/load_and_zoom?' + p.join('&');
|
||||||
|
|
||||||
|
var frame = L.DomUtil.create('iframe', null, document.body);
|
||||||
|
frame.style.width = frame.style.height = "0px";
|
||||||
|
frame.src = url;
|
||||||
|
frame.onload = function(e) { document.body.removeChild(frame); };
|
||||||
|
},
|
||||||
|
|
||||||
|
//click: button "open OSM Bugs"
|
||||||
|
openOSMBugs: function() {
|
||||||
|
var position = OSRM.G.map.getCenterUI();
|
||||||
|
window.open( "http://osmbugs.org/?lat="+position.lat.toFixed(6)+"&lon="+position.lng.toFixed(6)+"&zoom="+OSRM.G.map.getZoom() );
|
||||||
|
},
|
||||||
|
|
||||||
|
//click: button "delete marker"
|
||||||
|
deleteMarker: function(marker_id) {
|
||||||
|
var id = null;
|
||||||
|
if(marker_id == 'source' && OSRM.G.markers.hasSource() )
|
||||||
|
id = 0;
|
||||||
|
else if(marker_id == 'target' && OSRM.G.markers.hasTarget() )
|
||||||
|
id = OSRM.G.markers.route.length-1;
|
||||||
|
if( id == null)
|
||||||
|
return;
|
||||||
|
|
||||||
|
OSRM.G.markers.removeMarker( id );
|
||||||
|
OSRM.Routing.getRoute();
|
||||||
|
OSRM.G.markers.highlight.hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
@@ -0,0 +1,71 @@
|
|||||||
|
/*
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU AFFERO General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
or see http://www.gnu.org/licenses/agpl.txt.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// OSRM routing geometry
|
||||||
|
// [renders routing geometry]
|
||||||
|
|
||||||
|
|
||||||
|
OSRM.RoutingGeometry = {
|
||||||
|
|
||||||
|
// show route geometry - if there is a route
|
||||||
|
show: function(response) {
|
||||||
|
var geometry = OSRM.RoutingGeometry._decode(response.route_geometry, 5);
|
||||||
|
|
||||||
|
var positions = [];
|
||||||
|
for( var i=0, size=geometry.length; i < size; i++)
|
||||||
|
positions.push( new L.LatLng(geometry[i][0], geometry[i][1]) );
|
||||||
|
|
||||||
|
OSRM.G.route.showRoute(positions, OSRM.Route.ROUTE);
|
||||||
|
},
|
||||||
|
|
||||||
|
//show route geometry - if there is no route
|
||||||
|
showNA: function() {
|
||||||
|
var positions = [];
|
||||||
|
for(var i=0, size=OSRM.G.markers.route.length; i<size; i++)
|
||||||
|
positions.push( OSRM.G.markers.route[i].getPosition() );
|
||||||
|
|
||||||
|
OSRM.G.route.showRoute(positions, OSRM.Route.NOROUTE);
|
||||||
|
},
|
||||||
|
|
||||||
|
//decode compressed route geometry
|
||||||
|
_decode: function(encoded, precision) {
|
||||||
|
precision = Math.pow(10, -precision);
|
||||||
|
var len = encoded.length, index=0, lat=0, lng = 0, array = [];
|
||||||
|
while (index < len) {
|
||||||
|
var b, shift = 0, result = 0;
|
||||||
|
do {
|
||||||
|
b = encoded.charCodeAt(index++) - 63;
|
||||||
|
result |= (b & 0x1f) << shift;
|
||||||
|
shift += 5;
|
||||||
|
} while (b >= 0x20);
|
||||||
|
var dlat = ((result & 1) ? ~(result >> 1) : (result >> 1));
|
||||||
|
lat += dlat;
|
||||||
|
shift = 0;
|
||||||
|
result = 0;
|
||||||
|
do {
|
||||||
|
b = encoded.charCodeAt(index++) - 63;
|
||||||
|
result |= (b & 0x1f) << shift;
|
||||||
|
shift += 5;
|
||||||
|
} while (b >= 0x20);
|
||||||
|
var dlng = ((result & 1) ? ~(result >> 1) : (result >> 1));
|
||||||
|
lng += dlng;
|
||||||
|
array.push([lat * precision, lng * precision]);
|
||||||
|
}
|
||||||
|
return array;
|
||||||
|
}
|
||||||
|
|
||||||
|
};
|
||||||
@@ -0,0 +1,68 @@
|
|||||||
|
/*
|
||||||
|
This program is free software; you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU AFFERO General Public License as published by
|
||||||
|
the Free Software Foundation; either version 3 of the License, or
|
||||||
|
any later version.
|
||||||
|
|
||||||
|
This program is distributed in the hope that it will be useful,
|
||||||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
GNU General Public License for more details.
|
||||||
|
|
||||||
|
You should have received a copy of the GNU Affero General Public License
|
||||||
|
along with this program; if not, write to the Free Software
|
||||||
|
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
or see http://www.gnu.org/licenses/agpl.txt.
|
||||||
|
*/
|
||||||
|
|
||||||
|
// OSRM routing
|
||||||
|
// [renders route segments that are unnamed streets]
|
||||||
|
|
||||||
|
|
||||||
|
OSRM.RoutingNoNames = {
|
||||||
|
|
||||||
|
// displays route segments that are unnamed streets
|
||||||
|
show: function(response) {
|
||||||
|
// do not display unnamed streets?
|
||||||
|
if( document.getElementById('option-highlight-nonames').checked == false) {
|
||||||
|
OSRM.G.route.hideUnnamedRoute();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// mark geometry positions where unnamed/named streets switch
|
||||||
|
var named = [];
|
||||||
|
for (var i = 0; i < response.route_instructions.length; i++) {
|
||||||
|
if( response.route_instructions[i][1] == '' )
|
||||||
|
named[ response.route_instructions[i][3] ] = false; // no street name
|
||||||
|
else
|
||||||
|
named[ response.route_instructions[i][3] ] = true; // yes street name
|
||||||
|
}
|
||||||
|
|
||||||
|
// aggregate geometry for unnamed streets
|
||||||
|
var geometry = OSRM.RoutingGeometry._decode(response.route_geometry, 5);
|
||||||
|
var is_named = true;
|
||||||
|
var current_positions = [];
|
||||||
|
var all_positions = [];
|
||||||
|
for( var i=0; i < geometry.length; i++) {
|
||||||
|
current_positions.push( new L.LatLng(geometry[i][0], geometry[i][1]) );
|
||||||
|
|
||||||
|
// still named/unnamed?
|
||||||
|
if( (named[i] == is_named || named[i] == undefined) && i != geometry.length-1 )
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// switch between named/unnamed!
|
||||||
|
if(is_named == false)
|
||||||
|
all_positions.push( current_positions );
|
||||||
|
current_positions = [];
|
||||||
|
current_positions.push( new L.LatLng(geometry[i][0], geometry[i][1]) );
|
||||||
|
is_named = named[i];
|
||||||
|
}
|
||||||
|
|
||||||
|
// display unnamed streets
|
||||||
|
OSRM.G.route.showUnnamedRoute(all_positions);
|
||||||
|
},
|
||||||
|
|
||||||
|
showNA: function() {
|
||||||
|
OSRM.G.route.hideUnnamedRoute();
|
||||||
|
}
|
||||||
|
};
|
||||||
@@ -1,195 +0,0 @@
|
|||||||
@ECHO OFF
|
|
||||||
SETLOCAL
|
|
||||||
SET EL=0
|
|
||||||
|
|
||||||
ECHO ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ %~f0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
SET PROJECT_DIR=%CD%
|
|
||||||
ECHO PROJECT_DIR^: %PROJECT_DIR%
|
|
||||||
ECHO NUMBER_OF_PROCESSORS^: %NUMBER_OF_PROCESSORS%
|
|
||||||
|
|
||||||
|
|
||||||
:: Check CMake version
|
|
||||||
SET CMAKE_VERSION=3.9.2
|
|
||||||
SET PATH=%PROJECT_DIR%\cmake-%CMAKE_VERSION%-win32-x86\bin;%PATH%
|
|
||||||
ECHO cmake^: && cmake --version
|
|
||||||
IF %ERRORLEVEL% NEQ 0 ECHO CMAKE not found && GOTO CMAKE_NOT_OK
|
|
||||||
|
|
||||||
cmake --version | findstr /C:%CMAKE_VERSION% && GOTO CMAKE_OK
|
|
||||||
|
|
||||||
:CMAKE_NOT_OK
|
|
||||||
ECHO CMAKE NOT OK - downloading new CMake %CMAKE_VERSION%
|
|
||||||
powershell Invoke-WebRequest https://cmake.org/files/v3.9/cmake-%CMAKE_VERSION%-win32-x86.zip -OutFile $env:PROJECT_DIR\cm.zip
|
|
||||||
IF %ERRORLEVEL% NEQ 0 GOTO ERROR
|
|
||||||
IF NOT EXIST cmake-%CMAKE_VERSION%-win32-x86 7z -y x cm.zip | %windir%\system32\FIND "ing archive"
|
|
||||||
IF %ERRORLEVEL% NEQ 0 GOTO ERROR
|
|
||||||
|
|
||||||
:CMAKE_OK
|
|
||||||
ECHO CMAKE_OK
|
|
||||||
cmake --version
|
|
||||||
|
|
||||||
ECHO activating VS command prompt ...
|
|
||||||
SET PATH=C:\Program Files (x86)\MSBuild\14.0\Bin;%PATH%
|
|
||||||
CALL "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" amd64
|
|
||||||
|
|
||||||
ECHO platform^: %platform%
|
|
||||||
|
|
||||||
ECHO cl.exe version
|
|
||||||
cl
|
|
||||||
ECHO msbuild version
|
|
||||||
msbuild /version
|
|
||||||
|
|
||||||
:: HARDCODE "x64" as it is uppercase on AppVeyor and download from S3 is case sensitive
|
|
||||||
SET DEPSPKG=osrm-deps-win-x64-14.0-2017.09.7z
|
|
||||||
|
|
||||||
:: local development
|
|
||||||
ECHO.
|
|
||||||
ECHO LOCAL_DEV^: %LOCAL_DEV%
|
|
||||||
IF NOT DEFINED LOCAL_DEV SET LOCAL_DEV=0
|
|
||||||
IF DEFINED LOCAL_DEV IF %LOCAL_DEV% EQU 1 IF EXIST %DEPSPKG% ECHO skipping deps download && GOTO SKIPDL
|
|
||||||
|
|
||||||
IF EXIST %DEPSPKG% DEL %DEPSPKG%
|
|
||||||
IF %ERRORLEVEL% NEQ 0 GOTO ERROR
|
|
||||||
|
|
||||||
ECHO downloading %DEPSPKG%
|
|
||||||
powershell Invoke-WebRequest https://mapbox.s3.amazonaws.com/windows-builds/windows-build-deps/$env:DEPSPKG -OutFile $env:PROJECT_DIR\$env:DEPSPKG
|
|
||||||
IF %ERRORLEVEL% NEQ 0 GOTO ERROR
|
|
||||||
|
|
||||||
:SKIPDL
|
|
||||||
|
|
||||||
IF EXIST osrm-deps ECHO deleting osrm-deps... && RD /S /Q osrm-deps
|
|
||||||
IF %ERRORLEVEL% NEQ 0 GOTO ERROR
|
|
||||||
IF EXIST build ECHO deleting build dir... && RD /S /Q build
|
|
||||||
IF %ERRORLEVEL% NEQ 0 GOTO ERROR
|
|
||||||
|
|
||||||
7z -y x %DEPSPKG% | %windir%\system32\FIND "ing archive"
|
|
||||||
IF %ERRORLEVEL% NEQ 0 GOTO ERROR
|
|
||||||
|
|
||||||
::tree osrm-deps
|
|
||||||
|
|
||||||
MKDIR build
|
|
||||||
IF %ERRORLEVEL% NEQ 0 GOTO ERROR
|
|
||||||
cd build
|
|
||||||
IF %ERRORLEVEL% NEQ 0 GOTO ERROR
|
|
||||||
|
|
||||||
SET OSRMDEPSDIR=%PROJECT_DIR%/osrm-deps
|
|
||||||
set PREFIX=%OSRMDEPSDIR%/libs
|
|
||||||
set BOOST_ROOT=%OSRMDEPSDIR%/boost
|
|
||||||
set BOOST_LIBRARYDIR=%BOOST_ROOT%/lib
|
|
||||||
set TBB_INSTALL_DIR=%OSRMDEPSDIR%/tbb
|
|
||||||
set TBB_ARCH_PLATFORM=intel64/vc14
|
|
||||||
|
|
||||||
ECHO OSRMDEPSDIR ^: %OSRMDEPSDIR%
|
|
||||||
ECHO PREFIX ^: %PREFIX%
|
|
||||||
ECHO BOOST_ROOT ^: %BOOST_ROOT%
|
|
||||||
ECHO BOOST_LIBRARYDIR ^: %BOOST_LIBRARYDIR%
|
|
||||||
ECHO TBB_INSTALL_DIR ^: %TBB_INSTALL_DIR%
|
|
||||||
ECHO TBB_ARCH_PLATFORM ^: %TBB_ARCH_PLATFORM%
|
|
||||||
|
|
||||||
|
|
||||||
ECHO calling cmake ....
|
|
||||||
cmake .. ^
|
|
||||||
-G "Visual Studio 14 2015 Win64" ^
|
|
||||||
-DBOOST_ROOT=%BOOST_ROOT% ^
|
|
||||||
-DBOOST_LIBRARYDIR=%BOOST_LIBRARYDIR% ^
|
|
||||||
-DBoost_ADDITIONAL_VERSIONS=1.58 ^
|
|
||||||
-DBoost_USE_MULTITHREADED=ON ^
|
|
||||||
-DBoost_USE_STATIC_LIBS=ON ^
|
|
||||||
-DCMAKE_BUILD_TYPE=%CONFIGURATION% ^
|
|
||||||
-DCMAKE_INSTALL_PREFIX=%PREFIX%
|
|
||||||
IF %ERRORLEVEL% NEQ 0 GOTO ERROR
|
|
||||||
|
|
||||||
ECHO building ...
|
|
||||||
msbuild OSRM.sln ^
|
|
||||||
/p:Configuration=%Configuration% ^
|
|
||||||
/p:Platform=x64 ^
|
|
||||||
/t:rebuild ^
|
|
||||||
/p:BuildInParallel=true ^
|
|
||||||
/m:%NUMBER_OF_PROCESSORS% ^
|
|
||||||
/toolsversion:14.0 ^
|
|
||||||
/p:PlatformToolset=v140 ^
|
|
||||||
/clp:Verbosity=normal ^
|
|
||||||
/nologo ^
|
|
||||||
/flp1:logfile=build_errors.txt;errorsonly ^
|
|
||||||
/flp2:logfile=build_warnings.txt;warningsonly
|
|
||||||
IF %ERRORLEVEL% NEQ 0 GOTO ERROR
|
|
||||||
|
|
||||||
CD %PROJECT_DIR%\build
|
|
||||||
IF %ERRORLEVEL% NEQ 0 GOTO ERROR
|
|
||||||
|
|
||||||
SET PATH=%PROJECT_DIR%\osrm-deps\libs\bin;%PATH%
|
|
||||||
|
|
||||||
ECHO running extractor-tests.exe ...
|
|
||||||
unit_tests\%Configuration%\extractor-tests.exe
|
|
||||||
IF %ERRORLEVEL% NEQ 0 GOTO ERROR
|
|
||||||
|
|
||||||
ECHO running engine-tests.exe ...
|
|
||||||
unit_tests\%Configuration%\engine-tests.exe
|
|
||||||
IF %ERRORLEVEL% NEQ 0 GOTO ERROR
|
|
||||||
|
|
||||||
ECHO running util-tests.exe ...
|
|
||||||
unit_tests\%Configuration%\util-tests.exe
|
|
||||||
IF %ERRORLEVEL% NEQ 0 GOTO ERROR
|
|
||||||
|
|
||||||
ECHO running server-tests.exe ...
|
|
||||||
unit_tests\%Configuration%\server-tests.exe
|
|
||||||
IF %ERRORLEVEL% NEQ 0 GOTO ERROR
|
|
||||||
|
|
||||||
ECHO running library-tests.exe ...
|
|
||||||
SET test_region=monaco
|
|
||||||
SET test_region_ch=ch\monaco
|
|
||||||
SET test_region_corech=corech\monaco
|
|
||||||
SET test_region_mld=mld\monaco
|
|
||||||
SET test_osm=%test_region%.osm.pbf
|
|
||||||
IF NOT EXIST %test_osm% powershell Invoke-WebRequest https://s3.amazonaws.com/mapbox/osrm/testing/monaco.osm.pbf -OutFile %test_osm%
|
|
||||||
%Configuration%\osrm-extract.exe -p ../profiles/car.lua %test_osm%
|
|
||||||
MKDIR ch
|
|
||||||
XCOPY %test_region%.osrm.* ch\
|
|
||||||
XCOPY %test_region%.osrm ch\
|
|
||||||
MKDIR corech
|
|
||||||
XCOPY %test_region%.osrm.* corech\
|
|
||||||
XCOPY %test_region%.osrm corech\
|
|
||||||
MKDIR mld
|
|
||||||
XCOPY %test_region%.osrm.* mld\
|
|
||||||
XCOPY %test_region%.osrm mld\
|
|
||||||
%Configuration%\osrm-contract.exe %test_region_ch%.osrm
|
|
||||||
%Configuration%\osrm-contract.exe --core 0.8 %test_region_corech%.osrm
|
|
||||||
%Configuration%\osrm-partition.exe %test_region_mld%.osrm
|
|
||||||
%Configuration%\osrm-customize.exe %test_region_mld%.osrm
|
|
||||||
XCOPY /Y ch\*.* ..\test\data\ch\
|
|
||||||
XCOPY /Y corech\*.* ..\test\data\corech\
|
|
||||||
XCOPY /Y mld\*.* ..\test\data\mld\
|
|
||||||
unit_tests\%Configuration%\library-tests.exe
|
|
||||||
|
|
||||||
IF NOT "%APPVEYOR_REPO_BRANCH%"=="master" GOTO DONE
|
|
||||||
ECHO ========= CREATING PACKAGES ==========
|
|
||||||
|
|
||||||
CD %PROJECT_DIR%\build\%Configuration%
|
|
||||||
IF %ERRORLEVEL% NEQ 0 GOTO ERROR
|
|
||||||
|
|
||||||
SET P=%PROJECT_DIR%
|
|
||||||
SET ZIP= %P%\osrm_%Configuration%.zip
|
|
||||||
IF EXIST %ZIP% ECHO deleting %ZIP% && DEL /F /Q %ZIP%
|
|
||||||
IF %ERRORLEVEL% NEQ 0 ECHO deleting %ZIP% FAILED && GOTO ERROR
|
|
||||||
|
|
||||||
7z a %ZIP% *.lib *.exe *.pdb %P%/osrm-deps/libs/bin/*.dll -tzip -mx9 | %windir%\system32\FIND "ing archive"
|
|
||||||
IF %ERRORLEVEL% NEQ 0 GOTO ERROR
|
|
||||||
|
|
||||||
CD ..\..\profiles
|
|
||||||
IF %ERRORLEVEL% NEQ 0 GOTO ERROR
|
|
||||||
|
|
||||||
ECHO disk=c:\temp\stxxl,10000,wincall > .stxxl.txt
|
|
||||||
7z a %ZIP% * -tzip -mx9 | %windir%\system32\FIND "ing archive"
|
|
||||||
IF %ERRORLEVEL% NEQ 0 GOTO ERROR
|
|
||||||
|
|
||||||
GOTO DONE
|
|
||||||
|
|
||||||
:ERROR
|
|
||||||
ECHO ~~~~~~~~~~~~~~~~~~~~~~ ERROR %~f0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
ECHO ERRORLEVEL^: %ERRORLEVEL%
|
|
||||||
SET EL=%ERRORLEVEL%
|
|
||||||
|
|
||||||
:DONE
|
|
||||||
ECHO ~~~~~~~~~~~~~~~~~~~~~~ DONE %~f0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
EXIT /b %EL%
|
|
||||||
@@ -1,52 +0,0 @@
|
|||||||
environment:
|
|
||||||
matrix:
|
|
||||||
- configuration: Release
|
|
||||||
# - configuration: Debug
|
|
||||||
|
|
||||||
install:
|
|
||||||
- ps: Install-Product node 6
|
|
||||||
|
|
||||||
# scripts that are called at very beginning, before repo cloning
|
|
||||||
init:
|
|
||||||
- git config --global core.autocrlf input
|
|
||||||
|
|
||||||
os: Visual Studio 2015
|
|
||||||
|
|
||||||
# clone directory
|
|
||||||
clone_folder: c:\projects\osrm
|
|
||||||
|
|
||||||
platform: x64
|
|
||||||
|
|
||||||
build_script:
|
|
||||||
- CALL appveyor-build.bat
|
|
||||||
|
|
||||||
before_test:
|
|
||||||
- node --version
|
|
||||||
- npm --version
|
|
||||||
- npm install --ignore-scripts
|
|
||||||
- npm link --ignore-scripts
|
|
||||||
- SET PATH=%CD%\osrm-deps\libs\bin;%PATH%
|
|
||||||
- SET OSRM_BUILD_DIR=build\%Configuration%
|
|
||||||
- npm test
|
|
||||||
|
|
||||||
artifacts:
|
|
||||||
- path: osrm_Release.zip
|
|
||||||
name: osrm_Release.zip
|
|
||||||
# - path: osrm_Debug.zip
|
|
||||||
# name: osrm_Debug.zip
|
|
||||||
|
|
||||||
branches:
|
|
||||||
only:
|
|
||||||
- master
|
|
||||||
|
|
||||||
deploy:
|
|
||||||
provider: FTP
|
|
||||||
server:
|
|
||||||
secure: ef7oiQTTXFGt8NdNiOHm/uRFVrUttzyFbIlnaeHhQvw=
|
|
||||||
username:
|
|
||||||
secure: Bw+Se2GTJxA6+GtRkEc//tQSBHOuFIuJHBjFwR9cD+8=
|
|
||||||
password:
|
|
||||||
secure: eqwESZqxMXC/j5mOCpaXuw==
|
|
||||||
folder: /
|
|
||||||
enable_ssl: true
|
|
||||||
active_mode: false
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
@ECHO OFF
|
|
||||||
SETLOCAL
|
|
||||||
SET EL=0
|
|
||||||
|
|
||||||
ECHO ~~~~~~~~~~~~~~~~~~~~~~~~~~~~ %~f0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
SET PLATFORM=x64
|
|
||||||
SET CONFIGURATION=Release
|
|
||||||
::SET LOCAL_DEV=1
|
|
||||||
|
|
||||||
FOR /F "tokens=*" %%i in ('git rev-parse --abbrev-ref HEAD') do SET APPVEYOR_REPO_BRANCH=%%i
|
|
||||||
ECHO APPVEYOR_REPO_BRANCH^: %APPVEYOR_REPO_BRANCH%
|
|
||||||
|
|
||||||
SET PATH=C:\mb\windows-builds-64\tmp-bin\cmake-3.7.0-rc2-win32-x86\bin;%PATH%
|
|
||||||
SET PATH=C:\Program Files\7-Zip;%PATH%
|
|
||||||
|
|
||||||
powershell Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy Unrestricted -Force
|
|
||||||
IF %ERRORLEVEL% NEQ 0 GOTO ERROR
|
|
||||||
CALL appveyor-build.bat
|
|
||||||
IF %ERRORLEVEL% NEQ 0 GOTO ERROR
|
|
||||||
|
|
||||||
GOTO DONE
|
|
||||||
|
|
||||||
|
|
||||||
:ERROR
|
|
||||||
ECHO ~~~~~~~~~~~~~~~~~~~~~~ ERROR %~f0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
ECHO ERRORLEVEL^: %ERRORLEVEL%
|
|
||||||
SET EL=%ERRORLEVEL%
|
|
||||||
|
|
||||||
:DONE
|
|
||||||
ECHO ~~~~~~~~~~~~~~~~~~~~~~ DONE %~f0 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
||||||
|
|
||||||
EXIT /b %EL%
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
{
|
|
||||||
"AWSTemplateFormatVersion": "2010-09-09",
|
|
||||||
"Description": "user for publishing to s3://mapbox-node-binary/osrm",
|
|
||||||
"Resources": {
|
|
||||||
"User": {
|
|
||||||
"Type": "AWS::IAM::User",
|
|
||||||
"Properties": {
|
|
||||||
"Policies": [
|
|
||||||
{
|
|
||||||
"PolicyName": "list",
|
|
||||||
"PolicyDocument": {
|
|
||||||
"Statement": [
|
|
||||||
{
|
|
||||||
"Action": [
|
|
||||||
"s3:ListBucket"
|
|
||||||
],
|
|
||||||
"Effect": "Allow",
|
|
||||||
"Resource": "arn:aws:s3:::mapbox-node-binary",
|
|
||||||
"Condition": {
|
|
||||||
"StringLike": {
|
|
||||||
"s3:prefix": [
|
|
||||||
"osrm/*"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"PolicyName": "publish",
|
|
||||||
"PolicyDocument": {
|
|
||||||
"Statement": [
|
|
||||||
{
|
|
||||||
"Action": [
|
|
||||||
"s3:DeleteObject",
|
|
||||||
"s3:GetObject",
|
|
||||||
"s3:GetObjectAcl",
|
|
||||||
"s3:PutObject",
|
|
||||||
"s3:PutObjectAcl"
|
|
||||||
],
|
|
||||||
"Effect": "Allow",
|
|
||||||
"Resource": "arn:aws:s3:::mapbox-node-binary/osrm/*"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"AccessKey": {
|
|
||||||
"Type": "AWS::IAM::AccessKey",
|
|
||||||
"Properties": {
|
|
||||||
"UserName": {
|
|
||||||
"Ref": "User"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"Outputs": {
|
|
||||||
"AccessKeyId": {
|
|
||||||
"Value": {
|
|
||||||
"Ref": "AccessKey"
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"SecretAccessKey": {
|
|
||||||
"Value": {
|
|
||||||
"Fn::GetAtt": [
|
|
||||||
"AccessKey",
|
|
||||||
"SecretAccessKey"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,59 +0,0 @@
|
|||||||
var cf = require('@mapbox/cloudfriend');
|
|
||||||
var package_json = require('../package.json')
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
AWSTemplateFormatVersion: '2010-09-09',
|
|
||||||
Description: 'user for publishing to s3://mapbox-node-binary/' + package_json.name,
|
|
||||||
Resources: {
|
|
||||||
User: {
|
|
||||||
Type: 'AWS::IAM::User',
|
|
||||||
Properties: {
|
|
||||||
Policies: [
|
|
||||||
{
|
|
||||||
PolicyName: 'list',
|
|
||||||
PolicyDocument: {
|
|
||||||
Statement: [
|
|
||||||
{
|
|
||||||
Action: ['s3:ListBucket'],
|
|
||||||
Effect: 'Allow',
|
|
||||||
Resource: 'arn:aws:s3:::mapbox-node-binary',
|
|
||||||
Condition : {
|
|
||||||
StringLike : {
|
|
||||||
"s3:prefix": [ package_json.name + "/*"]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
{
|
|
||||||
PolicyName: 'publish',
|
|
||||||
PolicyDocument: {
|
|
||||||
Statement: [
|
|
||||||
{
|
|
||||||
Action: ['s3:DeleteObject', 's3:GetObject', 's3:GetObjectAcl', 's3:PutObject', 's3:PutObjectAcl'],
|
|
||||||
Effect: 'Allow',
|
|
||||||
Resource: 'arn:aws:s3:::mapbox-node-binary/' + package_json.name + '/*'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
AccessKey: {
|
|
||||||
Type: 'AWS::IAM::AccessKey',
|
|
||||||
Properties: {
|
|
||||||
UserName: cf.ref('User')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
Outputs: {
|
|
||||||
AccessKeyId: {
|
|
||||||
Value: cf.ref('AccessKey')
|
|
||||||
},
|
|
||||||
SecretAccessKey: {
|
|
||||||
Value: cf.getAtt('AccessKey', 'SecretAccessKey')
|
|
||||||
}
|
|
||||||
}
|
|
||||||
};
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
IF(NOT CMAKE_SYSTEM_NAME STREQUAL "Linux")
|
|
||||||
MESSAGE(FATAL_ERROR "Cannot configure CPack to generate Debian/RPM packages on non-linux systems.")
|
|
||||||
ENDIF()
|
|
||||||
string(TOLOWER "${CMAKE_PROJECT_NAME}" CPACK_PACKAGE_NAME)
|
|
||||||
SET(CPACK_PACKAGE_VERSION_MAJOR ${OSRM_VERSION_MAJOR})
|
|
||||||
SET(CPACK_PACKAGE_VERSION_MINOR ${OSRM_VERSION_MINOR})
|
|
||||||
SET(CPACK_PACKAGE_VERSION_PATCH ${OSRM_VERSION_PATCH})
|
|
||||||
SET(CPACK_PACKAGE_VERSION "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
|
|
||||||
|
|
||||||
SET(CPACK_INCLUDE_TOPLEVEL_DIRECTORY "FALSE")
|
|
||||||
SET(CPACK_PACKAGE_DESCRIPTION_FILE "${CMAKE_SOURCE_DIR}/README.md")
|
|
||||||
SET(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Open Source Routing Machine (OSRM) is a high-performance routing engine. It combines sophisticated routing algorithms with the open and free data of the OpenStreetMap.")
|
|
||||||
SET(CPACK_PACKAGE_CONTACT "Project OSRM <info@project-osrm.org>")
|
|
||||||
SET(CPACK_RESOURCE_FILE_LICENSE "${CMAKE_SOURCE_DIR}/LICENCE.TXT")
|
|
||||||
|
|
||||||
SET(CPACK_STRIP_FILES "TRUE")
|
|
||||||
file(GLOB_RECURSE ProfileGlob ${CMAKE_SOURCE_DIR}/profiles/*)
|
|
||||||
install(FILES ${ProfileGlob} DESTINATION "share/doc/${CPACK_PACKAGE_NAME}/profiles")
|
|
||||||
|
|
||||||
find_program(DPKG_PROGRAM dpkg DOC "dpkg program of Debian-based systems")
|
|
||||||
if(DPKG_PROGRAM)
|
|
||||||
SET(CPACK_GENERATOR "DEB")
|
|
||||||
execute_process(
|
|
||||||
COMMAND ${DPKG_PROGRAM} --print-architecture
|
|
||||||
OUTPUT_VARIABLE CPACK_DEBIAN_PACKAGE_ARCHITECTURE
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
||||||
)
|
|
||||||
SET(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}_${CPACK_PACKAGE_VERSION}_${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}")
|
|
||||||
SET(CPACK_DEBIAN_PACKAGE_SHLIBDEPS "ON")
|
|
||||||
else(DPKG_PROGRAM)
|
|
||||||
find_program(RPM_PROGRAM rpm DOC "rpm RPM-based systems")
|
|
||||||
find_program(RPMBUILD_PROGRAM rpm DOC "rpm RPM-based systems")
|
|
||||||
if(RPMBUILD_PROGRAM)
|
|
||||||
SET(CPACK_GENERATOR "RPM")
|
|
||||||
execute_process(
|
|
||||||
COMMAND ${RPM_PROGRAM} --eval %{_arch}
|
|
||||||
OUTPUT_VARIABLE CPACK_RPM_PACKAGE_ARCHITECTURE
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
||||||
)
|
|
||||||
SET(CPACK_PACKAGE_FILE_NAME "${CPACK_PACKAGE_NAME}_${CPACK_PACKAGE_VERSION}.${CPACK_RPM_PACKAGE_ARCHITECTURE}")
|
|
||||||
# Exclude /usr/lib64/pkgconfig directory given that it is already owned by the pkg-config rpm package.
|
|
||||||
SET(CPACK_RPM_EXCLUDE_FROM_AUTO_FILELIST_ADDITION "/usr/${CMAKE_INSTALL_LIBDIR}/pkgconfig")
|
|
||||||
endif(RPMBUILD_PROGRAM)
|
|
||||||
endif(DPKG_PROGRAM)
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
# - Check whether the CXX compiler supports a given flag.
|
|
||||||
# CHECK_CXX_COMPILER_FLAG(<flag> <var>)
|
|
||||||
# <flag> - the compiler flag
|
|
||||||
# <var> - variable to store the result
|
|
||||||
# This internally calls the check_cxx_source_compiles macro. See help
|
|
||||||
# for CheckCXXSourceCompiles for a listing of variables that can
|
|
||||||
# modify the build.
|
|
||||||
|
|
||||||
# Copyright (c) 2006, Alexander Neundorf, <neundorf@kde.org>
|
|
||||||
#
|
|
||||||
# Redistribution and use is allowed according to the terms of the BSD license.
|
|
||||||
# For details see the accompanying COPYING-CMAKE-SCRIPTS file.
|
|
||||||
|
|
||||||
|
|
||||||
INCLUDE(CheckCXXSourceCompiles)
|
|
||||||
|
|
||||||
MACRO (CHECK_CXX_COMPILER_FLAG _FLAG _RESULT)
|
|
||||||
SET(SAFE_CMAKE_REQUIRED_DEFINITIONS "${CMAKE_REQUIRED_DEFINITIONS}")
|
|
||||||
SET(CMAKE_REQUIRED_DEFINITIONS "${_FLAG}")
|
|
||||||
CHECK_CXX_SOURCE_COMPILES("int main() { return 0;}" ${_RESULT}
|
|
||||||
# Some compilers do not fail with a bad flag
|
|
||||||
FAIL_REGEX "unrecognized .*option" # GNU
|
|
||||||
FAIL_REGEX "ignoring unknown option" # MSVC
|
|
||||||
FAIL_REGEX "[Uu]nknown option" # HP
|
|
||||||
FAIL_REGEX "[Ww]arning: [Oo]ption" # SunPro
|
|
||||||
FAIL_REGEX "command option .* is not recognized" # XL
|
|
||||||
)
|
|
||||||
SET (CMAKE_REQUIRED_DEFINITIONS "${SAFE_CMAKE_REQUIRED_DEFINITIONS}")
|
|
||||||
ENDMACRO (CHECK_CXX_COMPILER_FLAG)
|
|
||||||
@@ -1,19 +0,0 @@
|
|||||||
#
|
|
||||||
# Copyright (C) 2013 Emmanuel Roullit <emmanuel.roullit@gmail.com>
|
|
||||||
#
|
|
||||||
|
|
||||||
IF(NOT CPACK_DEBIAN_PACKAGE_ARCHITECTURE)
|
|
||||||
FIND_PROGRAM(DPKG_CMD dpkg)
|
|
||||||
IF(NOT DPKG_CMD)
|
|
||||||
EXECUTE_PROCESS(COMMAND uname -p
|
|
||||||
OUTPUT_VARIABLE CPACK_DEBIAN_PACKAGE_ARCHITECTURE
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
||||||
)
|
|
||||||
MESSAGE(STATUS "Can not find dpkg in your path, default to uname -p: ${CPACK_DEBIAN_PACKAGE_ARCHITECTURE}.")
|
|
||||||
ELSE(NOT DPKG_CMD)
|
|
||||||
EXECUTE_PROCESS(COMMAND "${DPKG_CMD}" --print-architecture
|
|
||||||
OUTPUT_VARIABLE CPACK_DEBIAN_PACKAGE_ARCHITECTURE
|
|
||||||
OUTPUT_STRIP_TRAILING_WHITESPACE
|
|
||||||
)
|
|
||||||
ENDIF(NOT DPKG_CMD)
|
|
||||||
ENDIF(NOT CPACK_DEBIAN_PACKAGE_ARCHITECTURE)
|
|
||||||
@@ -1,202 +0,0 @@
|
|||||||
# Distributed under the OSI-approved BSD 3-Clause License. See accompanying
|
|
||||||
# file Copyright.txt or https://cmake.org/licensing for details.
|
|
||||||
|
|
||||||
#.rst:
|
|
||||||
# FindLua
|
|
||||||
# -------
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# Locate Lua library This module defines
|
|
||||||
#
|
|
||||||
# ::
|
|
||||||
#
|
|
||||||
# LUA_FOUND - if false, do not try to link to Lua
|
|
||||||
# LUA_LIBRARIES - both lua and lualib
|
|
||||||
# LUA_INCLUDE_DIR - where to find lua.h
|
|
||||||
# LUA_VERSION_STRING - the version of Lua found
|
|
||||||
# LUA_VERSION_MAJOR - the major version of Lua
|
|
||||||
# LUA_VERSION_MINOR - the minor version of Lua
|
|
||||||
# LUA_VERSION_PATCH - the patch version of Lua
|
|
||||||
#
|
|
||||||
#
|
|
||||||
#
|
|
||||||
# Note that the expected include convention is
|
|
||||||
#
|
|
||||||
# ::
|
|
||||||
#
|
|
||||||
# #include "lua.h"
|
|
||||||
#
|
|
||||||
# and not
|
|
||||||
#
|
|
||||||
# ::
|
|
||||||
#
|
|
||||||
# #include <lua/lua.h>
|
|
||||||
#
|
|
||||||
# This is because, the lua location is not standardized and may exist in
|
|
||||||
# locations other than lua/
|
|
||||||
|
|
||||||
include(FindPkgConfig)
|
|
||||||
|
|
||||||
unset(_lua_include_subdirs)
|
|
||||||
unset(_lua_library_names)
|
|
||||||
unset(_lua_append_versions)
|
|
||||||
|
|
||||||
# this is a function only to have all the variables inside go away automatically
|
|
||||||
function(_lua_set_version_vars)
|
|
||||||
set(LUA_VERSIONS5 5.3 5.2 5.1 5.0)
|
|
||||||
|
|
||||||
if (Lua_FIND_VERSION_EXACT)
|
|
||||||
if (Lua_FIND_VERSION_COUNT GREATER 1)
|
|
||||||
set(_lua_append_versions ${Lua_FIND_VERSION_MAJOR}.${Lua_FIND_VERSION_MINOR})
|
|
||||||
endif ()
|
|
||||||
elseif (Lua_FIND_VERSION)
|
|
||||||
# once there is a different major version supported this should become a loop
|
|
||||||
if (NOT Lua_FIND_VERSION_MAJOR GREATER 5)
|
|
||||||
if (Lua_FIND_VERSION_COUNT EQUAL 1)
|
|
||||||
set(_lua_append_versions ${LUA_VERSIONS5})
|
|
||||||
else ()
|
|
||||||
foreach (subver IN LISTS LUA_VERSIONS5)
|
|
||||||
if (NOT subver VERSION_LESS ${Lua_FIND_VERSION})
|
|
||||||
list(APPEND _lua_append_versions ${subver})
|
|
||||||
endif ()
|
|
||||||
endforeach ()
|
|
||||||
endif ()
|
|
||||||
endif ()
|
|
||||||
else ()
|
|
||||||
# once there is a different major version supported this should become a loop
|
|
||||||
set(_lua_append_versions ${LUA_VERSIONS5})
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
list(APPEND _lua_include_subdirs "include/lua" "include")
|
|
||||||
|
|
||||||
foreach (ver IN LISTS _lua_append_versions)
|
|
||||||
string(REGEX MATCH "^([0-9]+)\\.([0-9]+)$" _ver "${ver}")
|
|
||||||
list(APPEND _lua_include_subdirs
|
|
||||||
include/lua${CMAKE_MATCH_1}${CMAKE_MATCH_2}
|
|
||||||
include/lua${CMAKE_MATCH_1}.${CMAKE_MATCH_2}
|
|
||||||
include/lua-${CMAKE_MATCH_1}.${CMAKE_MATCH_2}
|
|
||||||
)
|
|
||||||
list(APPEND _lua_library_names
|
|
||||||
lua${CMAKE_MATCH_1}${CMAKE_MATCH_2}
|
|
||||||
lua${CMAKE_MATCH_1}.${CMAKE_MATCH_2}
|
|
||||||
lua-${CMAKE_MATCH_1}.${CMAKE_MATCH_2}
|
|
||||||
lua.${CMAKE_MATCH_1}.${CMAKE_MATCH_2}
|
|
||||||
)
|
|
||||||
pkg_check_modules(LUA QUIET "lua${ver}")
|
|
||||||
list(APPEND _lua_include_subdirs ${LUA_INCLUDE_DIRS})
|
|
||||||
list(APPEND _lua_library_names ${LUA_LIBRARIES})
|
|
||||||
list(APPEND _lua_library_dirs ${LUA_LIBRARY_DIRS})
|
|
||||||
endforeach ()
|
|
||||||
|
|
||||||
set(_lua_include_subdirs "${_lua_include_subdirs}" PARENT_SCOPE)
|
|
||||||
set(_lua_library_names "${_lua_library_names}" PARENT_SCOPE)
|
|
||||||
set(_lua_append_versions "${_lua_append_versions}" PARENT_SCOPE)
|
|
||||||
set(_lua_library_dirs "${_lua_library_dirs}" PARENT_SCOPE)
|
|
||||||
endfunction(_lua_set_version_vars)
|
|
||||||
|
|
||||||
function(_lua_check_header_version _hdr_file)
|
|
||||||
# At least 5.[012] have different ways to express the version
|
|
||||||
# so all of them need to be tested. Lua 5.2 defines LUA_VERSION
|
|
||||||
# and LUA_RELEASE as joined by the C preprocessor, so avoid those.
|
|
||||||
file(STRINGS "${_hdr_file}" lua_version_strings
|
|
||||||
REGEX "^#define[ \t]+LUA_(RELEASE[ \t]+\"Lua [0-9]|VERSION([ \t]+\"Lua [0-9]|_[MR])).*")
|
|
||||||
|
|
||||||
string(REGEX REPLACE ".*;#define[ \t]+LUA_VERSION_MAJOR[ \t]+\"([0-9])\"[ \t]*;.*" "\\1" LUA_VERSION_MAJOR ";${lua_version_strings};")
|
|
||||||
if (LUA_VERSION_MAJOR MATCHES "^[0-9]+$")
|
|
||||||
string(REGEX REPLACE ".*;#define[ \t]+LUA_VERSION_MINOR[ \t]+\"([0-9])\"[ \t]*;.*" "\\1" LUA_VERSION_MINOR ";${lua_version_strings};")
|
|
||||||
string(REGEX REPLACE ".*;#define[ \t]+LUA_VERSION_RELEASE[ \t]+\"([0-9])\"[ \t]*;.*" "\\1" LUA_VERSION_PATCH ";${lua_version_strings};")
|
|
||||||
set(LUA_VERSION_STRING "${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}.${LUA_VERSION_PATCH}")
|
|
||||||
else ()
|
|
||||||
string(REGEX REPLACE ".*;#define[ \t]+LUA_RELEASE[ \t]+\"Lua ([0-9.]+)\"[ \t]*;.*" "\\1" LUA_VERSION_STRING ";${lua_version_strings};")
|
|
||||||
if (NOT LUA_VERSION_STRING MATCHES "^[0-9.]+$")
|
|
||||||
string(REGEX REPLACE ".*;#define[ \t]+LUA_VERSION[ \t]+\"Lua ([0-9.]+)\"[ \t]*;.*" "\\1" LUA_VERSION_STRING ";${lua_version_strings};")
|
|
||||||
endif ()
|
|
||||||
string(REGEX REPLACE "^([0-9]+)\\.[0-9.]*$" "\\1" LUA_VERSION_MAJOR "${LUA_VERSION_STRING}")
|
|
||||||
string(REGEX REPLACE "^[0-9]+\\.([0-9]+)[0-9.]*$" "\\1" LUA_VERSION_MINOR "${LUA_VERSION_STRING}")
|
|
||||||
string(REGEX REPLACE "^[0-9]+\\.[0-9]+\\.([0-9]).*" "\\1" LUA_VERSION_PATCH "${LUA_VERSION_STRING}")
|
|
||||||
endif ()
|
|
||||||
foreach (ver IN LISTS _lua_append_versions)
|
|
||||||
if (ver STREQUAL "${LUA_VERSION_MAJOR}.${LUA_VERSION_MINOR}")
|
|
||||||
set(LUA_VERSION_MAJOR ${LUA_VERSION_MAJOR} PARENT_SCOPE)
|
|
||||||
set(LUA_VERSION_MINOR ${LUA_VERSION_MINOR} PARENT_SCOPE)
|
|
||||||
set(LUA_VERSION_PATCH ${LUA_VERSION_PATCH} PARENT_SCOPE)
|
|
||||||
set(LUA_VERSION_STRING ${LUA_VERSION_STRING} PARENT_SCOPE)
|
|
||||||
return()
|
|
||||||
endif ()
|
|
||||||
endforeach ()
|
|
||||||
endfunction(_lua_check_header_version)
|
|
||||||
|
|
||||||
_lua_set_version_vars()
|
|
||||||
|
|
||||||
if (LUA_INCLUDE_DIR AND EXISTS "${LUA_INCLUDE_DIR}/lua.h")
|
|
||||||
_lua_check_header_version("${LUA_INCLUDE_DIR}/lua.h")
|
|
||||||
endif ()
|
|
||||||
|
|
||||||
if (NOT LUA_VERSION_STRING)
|
|
||||||
foreach (subdir IN LISTS _lua_include_subdirs)
|
|
||||||
unset(LUA_INCLUDE_PREFIX CACHE)
|
|
||||||
find_path(LUA_INCLUDE_PREFIX ${subdir}/lua.h
|
|
||||||
HINTS
|
|
||||||
ENV LUA_DIR
|
|
||||||
PATHS
|
|
||||||
~/Library/Frameworks
|
|
||||||
/Library/Frameworks
|
|
||||||
/sw # Fink
|
|
||||||
/opt/local # DarwinPorts
|
|
||||||
/opt/csw # Blastwave
|
|
||||||
/opt
|
|
||||||
)
|
|
||||||
if (LUA_INCLUDE_PREFIX)
|
|
||||||
_lua_check_header_version("${LUA_INCLUDE_PREFIX}/${subdir}/lua.h")
|
|
||||||
if (LUA_VERSION_STRING)
|
|
||||||
set(LUA_INCLUDE_DIR "${LUA_INCLUDE_PREFIX}/${subdir}")
|
|
||||||
break()
|
|
||||||
endif ()
|
|
||||||
endif ()
|
|
||||||
endforeach ()
|
|
||||||
endif ()
|
|
||||||
unset(_lua_include_subdirs)
|
|
||||||
unset(_lua_append_versions)
|
|
||||||
|
|
||||||
find_library(LUA_LIBRARY
|
|
||||||
NAMES ${_lua_library_names} lua
|
|
||||||
HINTS
|
|
||||||
ENV LUA_DIR
|
|
||||||
PATH_SUFFIXES lib
|
|
||||||
PATHS
|
|
||||||
${_lua_library_dirs}
|
|
||||||
~/Library/Frameworks
|
|
||||||
/Library/Frameworks
|
|
||||||
/sw
|
|
||||||
/opt/local
|
|
||||||
/opt/csw
|
|
||||||
/opt
|
|
||||||
)
|
|
||||||
unset(_lua_library_names)
|
|
||||||
|
|
||||||
if (LUA_LIBRARY)
|
|
||||||
# include the math library for Unix
|
|
||||||
if (UNIX AND NOT APPLE AND NOT BEOS)
|
|
||||||
find_library(LUA_MATH_LIBRARY m)
|
|
||||||
set(LUA_LIBRARIES "${LUA_LIBRARY};${LUA_MATH_LIBRARY}")
|
|
||||||
|
|
||||||
# include dl library for statically-linked Lua library
|
|
||||||
get_filename_component(LUA_LIB_EXT ${LUA_LIBRARY} EXT)
|
|
||||||
if(LUA_LIB_EXT STREQUAL CMAKE_STATIC_LIBRARY_SUFFIX)
|
|
||||||
list(APPEND LUA_LIBRARIES ${CMAKE_DL_LIBS})
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# For Windows and Mac, don't need to explicitly include the math library
|
|
||||||
else ()
|
|
||||||
set(LUA_LIBRARIES "${LUA_LIBRARY}")
|
|
||||||
endif ()
|
|
||||||
endif ()
|
|
||||||
include(FindPackageHandleStandardArgs)
|
|
||||||
# handle the QUIETLY and REQUIRED arguments and set LUA_FOUND to TRUE if
|
|
||||||
# all listed variables are TRUE
|
|
||||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(Lua
|
|
||||||
REQUIRED_VARS LUA_LIBRARIES LUA_INCLUDE_DIR
|
|
||||||
VERSION_VAR LUA_VERSION_STRING)
|
|
||||||
|
|
||||||
mark_as_advanced(LUA_INCLUDE_DIR LUA_LIBRARY LUA_MATH_LIBRARY)
|
|
||||||
@@ -1,51 +0,0 @@
|
|||||||
# Locate STXXL library
|
|
||||||
# This module defines
|
|
||||||
# STXXL_FOUND, if false, do not try to link to libstxxl
|
|
||||||
# STXXL_LIBRARY
|
|
||||||
# STXXL_INCLUDE_DIR, where to find stxxl.h
|
|
||||||
#
|
|
||||||
|
|
||||||
|
|
||||||
IF( NOT STXXL_FIND_QUIETLY )
|
|
||||||
MESSAGE(STATUS "Looking for STXXL...")
|
|
||||||
ENDIF()
|
|
||||||
|
|
||||||
FIND_PATH(STXXL_INCLUDE_DIR stxxl.h
|
|
||||||
HINTS
|
|
||||||
$ENV{STXXL_DIR}
|
|
||||||
PATH_SUFFIXES stxxl include/stxxl/stxxl include/stxxl include
|
|
||||||
PATHS
|
|
||||||
~/Library/Frameworks
|
|
||||||
/Library/Frameworks
|
|
||||||
/usr/local
|
|
||||||
/usr
|
|
||||||
/opt/local # DarwinPorts
|
|
||||||
/opt
|
|
||||||
)
|
|
||||||
|
|
||||||
FIND_LIBRARY(STXXL_LIBRARY
|
|
||||||
NAMES stxxl stxxl_debug
|
|
||||||
HINTS
|
|
||||||
$ENV{STXXL_DIR}
|
|
||||||
PATH_SUFFIXES lib64 lib
|
|
||||||
PATHS
|
|
||||||
~/Library/Frameworks
|
|
||||||
/Library/Frameworks
|
|
||||||
/usr/local
|
|
||||||
/usr
|
|
||||||
/opt/local
|
|
||||||
/opt
|
|
||||||
)
|
|
||||||
|
|
||||||
INCLUDE(FindPackageHandleStandardArgs)
|
|
||||||
# handle the QUIETLY and REQUIRED arguments and set STXXL_FOUND to TRUE if
|
|
||||||
# all listed variables are TRUE
|
|
||||||
FIND_PACKAGE_HANDLE_STANDARD_ARGS(STXXL DEFAULT_MSG STXXL_LIBRARY STXXL_INCLUDE_DIR)
|
|
||||||
|
|
||||||
IF( NOT STXXL_FIND_QUIETLY )
|
|
||||||
IF( STXXL_FOUND )
|
|
||||||
MESSAGE(STATUS "Found STXXL: ${STXXL_LIBRARY}" )
|
|
||||||
ENDIF()
|
|
||||||
ENDIF()
|
|
||||||
|
|
||||||
MARK_AS_ADVANCED(STXXL_INCLUDE_DIR STXXL_LIBRARY)
|
|
||||||
@@ -1,21 +0,0 @@
|
|||||||
# - Try to find Shapefile C Library
|
|
||||||
# http://shapelib.maptools.org/
|
|
||||||
#
|
|
||||||
# Exports:
|
|
||||||
# Shapefile_FOUND
|
|
||||||
# LIBSHAPEFILE_INCLUDE_DIR
|
|
||||||
# LIBSHAPEFILE_LIBRARY
|
|
||||||
# Hints:
|
|
||||||
# LIBSHAPEFILE_LIBRARY_DIR
|
|
||||||
|
|
||||||
find_path(LIBSHAPEFILE_INCLUDE_DIR
|
|
||||||
shapefil.h)
|
|
||||||
|
|
||||||
find_library(LIBSHAPEFILE_LIBRARY
|
|
||||||
NAMES shp
|
|
||||||
HINTS "${LIBSHAPEFILE_LIBRARY_DIR}")
|
|
||||||
|
|
||||||
include(FindPackageHandleStandardArgs)
|
|
||||||
find_package_handle_standard_args(Shapefile DEFAULT_MSG
|
|
||||||
LIBSHAPEFILE_LIBRARY LIBSHAPEFILE_INCLUDE_DIR)
|
|
||||||
mark_as_advanced(LIBSHAPEFILE_INCLUDE_DIR LIBSHAPEFILE_LIBRARY)
|
|
||||||
@@ -1,286 +0,0 @@
|
|||||||
# Locate Intel Threading Building Blocks include paths and libraries
|
|
||||||
# FindTBB.cmake can be found at https://code.google.com/p/findtbb/
|
|
||||||
# Written by Hannes Hofmann <hannes.hofmann _at_ informatik.uni-erlangen.de>
|
|
||||||
# Improvements by Gino van den Bergen <gino _at_ dtecta.com>,
|
|
||||||
# Florian Uhlig <F.Uhlig _at_ gsi.de>,
|
|
||||||
# Jiri Marsik <jiri.marsik89 _at_ gmail.com>
|
|
||||||
|
|
||||||
# The MIT License
|
|
||||||
#
|
|
||||||
# Copyright (c) 2011 Hannes Hofmann
|
|
||||||
#
|
|
||||||
# Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
# of this software and associated documentation files (the "Software"), to deal
|
|
||||||
# in the Software without restriction, including without limitation the rights
|
|
||||||
# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
# copies of the Software, and to permit persons to whom the Software is
|
|
||||||
# furnished to do so, subject to the following conditions:
|
|
||||||
#
|
|
||||||
# The above copyright notice and this permission notice shall be included in
|
|
||||||
# all copies or substantial portions of the Software.
|
|
||||||
#
|
|
||||||
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
# THE SOFTWARE.
|
|
||||||
|
|
||||||
# GvdB: This module uses the environment variable TBB_ARCH_PLATFORM which defines architecture and compiler.
|
|
||||||
# e.g. "ia32/vc8" or "em64t/cc4.1.0_libc2.4_kernel2.6.16.21"
|
|
||||||
# TBB_ARCH_PLATFORM is set by the build script tbbvars[.bat|.sh|.csh], which can be found
|
|
||||||
# in the TBB installation directory (TBB_INSTALL_DIR).
|
|
||||||
#
|
|
||||||
# GvdB: Mac OS X distribution places libraries directly in lib directory.
|
|
||||||
#
|
|
||||||
# For backwards compatibility, you may explicitely set the CMake variables TBB_ARCHITECTURE and TBB_COMPILER.
|
|
||||||
# TBB_ARCHITECTURE [ ia32 | em64t | itanium ]
|
|
||||||
# which architecture to use
|
|
||||||
# TBB_COMPILER e.g. vc9 or cc3.2.3_libc2.3.2_kernel2.4.21 or cc4.0.1_os10.4.9
|
|
||||||
# which compiler to use (detected automatically on Windows)
|
|
||||||
|
|
||||||
# This module respects
|
|
||||||
# TBB_INSTALL_DIR or $ENV{TBB21_INSTALL_DIR} or $ENV{TBB_INSTALL_DIR}
|
|
||||||
|
|
||||||
# This module defines
|
|
||||||
# TBB_INCLUDE_DIRS, where to find task_scheduler_init.h, etc.
|
|
||||||
# TBB_LIBRARY_DIRS, where to find libtbb, libtbbmalloc
|
|
||||||
# TBB_DEBUG_LIBRARY_DIRS, where to find libtbb_debug, libtbbmalloc_debug
|
|
||||||
# TBB_INSTALL_DIR, the base TBB install directory
|
|
||||||
# TBB_LIBRARIES, the libraries to link against to use TBB.
|
|
||||||
# TBB_DEBUG_LIBRARIES, the libraries to link against to use TBB with debug symbols.
|
|
||||||
# TBB_FOUND, If false, don't try to use TBB.
|
|
||||||
# TBB_INTERFACE_VERSION, as defined in tbb/tbb_stddef.h
|
|
||||||
|
|
||||||
|
|
||||||
if (WIN32)
|
|
||||||
# has em64t/vc8 em64t/vc9
|
|
||||||
# has ia32/vc7.1 ia32/vc8 ia32/vc9
|
|
||||||
set(_TBB_DEFAULT_INSTALL_DIR "C:/Program Files/Intel/TBB")
|
|
||||||
set(_TBB_LIB_NAME "tbb")
|
|
||||||
set(_TBB_LIB_MALLOC_NAME "${_TBB_LIB_NAME}malloc")
|
|
||||||
set(_TBB_LIB_DEBUG_NAME "${_TBB_LIB_NAME}_debug")
|
|
||||||
set(_TBB_LIB_MALLOC_DEBUG_NAME "${_TBB_LIB_MALLOC_NAME}_debug")
|
|
||||||
if (MSVC71)
|
|
||||||
set (_TBB_COMPILER "vc7.1")
|
|
||||||
endif(MSVC71)
|
|
||||||
if (MSVC80)
|
|
||||||
set(_TBB_COMPILER "vc8")
|
|
||||||
endif(MSVC80)
|
|
||||||
if (MSVC90)
|
|
||||||
set(_TBB_COMPILER "vc9")
|
|
||||||
endif(MSVC90)
|
|
||||||
if(MSVC10)
|
|
||||||
set(_TBB_COMPILER "vc10")
|
|
||||||
endif(MSVC10)
|
|
||||||
# Todo: add other Windows compilers such as ICL.
|
|
||||||
set(_TBB_ARCHITECTURE ${TBB_ARCHITECTURE})
|
|
||||||
endif (WIN32)
|
|
||||||
|
|
||||||
if (UNIX)
|
|
||||||
if (APPLE)
|
|
||||||
# MAC
|
|
||||||
set(_TBB_DEFAULT_INSTALL_DIR "/Library/Frameworks/Intel_TBB.framework/Versions")
|
|
||||||
# libs: libtbb.dylib, libtbbmalloc.dylib, *_debug
|
|
||||||
set(_TBB_LIB_NAME "tbb")
|
|
||||||
set(_TBB_LIB_MALLOC_NAME "${_TBB_LIB_NAME}malloc")
|
|
||||||
set(_TBB_LIB_DEBUG_NAME "${_TBB_LIB_NAME}_debug")
|
|
||||||
set(_TBB_LIB_MALLOC_DEBUG_NAME "${_TBB_LIB_MALLOC_NAME}_debug")
|
|
||||||
# default flavor on apple: ia32/cc4.0.1_os10.4.9
|
|
||||||
# Jiri: There is no reason to presume there is only one flavor and
|
|
||||||
# that user's setting of variables should be ignored.
|
|
||||||
if(NOT TBB_COMPILER)
|
|
||||||
set(_TBB_COMPILER "cc4.0.1_os10.4.9")
|
|
||||||
elseif (NOT TBB_COMPILER)
|
|
||||||
set(_TBB_COMPILER ${TBB_COMPILER})
|
|
||||||
endif(NOT TBB_COMPILER)
|
|
||||||
if(NOT TBB_ARCHITECTURE)
|
|
||||||
set(_TBB_ARCHITECTURE "ia32")
|
|
||||||
elseif(NOT TBB_ARCHITECTURE)
|
|
||||||
set(_TBB_ARCHITECTURE ${TBB_ARCHITECTURE})
|
|
||||||
endif(NOT TBB_ARCHITECTURE)
|
|
||||||
else (APPLE)
|
|
||||||
# LINUX
|
|
||||||
set(_TBB_DEFAULT_INSTALL_DIR "/usr")
|
|
||||||
set(_TBB_LIB_NAME "tbb")
|
|
||||||
set(_TBB_LIB_MALLOC_NAME "${_TBB_LIB_NAME}malloc")
|
|
||||||
set(_TBB_LIB_DEBUG_NAME "${_TBB_LIB_NAME}_debug")
|
|
||||||
set(_TBB_LIB_MALLOC_DEBUG_NAME "${_TBB_LIB_MALLOC_NAME}_debug")
|
|
||||||
# has em64t/cc3.2.3_libc2.3.2_kernel2.4.21 em64t/cc3.3.3_libc2.3.3_kernel2.6.5 em64t/cc3.4.3_libc2.3.4_kernel2.6.9 em64t/cc4.1.0_libc2.4_kernel2.6.16.21
|
|
||||||
# has ia32/*
|
|
||||||
# has itanium/*
|
|
||||||
set(_TBB_COMPILER ${TBB_COMPILER})
|
|
||||||
set(_TBB_ARCHITECTURE ${TBB_ARCHITECTURE})
|
|
||||||
endif (APPLE)
|
|
||||||
endif (UNIX)
|
|
||||||
|
|
||||||
if (CMAKE_SYSTEM MATCHES "SunOS.*")
|
|
||||||
# SUN
|
|
||||||
# not yet supported
|
|
||||||
# has em64t/cc3.4.3_kernel5.10
|
|
||||||
# has ia32/*
|
|
||||||
endif (CMAKE_SYSTEM MATCHES "SunOS.*")
|
|
||||||
|
|
||||||
|
|
||||||
#-- Clear the public variables
|
|
||||||
set (TBB_FOUND "NO")
|
|
||||||
|
|
||||||
|
|
||||||
#-- Find TBB install dir and set ${_TBB_INSTALL_DIR} and cached ${TBB_INSTALL_DIR}
|
|
||||||
# first: use CMake variable TBB_INSTALL_DIR
|
|
||||||
if (TBB_INSTALL_DIR)
|
|
||||||
set (_TBB_INSTALL_DIR ${TBB_INSTALL_DIR})
|
|
||||||
endif (TBB_INSTALL_DIR)
|
|
||||||
# second: use environment variable
|
|
||||||
if (NOT _TBB_INSTALL_DIR)
|
|
||||||
if (NOT "$ENV{TBB_INSTALL_DIR}" STREQUAL "")
|
|
||||||
set (_TBB_INSTALL_DIR $ENV{TBB_INSTALL_DIR})
|
|
||||||
endif (NOT "$ENV{TBB_INSTALL_DIR}" STREQUAL "")
|
|
||||||
# Intel recommends setting TBB21_INSTALL_DIR
|
|
||||||
if (NOT "$ENV{TBB21_INSTALL_DIR}" STREQUAL "")
|
|
||||||
set (_TBB_INSTALL_DIR $ENV{TBB21_INSTALL_DIR})
|
|
||||||
endif (NOT "$ENV{TBB21_INSTALL_DIR}" STREQUAL "")
|
|
||||||
if (NOT "$ENV{TBB22_INSTALL_DIR}" STREQUAL "")
|
|
||||||
set (_TBB_INSTALL_DIR $ENV{TBB22_INSTALL_DIR})
|
|
||||||
endif (NOT "$ENV{TBB22_INSTALL_DIR}" STREQUAL "")
|
|
||||||
if (NOT "$ENV{TBB30_INSTALL_DIR}" STREQUAL "")
|
|
||||||
set (_TBB_INSTALL_DIR $ENV{TBB30_INSTALL_DIR})
|
|
||||||
endif (NOT "$ENV{TBB30_INSTALL_DIR}" STREQUAL "")
|
|
||||||
endif (NOT _TBB_INSTALL_DIR)
|
|
||||||
# third: try to find path automatically
|
|
||||||
if (NOT _TBB_INSTALL_DIR)
|
|
||||||
if (_TBB_DEFAULT_INSTALL_DIR)
|
|
||||||
set (_TBB_INSTALL_DIR ${_TBB_DEFAULT_INSTALL_DIR})
|
|
||||||
endif (_TBB_DEFAULT_INSTALL_DIR)
|
|
||||||
endif (NOT _TBB_INSTALL_DIR)
|
|
||||||
# sanity check
|
|
||||||
if (NOT _TBB_INSTALL_DIR)
|
|
||||||
message ("ERROR: Unable to find Intel TBB install directory. ${_TBB_INSTALL_DIR}")
|
|
||||||
else (NOT _TBB_INSTALL_DIR)
|
|
||||||
# finally: set the cached CMake variable TBB_INSTALL_DIR
|
|
||||||
if (NOT TBB_INSTALL_DIR)
|
|
||||||
set (TBB_INSTALL_DIR ${_TBB_INSTALL_DIR} CACHE PATH "Intel TBB install directory")
|
|
||||||
mark_as_advanced(TBB_INSTALL_DIR)
|
|
||||||
endif (NOT TBB_INSTALL_DIR)
|
|
||||||
|
|
||||||
|
|
||||||
#-- A macro to rewrite the paths of the library. This is necessary, because
|
|
||||||
# find_library() always found the em64t/vc9 version of the TBB libs
|
|
||||||
macro(TBB_CORRECT_LIB_DIR var_name)
|
|
||||||
# if (NOT "${_TBB_ARCHITECTURE}" STREQUAL "em64t")
|
|
||||||
string(REPLACE em64t "${_TBB_ARCHITECTURE}" ${var_name} ${${var_name}})
|
|
||||||
# endif (NOT "${_TBB_ARCHITECTURE}" STREQUAL "em64t")
|
|
||||||
string(REPLACE ia32 "${_TBB_ARCHITECTURE}" ${var_name} ${${var_name}})
|
|
||||||
string(REPLACE vc7.1 "${_TBB_COMPILER}" ${var_name} ${${var_name}})
|
|
||||||
string(REPLACE vc8 "${_TBB_COMPILER}" ${var_name} ${${var_name}})
|
|
||||||
string(REPLACE vc9 "${_TBB_COMPILER}" ${var_name} ${${var_name}})
|
|
||||||
string(REPLACE vc10 "${_TBB_COMPILER}" ${var_name} ${${var_name}})
|
|
||||||
endmacro(TBB_CORRECT_LIB_DIR var_content)
|
|
||||||
|
|
||||||
|
|
||||||
#-- Look for include directory and set ${TBB_INCLUDE_DIR}
|
|
||||||
set (TBB_INC_SEARCH_DIR ${_TBB_INSTALL_DIR}/include)
|
|
||||||
# Jiri: tbbvars now sets the CPATH environment variable to the directory
|
|
||||||
# containing the headers.
|
|
||||||
find_path(TBB_INCLUDE_DIR
|
|
||||||
tbb/task_scheduler_init.h
|
|
||||||
HINTS ${TBB_INC_SEARCH_DIR} ENV CPATH
|
|
||||||
)
|
|
||||||
mark_as_advanced(TBB_INCLUDE_DIR)
|
|
||||||
|
|
||||||
#-- Look for libraries
|
|
||||||
# GvdB: $ENV{TBB_ARCH_PLATFORM} is set by the build script tbbvars[.bat|.sh|.csh]
|
|
||||||
if (NOT $ENV{TBB_ARCH_PLATFORM} STREQUAL "")
|
|
||||||
set (_TBB_LIBRARY_DIR
|
|
||||||
${_TBB_INSTALL_DIR}/lib/$ENV{TBB_ARCH_PLATFORM}
|
|
||||||
${_TBB_INSTALL_DIR}/$ENV{TBB_ARCH_PLATFORM}/lib
|
|
||||||
)
|
|
||||||
endif (NOT $ENV{TBB_ARCH_PLATFORM} STREQUAL "")
|
|
||||||
# Jiri: This block isn't mutually exclusive with the previous one
|
|
||||||
# (hence no else), instead I test if the user really specified
|
|
||||||
# the variables in question.
|
|
||||||
if ((NOT ${TBB_ARCHITECTURE} STREQUAL "") AND (NOT ${TBB_COMPILER} STREQUAL ""))
|
|
||||||
# HH: deprecated
|
|
||||||
message(STATUS "[Warning] FindTBB.cmake: The use of TBB_ARCHITECTURE and TBB_COMPILER is deprecated and may not be supported in future versions. Please set \$ENV{TBB_ARCH_PLATFORM} (using tbbvars.[bat|csh|sh]).")
|
|
||||||
# Jiri: It doesn't hurt to look in more places, so I store the hints from
|
|
||||||
# ENV{TBB_ARCH_PLATFORM} and the TBB_ARCHITECTURE and TBB_COMPILER
|
|
||||||
# variables and search them both.
|
|
||||||
set (_TBB_LIBRARY_DIR "${_TBB_INSTALL_DIR}/${_TBB_ARCHITECTURE}/${_TBB_COMPILER}/lib" ${_TBB_LIBRARY_DIR})
|
|
||||||
endif ((NOT ${TBB_ARCHITECTURE} STREQUAL "") AND (NOT ${TBB_COMPILER} STREQUAL ""))
|
|
||||||
|
|
||||||
# GvdB: Mac OS X distribution places libraries directly in lib directory.
|
|
||||||
list(APPEND _TBB_LIBRARY_DIR ${_TBB_INSTALL_DIR}/lib)
|
|
||||||
|
|
||||||
if(EXISTS ${_TBB_INSTALL_DIR}/build)
|
|
||||||
file(GLOB _TBB_BUILD_DIR_RELEASE ${_TBB_INSTALL_DIR}/build/*_release)
|
|
||||||
file(GLOB _TBB_BUILD_DIR_DEBUG ${_TBB_INSTALL_DIR}/build/*_debug)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
# Jiri: No reason not to check the default paths. From recent versions,
|
|
||||||
# tbbvars has started exporting the LIBRARY_PATH and LD_LIBRARY_PATH
|
|
||||||
# variables, which now point to the directories of the lib files.
|
|
||||||
# It all makes more sense to use the ${_TBB_LIBRARY_DIR} as a HINTS
|
|
||||||
# argument instead of the implicit PATHS as it isn't hard-coded
|
|
||||||
# but computed by system introspection. Searching the LIBRARY_PATH
|
|
||||||
# and LD_LIBRARY_PATH environment variables is now even more important
|
|
||||||
# that tbbvars doesn't export TBB_ARCH_PLATFORM and it facilitates
|
|
||||||
# the use of TBB built from sources.
|
|
||||||
find_library(TBB_LIBRARY ${_TBB_LIB_NAME} HINTS ${_TBB_BUILD_DIR_RELEASE} ${_TBB_LIBRARY_DIR})
|
|
||||||
find_library(TBB_MALLOC_LIBRARY ${_TBB_LIB_MALLOC_NAME} HINTS ${_TBB_BUILD_DIR_RELEASE} ${_TBB_LIBRARY_DIR})
|
|
||||||
|
|
||||||
#Extract path from TBB_LIBRARY name
|
|
||||||
get_filename_component(TBB_LIBRARY_DIR ${TBB_LIBRARY} PATH)
|
|
||||||
|
|
||||||
#TBB_CORRECT_LIB_DIR(TBB_LIBRARY)
|
|
||||||
#TBB_CORRECT_LIB_DIR(TBB_MALLOC_LIBRARY)
|
|
||||||
mark_as_advanced(TBB_LIBRARY TBB_MALLOC_LIBRARY)
|
|
||||||
|
|
||||||
#-- Look for debug libraries
|
|
||||||
# Jiri: Changed the same way as for the release libraries.
|
|
||||||
find_library(TBB_LIBRARY_DEBUG ${_TBB_LIB_DEBUG_NAME} HINTS ${_TBB_BUILD_DIR_DEBUG} ${_TBB_LIBRARY_DIR}
|
|
||||||
PATHS ENV LIBRARY_PATH ENV LD_LIBRARY_PATH)
|
|
||||||
find_library(TBB_MALLOC_LIBRARY_DEBUG ${_TBB_LIB_MALLOC_DEBUG_NAME} HINTS ${_TBB_BUILD_DIR_DEBUG} ${_TBB_LIBRARY_DIR}
|
|
||||||
PATHS ENV LIBRARY_PATH ENV LD_LIBRARY_PATH)
|
|
||||||
|
|
||||||
# Jiri: Self-built TBB stores the debug libraries in a separate directory.
|
|
||||||
# Extract path from TBB_LIBRARY_DEBUG name
|
|
||||||
get_filename_component(TBB_LIBRARY_DEBUG_DIR ${TBB_LIBRARY_DEBUG} PATH)
|
|
||||||
|
|
||||||
#TBB_CORRECT_LIB_DIR(TBB_LIBRARY_DEBUG)
|
|
||||||
#TBB_CORRECT_LIB_DIR(TBB_MALLOC_LIBRARY_DEBUG)
|
|
||||||
mark_as_advanced(TBB_LIBRARY_DEBUG TBB_MALLOC_LIBRARY_DEBUG)
|
|
||||||
|
|
||||||
|
|
||||||
if (TBB_INCLUDE_DIR)
|
|
||||||
if (TBB_LIBRARY)
|
|
||||||
set (TBB_FOUND "YES")
|
|
||||||
set (TBB_LIBRARIES ${TBB_LIBRARY} ${TBB_MALLOC_LIBRARY} ${TBB_LIBRARIES})
|
|
||||||
set (TBB_DEBUG_LIBRARIES ${TBB_LIBRARY_DEBUG} ${TBB_MALLOC_LIBRARY_DEBUG} ${TBB_DEBUG_LIBRARIES})
|
|
||||||
set (TBB_INCLUDE_DIRS ${TBB_INCLUDE_DIR} CACHE PATH "TBB include directory" FORCE)
|
|
||||||
set (TBB_LIBRARY_DIRS ${TBB_LIBRARY_DIR} CACHE PATH "TBB library directory" FORCE)
|
|
||||||
# Jiri: Self-built TBB stores the debug libraries in a separate directory.
|
|
||||||
set (TBB_DEBUG_LIBRARY_DIRS ${TBB_LIBRARY_DEBUG_DIR} CACHE PATH "TBB debug library directory" FORCE)
|
|
||||||
mark_as_advanced(TBB_INCLUDE_DIRS TBB_LIBRARY_DIRS TBB_DEBUG_LIBRARY_DIRS TBB_LIBRARIES TBB_DEBUG_LIBRARIES)
|
|
||||||
message(STATUS "Found Intel TBB")
|
|
||||||
endif (TBB_LIBRARY)
|
|
||||||
endif (TBB_INCLUDE_DIR)
|
|
||||||
|
|
||||||
if (NOT TBB_FOUND)
|
|
||||||
message("ERROR: Intel TBB NOT found!")
|
|
||||||
message(STATUS "Looked for Threading Building Blocks in ${_TBB_INSTALL_DIR}")
|
|
||||||
# do only throw fatal, if this pkg is REQUIRED
|
|
||||||
if (TBB_FIND_REQUIRED)
|
|
||||||
message(FATAL_ERROR "Could NOT find TBB library.")
|
|
||||||
endif (TBB_FIND_REQUIRED)
|
|
||||||
endif (NOT TBB_FOUND)
|
|
||||||
|
|
||||||
endif (NOT _TBB_INSTALL_DIR)
|
|
||||||
|
|
||||||
if (TBB_FOUND)
|
|
||||||
set(TBB_INTERFACE_VERSION 0)
|
|
||||||
FILE(READ "${TBB_INCLUDE_DIRS}/tbb/tbb_stddef.h" _TBB_VERSION_CONTENTS)
|
|
||||||
STRING(REGEX REPLACE ".*#define TBB_INTERFACE_VERSION ([0-9]+).*" "\\1" TBB_INTERFACE_VERSION "${_TBB_VERSION_CONTENTS}")
|
|
||||||
set(TBB_INTERFACE_VERSION "${TBB_INTERFACE_VERSION}")
|
|
||||||
message(STATUS "TBB interface version: ${TBB_INTERFACE_VERSION}")
|
|
||||||
endif (TBB_FOUND)
|
|
||||||
@@ -1,43 +0,0 @@
|
|||||||
# Based on @berenm's pull request https://github.com/quarnster/SublimeClang/pull/135
|
|
||||||
# Create the database with cmake with for example: cmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ON ..
|
|
||||||
# or you could have set(CMAKE_EXPORT_COMPILE_COMMANDS ON) in your CMakeLists.txt
|
|
||||||
# Usage within SublimeClang:
|
|
||||||
# "sublimeclang_options_script": "python ${home}/code/cmake_options_script.py ${project_path:build}/compile_commands.json",
|
|
||||||
|
|
||||||
|
|
||||||
import re
|
|
||||||
import os
|
|
||||||
import os.path
|
|
||||||
import pickle
|
|
||||||
import sys
|
|
||||||
import json
|
|
||||||
|
|
||||||
compilation_database_pattern = re.compile('(?<=\s)-[DIOUWfgs][^=\s]+(?:=\\"[^"]+\\"|=[^"]\S+)?')
|
|
||||||
|
|
||||||
def load_db(filename):
|
|
||||||
compilation_database = {}
|
|
||||||
with open(filename) as compilation_database_file:
|
|
||||||
compilation_database_entries = json.load(compilation_database_file)
|
|
||||||
|
|
||||||
total = len(compilation_database_entries)
|
|
||||||
entry = 0
|
|
||||||
for compilation_entry in compilation_database_entries:
|
|
||||||
entry = entry + 1
|
|
||||||
compilation_database[compilation_entry["file"]] = [ p.strip() for p in compilation_database_pattern.findall(compilation_entry["command"]) ]
|
|
||||||
return compilation_database
|
|
||||||
|
|
||||||
scriptpath = os.path.dirname(os.path.abspath(sys.argv[1]))
|
|
||||||
cache_file = "%s/cached_options.txt" % (scriptpath)
|
|
||||||
|
|
||||||
db = None
|
|
||||||
if os.access(cache_file, os.R_OK) == 0:
|
|
||||||
db = load_db(sys.argv[1])
|
|
||||||
with open(cache_file, "wb") as f:
|
|
||||||
pickle.dump(db, f)
|
|
||||||
else:
|
|
||||||
with open(cache_file) as f:
|
|
||||||
db = pickle.load(f)
|
|
||||||
|
|
||||||
if db and sys.argv[2] in db:
|
|
||||||
for option in db[sys.argv[2]]:
|
|
||||||
print option
|
|
||||||