WIP: Alternative Routes Support #3447
Draft
melonSkin76 wants to merge 6 commits from
rq-alterRoutes-vng
into master
pull from: rq-alterRoutes-vng
merge into: organicmaps:master
organicmaps:master
organicmaps:weblate-i18n
organicmaps:beta/ios-hotfix-search
organicmaps:ios/search-fix-to-child-vc
organicmaps:ios/update-toast-ui
organicmaps:pastk-generator-genorder
organicmaps:pastk-autogen-subways
organicmaps:ios/pp-for-track-recording
organicmaps:ios/add-icons-to-the-live-activity-widget
organicmaps:ios/fix-search-on-map-tests-for-ipad
organicmaps:release/2025.03.02
organicmaps:pastk-drape-subways-greying-out
organicmaps:ios/update-search-vc-ui
organicmaps:alpha/2025.02.23
organicmaps:crowdin-master
organicmaps:l10n
organicmaps:ios/search-ui-redesign
organicmaps:ios/show-new-search-vc-from-the-route-building
organicmaps:release/2025.01.24
organicmaps:drop-appstream-glib
organicmaps:separate-locationservice-lib
organicmaps:release/2025.01.12
organicmaps:int/anrdoid-auto/permissions-screen
organicmaps:rt-docs-release-management-principles
organicmaps:generator-wikipedia
organicmaps:generator-actions
organicmaps:generator-subways
organicmaps:ios/enable-cpp-swift-interop
organicmaps:pastk-docs-values
organicmaps:fix-deprecated-atomic-load
organicmaps:rt-docs-communication
organicmaps:rt-docs-collaboration
organicmaps:ios/fix-compile-warnings-and-cleanup-unsupported-code
organicmaps:rt-ios-managed-signing
organicmaps:ios/fix-ios-test-ci-action-failure
organicmaps:ab-ios-bookmarks-last-category
organicmaps:pastk-docs-teams
organicmaps:qt-3d-preferences
organicmaps:fix-file-read-exception
organicmaps:fix-track-length-calculation
organicmaps:pastk-styles-feature-types-migration
organicmaps:release/24.11.27
organicmaps:alpha/2024.11.26
organicmaps:beta/2024.11.26
organicmaps:ab-tests-macro-fixes
organicmaps:ios/track-recording-fifth-bar-button
organicmaps:vng-fix
organicmaps:release/24.11.12
organicmaps:alpha/2024.11.10
organicmaps:vng-langs
organicmaps:patch-3
organicmaps:release/2024.10.22
organicmaps:alpha/2024.10.22
organicmaps:beta/2024.10.22
organicmaps:place-page-for-tracks-backup
organicmaps:release/2024.10.08
organicmaps:release/2024.10.04
organicmaps:alpha/2024.10.01
organicmaps:vng-search
organicmaps:beta/2024.09.19
organicmaps:release/2024.09.19
organicmaps:rdb-weblate
organicmaps:release/2024.09.08
organicmaps:android/speed-limit-exceed-flag
organicmaps:alpha/2024.09.03
organicmaps:alpha/2024.09.03-ios-track-recording-feature
organicmaps:mb-PendingIntent-requestCode-fix
organicmaps:alpha/2024.08.29
organicmaps:add-timestamps-to-track
organicmaps:ab-ios-crash-on-assert
organicmaps:alpha/2024.08.25-ios-track-recording-feature
organicmaps:alpha/2024.08.29-ios-track-recording-feature
organicmaps:android/speed-limit-threshold
organicmaps:android-oauth2-with-browser
organicmaps:release/2024.08.17
organicmaps:changes-from-release
organicmaps:release/2024.08.15
organicmaps:alpha-iOS-Bluetooth
organicmaps:rdb-cldr-plural-order
organicmaps:ab-unused-code
organicmaps:ab-android-location-fix
organicmaps:recent-track-recorder
organicmaps:ab-cleaner-shutdown
organicmaps:localized_address_ordering
organicmaps:ab-android-layer-button-highlight
organicmaps:weblate
organicmaps:release/2024.07.08
organicmaps:alpha/2024.07.25-rtsisyk-ios-test
organicmaps:ios-implement-the-recently-deleted-support-to-icloud-sync
organicmaps:recently-deleted-categories-using-postfix
organicmaps:fix-ios-simulator-version
organicmaps:alpha/2024.07.02
organicmaps:vng-test-data
organicmaps:release/2024.06.02
organicmaps:ios/undo-for-the-bookmark-deletion
organicmaps:ios/restore-bookmark-by-tap-on-the-map
organicmaps:ios/undo-for-the-bookmark-deletion-with-restoring-by-tap-on-the-map
organicmaps:revert-7969-pastk-drape-transparent-areas
organicmaps:ab-drape-use-constant-base-font-height
organicmaps:rt-beta
organicmaps:vng-alt-routes
organicmaps:pastk-styles-shared-paths-tune-down
organicmaps:android-auto/8015-8019-8022
organicmaps:pastk-beta-0420
organicmaps:pastk-2generate-paths
organicmaps:ab-fix-shaders-rebuild
organicmaps:ios/fix-drape-failure-during-test-running
organicmaps:ios/add-test-target-terminate
organicmaps:cleanup/base
organicmaps:ab-max-open-file-limit
organicmaps:weblate-appstore-i18n
organicmaps:2024.03.27-3-android-hotfix
organicmaps:ab-3party-oauthcpp
organicmaps:android-hotfix-24031805
organicmaps:ab-android-revert-links
organicmaps:ab-tts-simpler-strings
organicmaps:rt-android-huawei-crash
organicmaps:rt-android-release-2024.03.02
organicmaps:rt-android-release-2024.03.01
organicmaps:ab-ios-release-2024.02.27
organicmaps:ab-from-chars
organicmaps:gplay-android-auto-hotfix
organicmaps:ab-case-folding
organicmaps:rt-store-metadata
organicmaps:ab-buffer-vector-string-view
organicmaps:ab-update-gh-cache-action
organicmaps:rt-android-bookmark-export
organicmaps:osm-oauth2-support
organicmaps:vng-test
organicmaps:rt-geo-links
organicmaps:vng-lines
organicmaps:windows3
organicmaps:android-auto-disable
organicmaps:rt-android-paranoid-mode
organicmaps:rt-android-outdoor
organicmaps:ios-hotfix-release-dec-2023
organicmaps:rt-android-location-providers
organicmaps:pastk-outdoors-hiking-routes
organicmaps:pastk-2generate
organicmaps:pastk-classif-hiking-routes
organicmaps:vng-gen-kk
organicmaps:poc-disable-route-build-zoom
organicmaps:kk2
organicmaps:ab-thread-checker-qt-download-dialog-fix
organicmaps:revert-6461-category-letterbox-it
organicmaps:beta-outdoor
organicmaps:protobuf-24.4
organicmaps:designer-fixes
organicmaps:vng-bookmarks
organicmaps:vng-outdoors
organicmaps:navigation/save-mode
organicmaps:pastk-TEST-rel-w-lines-stats
organicmaps:ab-kml-remove-unique-ptr
organicmaps:vng-bench
organicmaps:aa
organicmaps:rt-android-remove-workmanager
organicmaps:rt-android-debug
organicmaps:protobuf-24.3
organicmaps:pastk-core-housenumbers
organicmaps:ruler-disable-reordering
organicmaps:android-warning-suppress
organicmaps:pastk-drape-bucket-discard-optimization
organicmaps:beta-ios-gpx-fix
organicmaps:pastk-generator-isolines-skip-resimplify
organicmaps:pastk-styles-world-railways
organicmaps:pastk-styles-TMP_dump_priorities
organicmaps:ab-increase-long-tap-radius
organicmaps:car-checkpoint-tolerance
organicmaps:rt-android-fix-viewport
organicmaps:vng-addr-test
organicmaps:downloader
organicmaps:obsolete-position-color
organicmaps:pastk-styles-geometryfallback
organicmaps:pastk-DEMO-geometry-1more-detailed
organicmaps:strings-be-ru-uk-miles
organicmaps:ios/external-keyboard-fix2
organicmaps:alex-outdoors
organicmaps:ios/blue-route-to
organicmaps:pastk-styles-fixpriorities2
organicmaps:pastk-styles-fixpriorities
organicmaps:rt-android-accent-color
organicmaps:pastk-drape-path_text_zoom_mask
organicmaps:pastk-drape-roadshields
organicmaps:update-appstore-metadata
organicmaps:pastk-styles-outdoors
organicmaps:3p/disable-system-jansson
organicmaps:ios/newly-created-list-order
organicmaps:czech-release
organicmaps:rt-fix-monkey-gh
organicmaps:ios/fix-tableview-headers-font
organicmaps:rt-android-google-location-annoying
organicmaps:pastk-loc-share
organicmaps:ctest
organicmaps:windows2
organicmaps:kml-load-robust
organicmaps:tr-screenshots
organicmaps:vng-nav
organicmaps:d4f5409d-patch-1
organicmaps:rt-fix-location-resolution
organicmaps:github-actions-update
organicmaps:android_auto
organicmaps:matheusgomesms-store-releasenotes-pt_BRtranslation
organicmaps:rt-add-ci-timeout
organicmaps:euskara
organicmaps:windows
organicmaps:tests-fix
organicmaps:pastk-styles-geometryfallback-1more-detailed
organicmaps:pastk-styles-zoomlessareas
organicmaps:pastk-outdoors-beta
organicmaps:android/R8
organicmaps:pastk-android-writability
organicmaps:rt-location-api
organicmaps:pastk-android-verifyerror
organicmaps:qt6
organicmaps:vng-my_pos
organicmaps:pastk-scripts
organicmaps:vng-sdfimage
organicmaps:vng-vehicle-refactoring
organicmaps:release-gp-fdroid-without-location-fixes
organicmaps:rt-android-track-recorder
organicmaps:rt-android-gplay-compliance
organicmaps:rt-android-remove-gms
organicmaps:rt-android-track-recorder-alarm
organicmaps:rt-android-keep-data
organicmaps:fix-odr
organicmaps:build/no-unity
organicmaps:backup-resources
organicmaps:android/warning-fixes
organicmaps:weblate-ios-i18n
organicmaps:rt-android-symlinks
organicmaps:weblate-android-i18n
organicmaps:weblate-whitespacing
organicmaps:rt-weblate-consume
organicmaps:ios/fixes
organicmaps:i18n-android
organicmaps:i18n-ios
organicmaps:rt-xcode-desktop
No reviewers
Labels
Clear labels
issues affecting users with specific needs
issues affecting users with specific needs
Issues with addresses, post codes, city/town/village borders
Issues with addresses, post codes, city/town/village borders
Android development
Android development
Android Auto
Android Auto
Short Links, deep links and url schemes, including ge0 and om://
Short Links, deep links and url schemes, including ge0 and om://
Huawei AppGallery
Huawei AppGallery
Apple AppStore
Apple AppStore
Performance and battery consumption-related issues and optimizations
Performance and battery consumption-related issues and optimizations
An issue blocking the release
An issue blocking the release
Bookmarks, imported tracks, and KML, KMZ, KMB, GPX, GPZ import or export
Bookmarks, imported tracks, and KML, KMZ, KMB, GPX, GPZ import or export
Country borders and polygons
Country borders and polygons
Something isn't working
Something isn't working
Compilation issue
Compilation issue
CarPlay Integration
CarPlay Integration
Classify object by types
Classify object by types
Community relations
Community relations
Cross-platform C++ libraries with a core functionality
Cross-platform C++ libraries with a core functionality
Crash Reporting
Crash Reporting
Bike, cycle, biking and related
Bike, cycle, biking and related
Desktop application
Desktop application
Developer Experience
Developer Experience
Automation and pipelines
Automation and pipelines
A desktop app to debug rendering
A desktop app to debug rendering
Issues with next turns, labels, streets, voice instructions
Issues with next turns, labels, streets, voice instructions
Improvements or additions to documentation
Improvements or additions to documentation
Map dowloader
Map dowloader
Drape OpenGL, Vulkan and Metal graphics rendering engine
Drape OpenGL, Vulkan and Metal graphics rendering engine
Drive a car related issues
Drive a car related issues
This issue or pull request already exists
This issue or pull request already exists
OSM Editor
OSM Editor
Isolines and altitude
Isolines and altitude
New feature or request, an improvement of some existing feature
New feature or request, an improvement of some existing feature
A large body work
A large body work
TIGER, Ordnance Survey, ASTER, SRTM, etc.
TIGER, Ordnance Survey, ASTER, SRTM, etc.
F-Droid build and distribution
F-Droid build and distribution
Font and text rendering
Font and text rendering
Most annoying UX and other issues for users reported by many people
Most annoying UX and other issues for users reported by many people
Related to generator tool.
Related to generator tool.
Good for newcomers
Good for newcomers
Google Play
Google Play
Location and positioning issues
Location and positioning issues
Ideas for Google Summer of Code
Ideas for Google Summer of Code
Map and app icons
Map and app icons
iOS development
iOS development
Legal aspects
Legal aspects
Ubuntu, Gentoo, Red Hat, Debian, Cent OS, Fedora, etc.
Ubuntu, Gentoo, Red Hat, Debian, Cent OS, Fedora, etc.
LibreM, PinePhone, Wayland and other mobile Linux versions
LibreM, PinePhone, Wayland and other mobile Linux versions
Desktop issues related to Mac OS X, OM running on M1, M2, M3 Apple silicon, or Qt version
Desktop issues related to Mac OS X, OM running on M1, M2, M3 Apple silicon, or Qt version
OpenStreetMap data related issues
OpenStreetMap data related issues
Subway, Tube, light-rail public transport issues
Subway, Tube, light-rail public transport issues
Issues related to the active Navigator / Navigation mode
Issues related to the active Navigator / Navigation mode
Further information is requested
Further information is requested
Night or dark mode feature
Night or dark mode feature
Tasks related to NLnet 2024-06-281 project.
Tasks related to NLnet 2024-06-281 project.
A platform needs this to be implemented to have feature parity with other platforms
A platform needs this to be implemented to have feature parity with other platforms
Business Hours, off time, holidays, seasonal
Business Hours, off time, holidays, seasonal
Hiking, mtb, 4x4...
Hiking, mtb, 4x4...
Feature metadata, OSM tags that are displayed in Place Page
Feature metadata, OSM tags that are displayed in Place Page
Privacy
Privacy
Bus, trolleybus, train, tram, metro, subway, light rail
Bus, trolleybus, train, tram, metro, subway, light rail
An idea that needs to be elaborated
An idea that needs to be elaborated
This issue is different depending on the country or region
This issue is different depending on the country or region
A regression bug
A regression bug
Meta-tickets for tracking the release procedure
Meta-tickets for tracking the release procedure
Robo / Monkey Auto Tests
Robo / Monkey Auto Tests
Preview and plan your track
Preview and plan your track
Route building issues, e.g. valid route, valid ETA
Route building issues, e.g. valid route, valid ETA
Helicopter routing, "as a crow flies"
Helicopter routing, "as a crow flies"
Search
Search
Security improvements
Security improvements
Map drawing styles
Map drawing styles
Track Recording
Track Recording
Localization and translations issues
Localization and translations issues
Text-to-Speech
Text-to-Speech
User interface issues
User interface issues
User eXperience, an issue with usability
User eXperience, an issue with usability
Foot pedestrian mode
Foot pedestrian mode
Android Watches or Apple Watches support
Android Watches or Apple Watches support
https://organicmaps.app/
https://organicmaps.app/
Issues related to Wiki articles embedded in OM data files.
Issues related to Wiki articles embedded in OM data files.
Windows
Windows
Unfeasible or impossible to resolve
Unfeasible or impossible to resolve
Issues about improving the base map of the whole world that is bundled with the app
Issues about improving the base map of the whole world that is bundled with the app
Accessibility
issues affecting users with specific needs
Accessibility
issues affecting users with specific needs
Address
Issues with addresses, post codes, city/town/village borders
Address
Issues with addresses, post codes, city/town/village borders
Android
Android development
Android
Android development
Android Auto
Android Auto
Android Auto
Android Auto
Android Automotive (AAOS)
Android Automotive (AAOS)
API
Short Links, deep links and url schemes, including ge0 and om://
API
Short Links, deep links and url schemes, including ge0 and om://
AppGallery
Huawei AppGallery
AppGallery
Huawei AppGallery
AppStore
Apple AppStore
AppStore
Apple AppStore
Battery and Performance
Performance and battery consumption-related issues and optimizations
Battery and Performance
Performance and battery consumption-related issues and optimizations
Blocker
An issue blocking the release
Blocker
An issue blocking the release
Bookmarks and Tracks
Bookmarks, imported tracks, and KML, KMZ, KMB, GPX, GPZ import or export
Bookmarks and Tracks
Bookmarks, imported tracks, and KML, KMZ, KMB, GPX, GPZ import or export
Borders
Country borders and polygons
Borders
Country borders and polygons
Bug
Something isn't working
Bug
Something isn't working
Build
Compilation issue
Build
Compilation issue
CarPlay
CarPlay Integration
CarPlay
CarPlay Integration
Classificator
Classify object by types
Classificator
Classify object by types
Community
Community relations
Community
Community relations
Core
Cross-platform C++ libraries with a core functionality
Core
Cross-platform C++ libraries with a core functionality
CrashReports
Crash Reporting
CrashReports
Crash Reporting
Cycling
Bike, cycle, biking and related
Cycling
Bike, cycle, biking and related
Desktop
Desktop application
Desktop
Desktop application
DevEx
Developer Experience
DevEx
Developer Experience
DevOps
Automation and pipelines
DevOps
Automation and pipelines
dev_sandbox
A desktop app to debug rendering
dev_sandbox
A desktop app to debug rendering
Directions
Issues with next turns, labels, streets, voice instructions
Directions
Issues with next turns, labels, streets, voice instructions
Documentation
Improvements or additions to documentation
Documentation
Improvements or additions to documentation
Downloader
Map dowloader
Downloader
Map dowloader
Drape
Drape OpenGL, Vulkan and Metal graphics rendering engine
Drape
Drape OpenGL, Vulkan and Metal graphics rendering engine
Driving
Drive a car related issues
Driving
Drive a car related issues
Duplicate
This issue or pull request already exists
Duplicate
This issue or pull request already exists
Editor
OSM Editor
Editor
OSM Editor
Elevation
Isolines and altitude
Elevation
Isolines and altitude
Enhancement
New feature or request, an improvement of some existing feature
Enhancement
New feature or request, an improvement of some existing feature
Epic
A large body work
Epic
A large body work
External Map Datasets
TIGER, Ordnance Survey, ASTER, SRTM, etc.
External Map Datasets
TIGER, Ordnance Survey, ASTER, SRTM, etc.
F-Droid
F-Droid build and distribution
F-Droid
F-Droid build and distribution
Fonts
Font and text rendering
Fonts
Font and text rendering
Frequently User Reported
Most annoying UX and other issues for users reported by many people
Frequently User Reported
Most annoying UX and other issues for users reported by many people
Fund
Fund
Generator
Related to generator tool.
Generator
Related to generator tool.
Good first issue
Good for newcomers
Good first issue
Good for newcomers
Google Play
Google Play
Google Play
Google Play
GPS
Location and positioning issues
GPS
Location and positioning issues
GSoC
Ideas for Google Summer of Code
GSoC
Ideas for Google Summer of Code
iCloud
iCloud
Icons
Map and app icons
Icons
Map and app icons
iOS
iOS development
iOS
iOS development
Legal
Legal aspects
Legal
Legal aspects
Linux Desktop
Ubuntu, Gentoo, Red Hat, Debian, Cent OS, Fedora, etc.
Linux Desktop
Ubuntu, Gentoo, Red Hat, Debian, Cent OS, Fedora, etc.
Linux packaging
Linux packaging
Linux Phone
LibreM, PinePhone, Wayland and other mobile Linux versions
Linux Phone
LibreM, PinePhone, Wayland and other mobile Linux versions
Mac OS
Desktop issues related to Mac OS X, OM running on M1, M2, M3 Apple silicon, or Qt version
Mac OS
Desktop issues related to Mac OS X, OM running on M1, M2, M3 Apple silicon, or Qt version
Map Data
OpenStreetMap data related issues
Map Data
OpenStreetMap data related issues
Metro
Subway, Tube, light-rail public transport issues
Metro
Subway, Tube, light-rail public transport issues
Navigation
Issues related to the active Navigator / Navigation mode
Navigation
Issues related to the active Navigator / Navigation mode
Need Feedback
Further information is requested
Need Feedback
Further information is requested
Night Mode
Night or dark mode feature
Night Mode
Night or dark mode feature
NLnet 2024-06-281
Tasks related to NLnet 2024-06-281 project.
NLnet 2024-06-281
Tasks related to NLnet 2024-06-281 project.
No Feature Parity
A platform needs this to be implemented to have feature parity with other platforms
No Feature Parity
A platform needs this to be implemented to have feature parity with other platforms
Opening Hours
Business Hours, off time, holidays, seasonal
Opening Hours
Business Hours, off time, holidays, seasonal
Outdoors
Hiking, mtb, 4x4...
Outdoors
Hiking, mtb, 4x4...
POI Info
Feature metadata, OSM tags that are displayed in Place Page
POI Info
Feature metadata, OSM tags that are displayed in Place Page
Privacy
Privacy
Privacy
Privacy
Public Transport
Bus, trolleybus, train, tram, metro, subway, light rail
Public Transport
Bus, trolleybus, train, tram, metro, subway, light rail
Raw Idea
An idea that needs to be elaborated
Raw Idea
An idea that needs to be elaborated
Refactoring
Refactoring
Regional
This issue is different depending on the country or region
Regional
This issue is different depending on the country or region
Regression
A regression bug
Regression
A regression bug
Releases
Meta-tickets for tracking the release procedure
Releases
Meta-tickets for tracking the release procedure
RoboTest
Robo / Monkey Auto Tests
RoboTest
Robo / Monkey Auto Tests
Route Planning
Preview and plan your track
Route Planning
Preview and plan your track
Routing
Route building issues, e.g. valid route, valid ETA
Routing
Route building issues, e.g. valid route, valid ETA
Ruler
Helicopter routing, "as a crow flies"
Ruler
Helicopter routing, "as a crow flies"
Search
Search
Search
Search
Security
Security improvements
Security
Security improvements
Styles
Map drawing styles
Styles
Map drawing styles
Tests
Tests
Track Recording
Track Recording
Track Recording
Track Recording
Translations
Localization and translations issues
Translations
Localization and translations issues
TTS
Text-to-Speech
TTS
Text-to-Speech
UI
User interface issues
UI
User interface issues
UX
User eXperience, an issue with usability
UX
User eXperience, an issue with usability
Walk Navigation
Foot pedestrian mode
Walk Navigation
Foot pedestrian mode
Watches
Android Watches or Apple Watches support
Watches
Android Watches or Apple Watches support
Web
https://organicmaps.app/
Web
https://organicmaps.app/
Wikipedia
Issues related to Wiki articles embedded in OM data files.
Wikipedia
Issues related to Wiki articles embedded in OM data files.
Windows
Windows
Windows
Windows
Won't fix
Unfeasible or impossible to resolve
Won't fix
Unfeasible or impossible to resolve
World Map
Issues about improving the base map of the whole world that is bundled with the app
World Map
Issues about improving the base map of the whole world that is bundled with the app
No labels
Accessibility
Accessibility
Address
Address
Android
Android
Android Auto
Android Auto
Android Automotive (AAOS)
Android Automotive (AAOS)
API
API
AppGallery
AppGallery
AppStore
AppStore
Battery and Performance
Battery and Performance
Blocker
Blocker
Bookmarks and Tracks
Bookmarks and Tracks
Borders
Borders
Bug
Bug
Build
Build
CarPlay
CarPlay
Classificator
Classificator
Community
Community
Core
Core
CrashReports
CrashReports
Cycling
Cycling
Desktop
Desktop
DevEx
DevEx
DevOps
DevOps
dev_sandbox
dev_sandbox
Directions
Directions
Documentation
Documentation
Downloader
Downloader
Drape
Drape
Driving
Driving
Duplicate
Duplicate
Editor
Editor
Elevation
Elevation
Enhancement
Enhancement
Epic
Epic
External Map Datasets
External Map Datasets
F-Droid
F-Droid
Fonts
Fonts
Frequently User Reported
Frequently User Reported
Fund
Fund
Generator
Generator
Good first issue
Good first issue
Google Play
Google Play
GPS
GPS
GSoC
GSoC
iCloud
iCloud
Icons
Icons
iOS
iOS
Legal
Legal
Linux Desktop
Linux Desktop
Linux packaging
Linux packaging
Linux Phone
Linux Phone
Mac OS
Mac OS
Map Data
Map Data
Metro
Metro
Navigation
Navigation
Need Feedback
Need Feedback
Night Mode
Night Mode
NLnet 2024-06-281
NLnet 2024-06-281
No Feature Parity
No Feature Parity
Opening Hours
Opening Hours
Outdoors
Outdoors
POI Info
POI Info
Privacy
Privacy
Public Transport
Public Transport
Raw Idea
Raw Idea
Refactoring
Refactoring
Regional
Regional
Regression
Regression
Releases
Releases
RoboTest
RoboTest
Route Planning
Route Planning
Routing
Routing
Ruler
Ruler
Search
Search
Security
Security
Styles
Styles
Tests
Tests
Track Recording
Track Recording
Translations
Translations
TTS
TTS
UI
UI
UX
UX
Walk Navigation
Walk Navigation
Watches
Watches
Web
Web
Wikipedia
Wikipedia
Windows
Windows
Won't fix
Won't fix
World Map
World Map
Milestone
Clear milestone
No items
No milestone
Projects
Clear projects
No items
No project
Assignees
Clear assignees
No assignees
1 participant
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".
No due date set.
Dependencies
No dependencies set.
Reference: organicmaps/organicmaps-tmp#3447
Reference in a new issue
No description provided.
Delete branch "rq-alterRoutes-vng"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
I have made a report on my changes and the logic behind them. Please let me know if you have any questions or suggestions.
Alternative Routes: What, How, and Why
This is the page that documenting the key features developed in the Alternative Routes Project for Organic Maps during GSoC 2022. In this report, the author is going to go through the key features one by one while discussing the problems behind the scene, how we coped with the problems, and why we did it in these ways.
Feature 1: Quantified Weight Calculations for Avoid Routing Options
Problem
As some of our users pointed out: Sometimes when a specific toll road is unavoidable, the current "avoid toll roads" option turns useless because no possible routes can be generated based on the current algorithm.


The figure above shows a good example from the user: When trying to reach the southern island in Hong Kong, all the available routes have toll roads.
When "avoid toll roads" option is enabled, no routes can be generated.
The reason behind this is that we are removing all the road candidates with toll when building the route. More specifically, in /routing/index_graph.cpp, we are enabling the avoid mechanisms by conditionally return early in IndexGraph::GetNeighboringEdges() and IndexGraph::GetSegmentCandidateForRoadPoint():
Consequently, roads of the type to avoid will never be taken into consideration for route building, thus making it impossible to generate routes when some specific roads are unavoidable.
Solution
In order to cope with this problem, we came up with the idea of quantifying the avoid routing options. In other words, we take the roads of target type into consideration, but we add extra weight to them. We removed the "candidate dropping" process mentioned above in IndexGraph::GetNeighboringEdges() and IndexGraph::GetSegmentCandidateForRoadPoint() and we added some conditional statements to CalcSegmentWeight() overrides in edge_estimator.cpp. Below is the example for pedestrian estimator:
EdgeEstimator::GetAvoidRoutingOptions() is a new method added to the EdgeEstimator class. In the new implementation, we make the EdgeEstimator to hold the current "state" of avoid routing options. This is done by adding a new member variable "Routing Options m_avoidRoutingOptions" and its corresponding methods. As a result, when estimating the road weight in the route building process, the modified edge estimator can check the current avoid routing options and add extra weight to the results of calculations.
In addition, how is this member variable initialized? In fact, the preparations for this start before the entire route calculations begin. More specifically, the state of EdgeEstimator is set before calling router->CalculateRoute() in async_router.cpp:
Note that "SetEstimatorOptions" is a new method added to IndexRouter for setting the state of its member variable m_estimator.

With the new implementation, the router can still generate routes when we cannot completely avoid a specific type of road. Nevertheless, the route generated minimizes the number of target road type encounters. In this case, as you can see in the figure above, the route takes a detour such that only one charge is needed halfway (which is two if we do not select "avoid toll roads").
Rationale
Why we are making the EdgeEstimator to hold the state of current avoid routing option? This is because the weight calculations for candidate roads happen here. We do not need to implement any additional message passing mechanism before calling CalcSegmentWeight(). Furthermore, there is a one-to-one mapping between IndexRouter and EdgeEstimator (m_estimator is the unique member variable of IndexRouter). So, we do not need to worry about the avoid routing option state in our weight calculations is out of sync with the router.
Why we are only considering the during the number of toll charges in case the cost of one toll road can be higher than multiple toll roads combined? Well, this issue has been discussed before. Different countries have different regulations and we have not come up with a universal idea especially when OSM may not even have the corresponding data.
Future Improvements
As you can see in the earlier section, the "extra weight" value we added to the road to avoid is quite arbitrary: "24 * 60 * 60" -- the time of a day. The logic behind this is straightforward: we are trying to make the weight of roads to avoid "large." But how large? This is probably a question worth further discussions. Maybe we can some dynamic road condition analyses mechanisms here so different roads to avoid have different weights.
Feature 2: The Routing Strategy Feature and Shortest Path
Problem
As stated in the project idea: "The primary limitation of Organic Maps is that only one route variant can be provided by the planner." So, apart from building the fastest route, we also need to have some other routing strategies. The easiest one is "shortest path."
Solution
So, how did we enable the the routing strategy feature? Our solution is pretty much the same as enabling the avoid routing options -- we added a routing strategy "state" for EdgeEstimator, which is a new member variable "Strategy m_strategy." And "Strategy" is a newly defined enumeration class similar to the Road class in routing_options.hpp. Just like the avoid routing options mentioned previously, the initialization of routing strategy is finished before the routing process begins in async_router.cpp:
where methods like "SetEstimatorStrategy()" are also added to IndexRouter class for strategy related operations. Moreover, we also added methods "LoadRoutingStrategyFromSettings()" and "SaveRoutingStrategyToSettings()" which mimic the operations of "LoadRoutingStrategyFromSettings()" and "SaveRoutingStrategyToSettings()" in EdgeEstimator.
As for the implementation of shortest path strategy, our solution is also very straightforward -- eliminate all the extra weight and penalties in weight calculation and make the estimated time proportional with the distance of traveling. Through observations of the original segment weight calculations, we found out that all the extra weight (except those added later for avoid options) are added in CalcClimbSegment() in edge_estimator.cpp. So, we inserted two conditional statements into double CalcClimbSegment():
So, if we have "strategy == EdgeEstimator::Strategy::Shortest" when calculating the segment weight, then the return value of CalcClimbSegment() is simply the distance of road divided by 1.0, making the segment weight proportional with the distance of the road.
Furthermore, we also dismissed the penalty calculations (which is different from weight calculations) in "RouteWeight IndexGraph::CalculateEdgeWeight()" in index_graph.cpp:
As a result, "GetPenalties" will not be called after weight calculations if we have the shortest path strategy.


One example of a "fastest" route in Hong Kong. As you can see in the figure above, the planner tries to make the route go along as many "primary" roads as possible. This strategy takes some detours but the ETA is shorter due to the fact that primary roads have higher speed limit.
With "shortest" strategy enabled, as you can see in the figure above, the planner made a significantly shorted route. But now that we are having more "secondary" roads along the way, the ETA tends to be longer than the previous strategy.
Rationale
The author thinks most of the controversial problems have been discussed earlier in the Solution section. If you have any other problems in this regard, please contact the author.
Future Improvements
When the router is trying to evaluate which road to pick for the route, it seems right now we have two values to support the evaluation -- "weight" and "Penalty." However, the boundary between the two is not very clear from the author's perspective. We have been struggling with which value we should change we implementing avoid routing options and new strategies. "Weight" seems to account for the calculations of climbing penalties of some vehicles, while "Penalty" is responsible for U turns, ferries, and some other malicious factors. Nevertheless, there is no clear definition of the two so far. So, maybe in the future we can re-organize the calculations for weight and penalties so that the route planning process is more efficient and is easier to understand.
Feature 3: Turns Check and the Fewer Turns Strategy
Problem
Taking turns takes time, especially for cars. However, our current implementation does not have a complete mechanism for calculating the penalties of taking turns (We do have U-turn checks and penalties implemented, but we do not have those for normal turns). Besides, "fewer turns" routing strategy is frequently requested by the users. So, it is necessary to implement the functions of:
Solution
How did we implement the function of checking whether there is a turn? We found out that there has already been a similar U-turn checking function in the code base (index_graph.cpp):
Then, we mimicked the style of this U-turn-checking function and made a common turns check function that is slightly more complicated:
A brief explanation of the turn checking process: First, we fetch the latitude and longitude of the starting/ending points of segments u(from) and v(to). Second, using the coordinates of the 4 points, we calculate the vectors of segment u and segment v. Afterwards, we can calculate the dot product and the determinant of the two vectors. Then, the angle between the two vectors can be calculated by taking arctan (check this for references). Last but not least, we check the size of the angle to determine whether we are taking turns between the segments u and v.
How do we calculate the penalties of taking these turns after finding them? We also implemented this in the same way as adding penalties to U-turns. In IndexGraph::GetPenalties(), previously we have:
Now we added a new conditional statement after this:
where GetTurnPenalty is implemented for all child classes of EdgeEstimator. Below is an example from CarEstimator:
Here is a simple comparison between the newly implemented "fewer turns" routing strategy with the original "fastest" routing strategy:


The figure above shows a common fastest route in Hong Kong.
When "fewer turns" strategy enabled, as we can see in the figure above, the router makes the route dramatically "straighter." But the new route is also longer due to the detours.
Rationale
You may have noticed this in the very beginning of the code of IndexGraph::IsTurn(): Why we are doing boundary checks before all the turn calculations? The reason behind this is that, in some situations, though very rare, a segment goes backwards AND has ID = 0, making it impossible to get the valid end point coordinates due to negative overflows. Therefore, we need to make sure that the calculations would proceed without this problem.
Another issue is that, since we already have a "IsTurn()" function that may cover the situations of "IsUTurn()," why don't we delete the "IsUTurn()" and it's usages? This is because "IsTurn()" does not exactly covers "IsUTurn()." If you check the code of "IsUTurn()" carefully you will find out that it works in a different way: it checks whether we are moving on the same "edge" in opposite directions. Moreover, IsUTurn() seems to be used by a variety of other functionalities outside this project. Deleting it may cause unexpected troubles. Meanwhile, keeping IsUTurn may also benefit the route building to some extent -- we are adding "double penalties" to U-turns compared with normal turns. So, the router may not try to take more time-consuming U-turns to avoid normal turns.
Future Improvements
One simple and meaningful improvement is to specify the "turns" into "left turns" and "right turns." This can be done by modify the angle judgement part in "IsTurn":
We can change it to something like this:
This is true because the return value of atan2() in is of range [-pi, +pi]. After converting the radians to degrees we have
-180 <= angle <= 180
In the meantime, how we determine there is an angle can also be improved. Currently, we are simply comparing the angle with 15 degree. But in real life this can be complicated (imagine a crooked road with no crossings has a 30 degree angle). So, maybe in the future we can implement a dynamic turn judging mechanism which decides whether there is a turn by analyzing more road geometry data.
The penalty value for taking turns is another very interesting topic. As showed in the previous section, we are using "60 * 60" for the turns penalty in case we have fewer turns strategy enabled. We set it to be this value because we would like to prioritize the avoid routing options over routing strategies (24 * 60 * 60 additional weight for roads to avoid). But apparently we can make the penalty values better-designed by taking the specific road condition into calculation.