Open source routing engine for OpenStreetMap. Use it as Java library or server.

Overview

GraphHopper Routing Engine

Build Status

GraphHopper is a fast and memory efficient Java routing engine, released under Apache License 2.0. By default it uses OpenStreetMap and GTFS data, but it can import other data sources.

Community

We have an open community and welcome everyone. Let us know your problems, use cases or just say hello. Please see our community guidelines.

Questions

All questions go to our forum where we also have subsections specially for developers, mobile usage, and our map matching component. You can also search Stackoverflow for answers. Please do not use our issue section for questions :)

Contribute

Read through how to contribute for information on topics like finding and fixing bugs and improving our documentation or translations! We even have good first issues to get started.

Get Started

To get started you can try GraphHopper Maps, read through our documentation and install the GraphHopper Web Service locally.

Click to see older releases

Installation

To install the GraphHopper Maps and the web service locally you just do:

# download and install a JVM that supports at least Java 8 (https://adoptopenjdk.net)
wget https://graphhopper.com/public/releases/graphhopper-web-2.3.jar https://raw.githubusercontent.com/graphhopper/graphhopper/stable/config-example.yml http://download.geofabrik.de/europe/germany/berlin-latest.osm.pbf
java -Ddw.graphhopper.datareader.file=berlin-latest.osm.pbf -jar *.jar server config-example.yml

After a while you see a log message with 'Server - Started', then go to http://localhost:8989/ and you'll see a map of Berlin. You should be able to right click on the map to create a route.

For more details about the installation, see here.

GraphHopper Maps

To see the road routing feature of GraphHopper in action please go to GraphHopper Maps.

GraphHopper Maps

GraphHopper Maps uses the commercial offering the GraphHopper Directions API under the hood, which provides the Routing API (based on this routing engine), a Route Optimization API based on jsprit, a fast Matrix API and an address search based on photon. The photon project is also supported by the GraphHopper GmbH. Additionally to the GraphHopper Directions API, map tiles from various providers are used where the default is Omniscale. All this is available for free, via encrypted connections and from German servers for a nice and private route planning experience!

Public Transit

Get started

Realtime Demo

Mobile Apps

Online

There is a web service that can be consumed by our navigation Android client.

android navigation demo app

Offline

Offline routing is no longer officially supported but should still work. See version 1.0 with still an Android demo and this pull request of the iOS fork including a demo for iOS.

simple routing

Analysis

There is the isochrone subproject to calculate and visualize the reachable area for a certain travel mode

Isochrone Web API

Isochrone API image

Shortest Path Tree API

high precision reachability image

To support these high precision reachability approaches there is the /spt endpoint (shortest path tree). See #1577

Map Matching

There is the map matching subproject to snap GPX traces to the road.

map-matching-example

Technical Overview

GraphHopper supports several routing algorithms, such as Dijkstra and A* and its bidirectional variants. Furthermore, it allows you to use Contraction Hierarchies (CH) very easily. We call this speed mode; without this CH preparation, we call it flexible mode.

The speed mode comes with very fast and lightweight (less RAM) responses and it does not use heuristics. The downsides are that the speed mode allows only pre-defined vehicle profiles (multiple possible in GraphHopper) and requires a time consuming and resource-intensive preparation.

Then there is the hybrid mode which also requires preparation time and memory, but it is much more flexible regarding changing properties per request or e.g. integrating traffic data. Furthermore, this hybrid mode is slower than the speed mode, but it is an order of magnitude faster than the flexible mode and uses less RAM for one request.

If the preparations exist you can switch between all modes at request time.

Read more about the technical details here.

License

We chose the Apache License to make it easy for you to embed GraphHopper in your products, even closed source. We suggest that you contribute back your changes, as GraphHopper evolves fast, but of course this is not necessary.

OpenStreetMap Support

OpenStreetMap is directly supported by GraphHopper. Without the amazing data from OpenStreetMap, GraphHopper wouldn't be possible at all. Other map data will need a custom import procedure, see e.g. Ordnance Survey, Shapefile like ESRI or Navteq.

Written in Java

GraphHopper is written in Java and officially runs on Linux, Mac OS X and Windows.

Maven

Embed GraphHopper with OpenStreetMap support into your Java application via the following snippet:

<dependency>
    <groupId>com.graphhopper</groupId>
    <artifactId>graphhopper-reader-osm</artifactId>
    <version>[LATEST-VERSION]</version>
</dependency>

See our example application to get started fast.

If you want to write your own import procedure, then you might only need:

<dependency>
    <groupId>com.graphhopper</groupId>
    <artifactId>graphhopper-core</artifactId>
    <version>[LATEST-VERSION]</version>
</dependency>

Customizable

We've built the GraphHopper class which makes simple things easy and complex things like multi-modal routing possible. Still, you can use the low level API of GraphHopper and you'll see that it was created to allow fast and memory efficient use of the underlying data structures and algorithms.

Web UI and API

With the web module, we provide code to query GraphHopper over HTTP and decrease bandwidth usage as much as possible. For that we use an efficient polyline encoding, the Ramer–Douglas–Peucker algorithm, and a simple GZIP servlet filter.

On the client side, we provide a Java and JavaScript client.

Desktop

GraphHopper also runs on the Desktop in a Java application without internet access. For debugging purposes GraphHopper can produce vector tiles, i.e. a visualization of the road network in the browser (see #1572). Also a more low level Swing-based UI is provided via MiniGraphUI in the tools module, see some visualizations done with it here. A fast and production ready map visualization for the Desktop can be implemented via mapsforge or mapsforge vtm.

Features

Here is a list of the more detailed features:

  • Based on Java and simple start for developers via Maven.
  • Works out of the box with OpenStreetMap (osm/xml and pbf) and can be adapted to custom data
  • OpenStreetMap integration: stores and considers road type, speed limit, the surface, barriers, access restrictions, ferries, conditional access restrictions, ...
  • GraphHopper is fast. And with the so called "Contraction Hierarchies" it can be even faster (enabled by default).
  • Memory efficient data structures, algorithms and the low and high level API is tuned towards ease of use and efficiency
  • Provides a simple web API including JavaScript and Java clients
  • Multiple weightings (fastest/shortest/custom/...) and pre-built routing profiles: car, bike, racing bike, mountain bike, foot, hike, motorcycle, wheelchair, ...
  • Customization of these profiles are possible to get truck and cargo bike support or individual improvements
  • Does map matching
  • Supports public transit routing and GTFS.
  • Offers turn instructions in more than 42 languages, contribute or improve here
  • Displays and takes into account elevation data
  • Can apply real time changes to edge weights (flexible and hybrid mode only)
  • Alternative routes
  • Turn costs and restrictions
  • Country specific routing via SpatialRules
  • The core uses only a few dependencies (hppc, jts, janino and slf4j)
  • Scales from small indoor-sized to world-wide-sized graphs
  • Finds nearest point on street e.g. to get elevation or 'snap to road' or being used as spatial index (see #1485)
  • Calculates isochrones and shortest path trees
  • Shows the whole road network in the browser for debugging purposes ("vector tile support") #1572
  • Shows details along a route like road_class or max_speed ("path details") #1142
Comments
  • Edge-based Contraction Hierarchies and Turncost support

    Edge-based Contraction Hierarchies and Turncost support

    This PR shall enable turn costs for contraction hierarchies as described in this paper by R. Geisberger and C.Vetter.

    This PR fixes #270 and has the same goal as #912, but follows a rather different approach and is much closer to what is described in the paper. Several of the problems described in #912 are addressed here like multiple loops/p-turns, u-turn detection and fixed size turn cost tables. Fundamentally this is realized by storing two additional integers per shortcut edge, which are set to the IDs of the first and last original edges that are skipped by the shortcut. Doing this requires many adjustments of the CH query algorithm (when expanding nodes and when checking bridge nodes where forward and backward searches meet) as well as the node contraction / shortcut searches.

    What is working so far:

    • (Hopefully) error-free implementation of the node contraction and query algorithms. There are extensive tests that try to cover all edge cases, some of them compare the query results with the standard Dijkstra implementation for many queries and node contraction orders. So far it looks like all situations are handled correctly. The U-Turn based traversal mode is not yet supported and requires further changes and tests (if it should be supported), see comment below.

    Next steps:

    • Integration with previous (node-based) CH code (NodeContractor and PrepareContractionHierarchies) and support for automatic node ordering. So far the nodes can only be ordered in random order or ordered by ID, but this makes no sense for larger graphs. So far EdgeBasedNodeContractor does not return any metrics that can be used for node ordering heuristics.

    • Integration with Graphhopper API and integration tests, see what the performance is like.

    • Performance optimizations: There are many obvious things that can be improved:

      • Probably the most important thing is reusing data structures between the different witness path searches, something like DijkstraOneToMany. For the turn replacement difference algorithm that is being used we need a way to initialize the search with edges adjacent to the start node and it must be possible to initialize them with arbitrary weights.

      • Tuning of the node contraction parameters. The above mentioned paper describes a different metric than the one that is currently used for example. We can start with something simple (edge difference / quotient only for example) and see what the performance is like.

      • Minor stuff: See some of the todos in the code, there is definitely room for improvements.

    new feature algorithm 
    opened by easbar 69
  • Add Average Speed as PathDetails to Response

    Add Average Speed as PathDetails to Response

    Fixes #439.

    I added the possibility to view details of the calculated as proposed in #439. It should be very easy to extend so we can add different details.

    The calculation of the PathDetails is a bit similar to Instructions and maybe in the future we might find that it makes sense to merge them, but not now.

    I haven't measured the performance yet, but I can do this if you like the general approach.

    Simplification is disabled when adding PathDetails right now.

    Right now I don't like two things:

    • The data structure, not an issue right now, but maybe if we output osm ids for continental requests? Also see the conversion in the SimpleRouteSerializer. I think, wrapping the PathDetails in a Map again, might be more efficient. Overall it is a bit too much map usage IMHO, but it seems like the right data structure ;).
    • The initialization happens in the GraphHopper class, right now not an issue, but once we have more details, we might want to move this somewhere else.

    Future improvements: Change the way the Instructions are generated so that we generate the intervals for the instructions in the PathMerger. Then we could try to simplify points between PathDetails/Instructions without simplifying over the bounds of any of the two.

    new feature 
    opened by boldtrn 52
  • (WIP) EncodingManager refactoring

    (WIP) EncodingManager refactoring

    This is a first sketch of a new approach to improve the flexibility for the edge property storage and it fixes #472, #728, #978 and probably some more issues.

    For the moment just look at the nice FastestCarWeighting and how we fetch the values in the constructor that are necessary in the calcWeight method, really easy and understandable:

    double speed = edgeState.get(averageSpeed);
    

    These values are composed upfront and are responsible just for a value (and optionally a reverse value), have a look into OSMReaderTest.testEncodedValueBasedEncodingManager for a complete test parsing an OSM file.

    So all in all I was able to remove the necessity of the FlagEncoder classes. So just EncodingManager and a list of EncodedValue is necessary. And the best: this already works within the existing system and the new EncodingManager is compatible with the old.

    I've created a EncodedValueFactory to create some default EncodedValues like maxspeed, surface, 'car access' etc so that useful Weightings can be created.

    The main changes in this PR:

    1. long flags was replaced with a IntsRef that is not limited to 64bits (later on we could use this for all edge properties like distance and pointers, also there is a minor advantage that we could point directly into the storage backing array instead of copying but this is for a later PR)
    2. new directed EncodedValue that are able to store forward and backward values, no need for expensive reverseFlags method, much simpler usage in Weighting implementations, no need for flag encoders but still backward compatible to them

    main goals of this PR:

    • edge storage should allow more than 64bits per edge
    • easier storing of edge properties -> EncodedValue methods
    • EncodingManager will be EncodedValues based
    • avoid reverseFlags

    non-goals:

    • remove FlagEncoders
    • fix PathExtract
    • flexible storage for relation and node
    • solve problem with two bits for access restriction versus speed==0

    Further work items:

    • rename MappedXY to more common DictionaryXY?
    • use new EncodedValue classes in old FlagEncoder classes: DataFlagEncoder, CarFlagEncoder, ...
    • merge master into this branch
    • what to do with the unfavoredEdge used only in QueryGraph -> do we need a 0-bit EncodedValue used just as a 'marker'?
    • use two EncodedValues (weight and access) for shortcuts in CHGraphImpl -> advantage would be that we would be able to store weight with higher precision
    • version of every EncodedValue to make loading graph more secure?
    • avoid Weighting.getFlagEncoder
    • replace AbstractFlagEncoder and FlagEncoder with something less ugly, separate turn and node flags (Profile == collection of EncodedValue or ComposedEncodedValues)
    • maybe rename all XY08 into XYOld or XY09 instead? Add a deprecation notice and removal with 1.x
    • remove all the TODOs and ugly hacks
    • copyProperties can be done via array copy and setting just the node indices afterwards
    • define TagParser order
    • OSMReader is currently doing duplicate work to calculate bits of one OSM way, instead it should calculate the bits once and just array copy to the other edges using edge.get&setData?
    • InstructionAnnotation getAnnotation -> remove this or replace by a ComposedEncodedValue that can warn about private, tool, ferry or ford access?
    • separate TurnWeighting handling -> how to do storage of OSM-node and OSM-relation information?
    • ~~merge new EncodingManager with old~~
    • ~~try a real world example and parse OSM with a car profile and query via the new weighting mechanism~~
    • ~~use IntRefs instead of int flags~~
    • ~~a directed DoubleProperty and BooleanProperty class that holds two values (one value for a direction) that can be easily 'reversed' -> ComposedEncodedValue holds multiple encoded values? support get and getReversed directly for every encodedValue?~~
    • ~~should we introduce a PropertyFilter so that a maxspeed is not parsed and calculated if the highway tag is not accepted ('rail')?~~
    • ~~move out EncodedValue.parse into something else to make support of non-OSM easier~~

    Later:

    • allow cross-integer space for EncodedValue otherwise we can get bad constellations e.g. if EncodedValue has two directions and requires e.g. 17 bits
    • we could introduce a "reverse" EdgeExplorer or iter.setBaseNode(node, reverse=true) and then avoid the reverse parameter in Weighting.calcWeight as well as the if clauses to fetch e.g. the forward or the reverse speed. I.e. one edge is directed API-wise and undirected storage-wise. We should do this undirected vs. directed stuff in a later step, see also https://github.com/graphhopper/graphhopper/pull/1112#issuecomment-322522398
    • store distance as an EncodedValue
    • But in general we need length dependent mechanism somehow
    • reimplement the CarFlagEncoder as a ComposedEncodedValue?
    • PathExtract should be more separated (call extract explicitly after calcPath and potentially rename calcPath to calcShortestPathTree)
    • solve problem with two bits for access restriction versus speed==0; what to do if a reverse read-out of a oneway edge: exception vs. silently ok? how would we do the exception - via a new setting "read of default value results in exception" or somehow associating the access-EncodedValue with e.g. the max_speed-EncValue?
    improvement architecture refactoring 
    opened by karussell 51
  • Dropwizardifying

    Dropwizardifying

    New PR: #1314

    Main conceptual changes (web module only):

    • ~~Guice Modules are now wrapped by Dropwizard/Guice Bundles~~
    • GraphHopper is wrapped by a GraphHopperService (something which can be started and stopped, managed by Dropwizard/Jetty), so that no heavy lifting is done at the time the Injector is created.
    • ~~Servlets access things which are constructed by GraphHopper via a Provider, because now the Injector with the Servlets is not created by us (in "user space"), but by the framework, and that means that the things which GraphHopper creates aren't there yet (because GraphHopperService is not yet started), so we have to access them lazily. (This is because Servlets are always Singletons, created at startup, according to specs.~~ The issue disappears for Dropwizard/Jersey Resource classes, which can simply be (by default, even?) created per-request, so issues of initialization order don't arise.)
    • The Configuration (Dropwizard concept) only wraps the CmdArgs for now. This is where to continue! I think half of GraphHopper's initialization/configuration/"manager" code will dissolve if we replace this by a hierarchy of configuration objects (which can include factories), which are automatically assembled from .yml (or anything else Jackson can parse), but can also be put together by hand, in Java.
    • The custom web integration test code is gone. Seems to work fine with the Dropwizard/Jersey client and test support classes, out of the box.
    • For the other web-services (map-matching, isochrones, etc.), no sub-classing or anything is required. You just compose Bundles.
    • TODO: Much of the custom Jetty configuration code is gone. Don't know how much of that is really missing/breaking anything. But maybe we could rather check if we can remove even more (IP filters etc.), as maybe that doesn't really belong in the web application but should be done by some outside proxy, or something.
    opened by michaz 50
  • Add U-Turns

    Add U-Turns

    This PR fixes #1064. This PR is adding U-Turn instructions.

    We recognize 3 types of U-Turns:

    • Heading is opposite to the orientation of the first instruction. Convert CONTINUE => U-TURN
    • At waypoints, if we have to turn around at the waypoint. Convert CONTINUE => U-TURN
    • When performing two turn in the same direction in a very short distance. The street before and after the turn have to have the same name and the orientation has to be more or less opposite. This converts two TURNS => One U-TURN.

    http://localhost:8989/?point=48.005027%2C7.997961&point=48.005874%2C7.999538&heading=230 initial-u-turn http://localhost:8989/?point=48.017509%2C8.008572&point=48.019012%2C8.008116&point=48.018319%2C8.010836&vehicle=bike u-turn-wp http://localhost:8989/?point=47.996983%2C7.841899&point=47.996987%2C7.842087 example-u-turn

    The third method performs pretty well for cars and fixes most of the u-turns. One issue is that we require two turn instructions. In some cases we don't create a turn instruction because there is no other possible turn, in this case we cannot convert the instruction to a u-turn, e.g., here.

    I also required that the road to u-turn on is a one way. I have seen some cases where a u-turn was created that is not a real u-turn. Here are some examples in Baden-Württemberg. I found these examples using measurement, with foot and printed the location of every u-turn. So these examples are not very frequent, but they exist:

    • http://localhost:8989/?point=48.870569%2C8.646058&point=48.870509%2C8.645768
    • http://localhost:8989/?point=47.881974%2C7.824572&point=47.882046%2C7.824427
    • http://localhost:8989/?point=47.954715%2C7.777317&point=47.954693%2C7.777017
    • http://localhost:8989/?point=48.893573%2C10.004784&point=48.893471%2C10.005176&vehicle=foot
    • http://localhost:8989/?point=49.769659%2C9.469453&point=49.769784%2C9.469732

    When only showing u-turns for one-way streets the samples above don't produce turn instructions. When thinking about this a bit more I think usually u-turns are only relevant for major roads that are usually one-ways separated from each other with designated u-turn lanes or u-turning at traffic lights. So this limitation makes sense for me.

    TODO:

    • [x] Add U-turn icon
    • [x] Decide if we want different signs for left and right u-turns
    • [x] Decide if we want a different translation for the different u-turns
    improvement 
    opened by boldtrn 50
  • Improve pointlist output for isochrone (/spt endpoint)

    Improve pointlist output for isochrone (/spt endpoint)

    Update: this is now a pure CSV endpoint:

    longitude,latitude,time,distance
    lon1, lat1, time1, distance1
    lon2, lat2, time2, distance2
    

    where you can add more columns like prev_latitude,prev_longitude or path details like road_class

    The client code example snippet is here and also see the deck.gl for R tool.

    Original text:

    The pointlist option was not really useful as it came with just the coordinates. ~Have now created a compact but extendable JSON format~ (read update).

    {  "description": ["longitude", "latitude", "time", "distance"],
       "items": [
         [lng, lat, time, distance],
         [...]
       ]
    } 
    

    Thx @crazycapivara for the valuable discussion! He created a deck.gl for R tool and future versions will likely work with graphhopper. See also the work here with deck.gl and a forked graphhopper (this should be possible after this PR without forking). See also related #1572.

    TODOs:

    • [x] use different endpoint name, e.g. /shortest-path-tree or /spt
    • [x] create List<IsoLabelWithCoordinates> in IsochroneResource to make Isochrone method more powerful?
    • [x] ~allow paging through the pointlist result with some caching?~ later
    web improvement 
    opened by karussell 48
  • Weighting support via yaml configuration

    Weighting support via yaml configuration

    fixes #1776 fixes #223

    Note

    Disclaimer: custom profiles are considered an alpha feature in version 1.0 and 2.0. Using them should work, but the format, the weight formula and the meaning of the different parameters is still subject to change. Also this feature will strongly benefit from community feedback, so do not hesitate with sharing your experience, custom profiles or problems you are running into!

    You can try this feature in the linked small tutorial. Please note that the format changed in version 3.0 - see here for the pull request and the blog post with examples which is always updated to the latest version including a demo server.

    Usage

    First you need to define a custom profile:

    profiles:
      - name: car
        vehicle: car
        weighting: custom
    

    Then you can use this profile in a custom request. You query a json towards the new endpoint /route-custom. In the following section we use yaml to allow comments (you can convert it with this node js tool or this online tool):

    # query parameters:
    points: [[10.373926, 52.042989], [10.384043, 52.042289]]
    details: [road_class, street_name]
    
    # pick the previously defined custom profile
    profile: car
    
    # The formula is defined in CustomWeighting, where the speed_factor can be used to decrease speed.
    # The minimum value is 0 and the maximum is 1. If two conditions are satisfied the values are
    # multiplied e.g. if road_class==motorway and road_environment==tunnel, then the resulting speed is
    # average_speed*0.85*0.9.
    speed_factor:
      road_environment:
        tunnel: 0.85
      # trucks should be a bit slower on certain road classes compared to the 'base' car
      # a more compact JSON-way to list the properties, fully YAML-compatible:
      road_class: { motorway: 0.85, primary: 0.9 }
    
    # You can lower the average speed for certain conditions via this max_speed entry. The speed_factor is applied before
    # this operation. See the following example that sets the maximum speed to 95km/h for motorways.
    max_speed:
      road_class:
        motorway: 95
        residential: 30
      road_environment:
        bridge: 85
    
    # Trucks are slower so limit all speed to this value. In km/h
    # If none of the conditions in the map above apply use the fallback, if specified:
    max_speed_fallback: 100
    
    # This term changes the influence of the distance. I.e. longer roads get a higher cost.
    # The distance_influence is independent of the edge properties and does not influence the ETA. The default is 70 (seconds/1km).
    # Let's assume a route that takes 1000sec and is 10km long, then a value of 30 means that I would like to drive maximum 11km
    # to reduce the travel time to 970sec or 12km to reduce it to 940sec.
    distance_influence: 90
    
    # Now we want to set a preference without changing the taken time. The default priority is 1 and does not change something.
    # Higher than 1 is not possible directly, only via the catch-all key "*", see road_class where motorways are preferred. Lower than 1 will avoid it.
    # If two conditions are met the values will be multiplied. The minimum value is 0 (block access) the maximum value is 100.
    priority:
      road_class:
        motorway: 1.0
        residential: 0.4
        "*": 0.9
        # and if you do not want that tracks go over tracks just exclude them via
        # track: 0
      # let's assume we transport gas: so NEVER go on restricted roads with hazmat==no
      hazmat: { no: 0 }
      # avoid destination-only roads
      road_access: { destination: 0.1 }
      # avoid turns if possible and links are one simple indication for that
      road_class_link:
        true: 0.5
      # avoid toll roads
      toll: { no: 1, "*": 0.5 }
      # avoid a certain area
      area_custom1: 0.5
      max_weight: { "<4.5": 0 }
      max_height: { "<3.8": 0 }
      max_width: { "<2.5": 0 }
    
    areas:
      custom1:
        type: "Feature"
        geometry: { type: "Polygon", coordinates: [[[13.722, 51.053], [13.722, 51.055], [13.731, 51.055], [13.731, 51.053], [13.722, 51.053]]] }
    

    Or a cargo bike:

    profile: bike
    
    # let's assume cargo bikes are e-bikes and we should lower speed to prefer shorter and not faster routes automatically
    max_speed:
      road_class:
        primary: 28
    
    # if no other condition matches
    max_speed_fallback: 25
    
    priority:
      # exclude steps
      road_class:
        steps: 0
      surface:
        sand: 0.5
      # prefer better tracks
      track_type: { other: 1.0, grade1: 1.0, "*": 0.9 }
      # prefer official bike routes
      bike_network: { other: 0.5 }
      # avoid all situations where we have to get off the bike
      get_off_bike:
        "true": 0.5
      max_height:
        "<2.3": 0
      max_width:
        "<1.2": 0
    

    Now the interesting part is that you can try this out in the demo UI and when you are happy you can use the exact same content to create a file (e.g. truck.yml) and use it for the LM or CH preparation to make the query much faster, like so:

    profiles:
     - name: truck
       vehicle: car
       weighting: custom
       custom_model_file: path/to/truck.yml
     - name: cargo_bike
       vehicle: bike
       weighting: custom
       custom_model_file: path/to/cargo_bike.yml
    

    To query such a prepared custom profile you specify e.g. profile=truck. If you want to customize your request further you use A* or LM and the /route-custom endpoint. If no further customization is required or you want to use a CH-prepared custom profile you use the /route endpoint.

    When you try this out in the UI you currently have to include custom weighting and potentially disabling turn cost: http://localhost:8989/maps/?point=51.060063%2C13.714714&point=51.064378%2C13.756599&weighting=custom&turn_costs=false

    • [x] basic changes of the Weighting already work
    • [x] examples and description is available in truck.yml, RouteResourceTest and CustomWeightingRouteResourceTest. Other examples could be: wheelchair (base:foot), electric_bike, cargo_bike (base:electric_bike -> which is not a FlagEncoder!), electric_car (base:car), bike that prefers official bike routes much more, fire_truck (base:truck), scooter (speed limited car?)
    • [x] query via json or yaml
    • [x] no need for a jackson dependency in core
    • [x] ~~implement DelayFlexConfig~~ see below
    • [x] for now remove delay as there are similar problems like for elevation (needs to be splitted for virtual edges) otherwise it sums up if there are several query points on a single edge.
    • [x] -d for curl does not work for yaml as it strips line breaks. Instead use --data-binary
    • [x] make FlexModelWeighting possible for CH and LM preparation too, without introducing a jackson dependency to core (due to Android)
    • [x] priority is implemented wrong => it should be priority=1/factor
    • [x] support for weight, height, width limitations
    • [x] more "FlexModelWeighting" features like shown here should follow in separate PRs
    • [x] merge FlexResource into RouteResource but only support it for POST
    • [x] simple UI support like here
    • [x] throw illegal arg exception if we use max_height but this is not supported from the storage.
    • [x] documentation in config-example.yml and docs/ maybe
    • [x] rename weight -> max_vehicle_weight etc
    • [x] Yaml is much more standard & "better", but even our simplistic gscript implementation had a much better error reporting. Maybe also allow ScriptedWeighting via some interfaces and bring it other languages. For now yaml is ok. Later we might add a ScriptedWeighting.
    • [x] ~~if speed value is too slow => rounding to zero => is blocking desired?~~ should not happen as we do not store the weight again into an EncodedValue
    • [x] ~~different/separate formula for calcWeight vs. calcTime?~~ probably not now
    • [x] add difference of average_speed handling (first wins) vs. speed_factor handling (all multiplied) to docs
    • [x] throw error if value in average_speed is higher than max_speed
    • [x] add custom request to Measurement
    • [x] extend from AbstractWeighting
    • [x] A very significant route change and query speed difference between normal "car" requests and a custom weighting with base: car is the default of distance_factor being 1 instead of 0. I.e. a normal car request takes 1100ms and the same as custom request with just "base: car" takes only 350ms. For now changed this default to 0.07 (copied from ShortFastestWeighting)
    • [x] replace average_speed with a "max speed" variable or even remove it completely? The average_speed is not that useful. The speed value could be from traffic sources and we would completely overwrite it by a rather simple condition like road_class==motorway. Also it should be probably more a max_average_speed (instead of max speed)
    • [x] before merging we need #729
    • [x] CustomerWeighting should always increase weight (normalize priority and factor)
    • [x] CustomWeighting does not work with LM (not in Measurement and not in RouteResource)
    • [x] See issue #1708. Instead of base should we always pick the vehicle from the request? (this won't work for CH.) -> Do not use vehicle as it will collide with GHRequest.vehicle.
    • [x] avoid nesting the model in the request because using the profile in a request or a request for a profile is ugly and only possible via editing. But then a separate endpoint is required?
    • [x] throw exception if vehicle and weighting is specified in URL but does not match -> not needed if good documentation
    • [x] introduce distance_factor map
    • [x] web UI: keep flex config between requests (update: this only happens when setting weighting=flex as url parameter)
    • [x] "sum" of terms instead of "multiplication" would make more sense, but then "preferring" a certain attribute is no longer as easy and often a requirement if we want to keep the yaml expressions simple (i.e. no complex boolean algebra)
    • [x] check again about A* correctness (min weight -> priority and speed range)
    • [x] is distance_factor map really necessary or too complicated too understand the nuances to "inverse priority"? -> for now remove it
    • [x] allow boolean encoded values too like road_class_link or get_off_bike. Would be great to use this for "avoiding".
    • [x] support block_area in the CustomModel
    • [x] simple turn cost support for query -> already works via root-level fields populated GHRequest.hints (e.g. disabling works via edge_based: false)
    • [x] switch to snake case is a bit ugly as current config.ymls stop working
    • [x] Avoid error: "You can try disabling LM by setting lm.disable=true"
    • [x] try using country enum
    • [x] remove snake case as it is already in PR #1918
    • [x] for fun try "avoid left turns" via per-request geometry evaluation https://github.com/graphhopper/graphhopper/commit/38b62f069f5f2f48e84b3d50cf4bbf85286cb4d2
    • [x] remove newly introduced name parameter from AbstractWeighting
    • [x] change formula to either (const_distance_term + 1/v/prio)*d (no multiplication of prio with const_distance_term) or (const_distance_term + k/v + sum(some_map))*d (instead of priority multiplication use summation)
    • [x] replace mixins with SNAKE-enabled jackson parser
    • [x] if a CustomModel abc is known to GraphHopper and then there is a CustomRequest with profile=abc but a few parameters have changed, then it should be possible to merge them. Maybe in CustomWeighting.prepareRequest?
    • [x] is it ugly that we do profile=custommodel against /route but if it is a CustomRequest it is against /route-custom. Especially if it is a CustomRequest with profile=custommodel (see point above) it gets strange.
    • [x] turn cost support for CH/LM preparation -> should be already done via profiles
    • [x] CustomModel.merge should multiply (or pick maximum) to keep LM-correctness
    • [x] solve #1708
    • [x] change endpoint to /route-custom
    • [x] add JSON support for file import and remove yaml endpoint
    • [x] formula change #2021
    • [x] merge different ranges of DecimalEncodedValue
    • [ ] update docs
    • [x] revert FlagEncoder changes

    Later:

    • [ ] solve #1835
    • [ ] CustomRequest for Isochrone & SPT endpoint (POST request)
    • [ ] preliminary & simple tests show at least 20% slower CH preparation even for a very simple FlexModel. -> minor improvements to 10% - but for the simple case only! Can we somehow cache calls to edge.get(roadClass) so that at least if only road_class is used for the different FlexConfigs it does not get slower?
    • [ ] Cache EncodedValues in a later issue
    • [ ] try to get car turn restrictions working for a bike model (car.turn_cost)
    • [ ] web UI: show more useful error messages?
    • [ ] allow DoubleEncodedValue as value on the "right side" e.g. to directly use an EncodedValue as speed_factor. This is a bit complicated as we do not know the maximum value and cannot ensure correctness for LM.
    • [ ] allow != and &&
    • [ ] later allow a special shorter notation ala speed_factor: { road_class: { motorway||trunk: 1.1 }} instead of speed_factor: { road_class: { motorway: 1.1, trunk: 1.1 }}?
    • [ ] elevation. Let us assume we store the up and down elevation in EncodedValues then this is more involved for a QueryGraph as we need to split this for virtual edges like it is currently done also for the distance. Keep in mind that there are different use cases for elevation: one for weight-only (electric car) and one where weight and time is changed (bike that avoid hills). Also do delay (time offset) later as same problems like for elevation #1898
    • [ ] avoid changing a country
    • [x] turn cost support in Weighting class (see #1820) and also for importFlexModels
    • [ ] ScriptedWeighting
    new feature 
    opened by karussell 44
  • Potential Improvement: Introduce max Request Time in the Backend

    Potential Improvement: Introduce max Request Time in the Backend

    Hi,

    I just came up with a potential improvement. We have a timeout parameter in the js file. How about adding a timeout to each request in java?

    The timeout could be configureable.

    Not sure if this makes sense?

    Best, Robin

    web improvement good first issue architecture 
    opened by boldtrn 44
  • Random Round Tours

    Random Round Tours

    This PR contains the possibility to create random round tours. When passing tour_length=APPROX_DISTANCE_IN_KM to the request it returns a roundtour of approximately the requested distance. The actual distances can vary a lot, since I only calculate the beeline distance of the waypoints.

    The current results are ok, but not good. Especially because the unique_paths PR is not included here (this will probably improve the results.

    Currently this feature is not available in the GUI. We just use the first waypoint and create a route.

    Something that could be added as well is to calculate a number of tours and select the best one, to remove bad results created by this approach.

    new feature 
    opened by boldtrn 43
  • Initial implementation of turn restriction support

    Initial implementation of turn restriction support

    Here's my attempt to let graphhopper support turn costs/restrictions (turn cost = time a turn would cost, turn restriction = infinite turn cost, turn is prohibited). At the moment only simple turn restrictions will be imported. You can enable turn restriction support by GraphHopper.enableTurnCosts() and you need to re-import your osm files. If you want to use turn restrictions together with contraction hierarchies you must decide on preparation time if and which kind of turn cost calculation you want to use. Once the graph has been prepared for contraction hierarchies you cannot switch to another turn cost calculation. This behavior should be familiar since you need to decide on preparation time as well which EdgePropertyEncoder and which WeightCalculation you want to use.

    Turn costs are stored in a separate storage. For each turn cost entry the edge id from which the turn goes, the edge id to which the turn goes and the costs of the specific turn is stored. The costs are encoded by TurnCostEncoder, which allows to store separate costs for car and bike in one integer value. When searching for shortest routes only restrictions will be considered, when searching for fastest routes restrictions AND turn costs will be considered. For pedestrians no turn costs or restrictions will be considered.

    Feel to try it out. I will add some more details to my implementation when I have a bit more time, maybe tomorrow.

    opened by kschrab 43
  • SpatialRuleLookup Refactoring

    SpatialRuleLookup Refactoring

    I am just creating a second PR here, to discuss @michaz nice refactoring of the SpatialRuleLookup. I cannot really comment on the Landmark part, this should be done by @karussell IMHO. I cannot create this PR on top of my PR as the spatial branch is in the graphhopper repo and my branch is in my gh fork. I would be fine with simply closing my other PR?

    I really like the concept of using simple DataTypes as defaults instead of null/empty checks :+1:. Something I don't like is that we cannot create a smaller BBox than provided by the rules anymore.

    opened by boldtrn 42
  • add

    add "permit" as allowed access value

    This ferry uses the unusual tagging motor_vehicle=permit. Should we support this only for ferries or as general access tag? What is the difference to "yes"?

    opened by karussell 1
  • incorrect country due to long OSM way?

    incorrect country due to long OSM way?

    The country (NOR) for edge is not correct for destination here: https://graphhopper.com/maps/?point=68.408295%2C18.128023&point=68.408277%2C18.128039&profile=hike

    bug 
    opened by karussell 5
  • New profile for busses

    New profile for busses

    My company needed to be able to calculate routes specifically for buses. As discussed in #2659 , I created a new profile for this purpose. Now, we would like to make this available for others.

    As already explained in the issue, the VehicleTagParser will also be removed in the long run. Therefore, I can understand if the PR will not be merged. If the case I described can now be implemented by other means, I will of course not merge the PR either. I am pleased about your feedback.

    opened by DanielAMCON 12
  • Add metadata to public transportation legs.

    Add metadata to public transportation legs.

    opened by ainar 1
  • Make use of node tags like 'highway' or 'crossing'

    Make use of node tags like 'highway' or 'crossing'

    So far we keep node tags only for barrier nodes, but with a few small changes we can also provide the tags of all nodes belonging to the current edge to the tag parsers. This allows us to write encoded values that consider traffic lights, pedestrian crossings etc.

    We read the node tags during the second OSM pass (because only then do we know which nodes belong to the ways we are interested in) and then we need to keep around until we read the ways in the second pass. Keeping all the node tags is not as bad as it sounds, though. I did a test for Germany and there were 540_000 nodes with barrier tags (which we already keep around anyway) and the total number of nodes with tags was around 2_600_000, so around five times as many.

    Here are the most frequent node tags (only nodes belonging to highways were counted and note that nodes carrying multiple tags appear once for each tag in these numbers):

    highway: 1.12%, 791784
    barrier: 0.76%, 537916
    name: 0.51%, 364319
    crossing: 0.42%, 294333
    created_by: 0.39%, 276287
    public_transport: 0.35%, 246989
    bus: 0.34%, 242477
    bicycle: 0.28%, 200287
    foot: 0.26%, 182614
    tactile_paving: 0.26%, 180970
    entrance: 0.25%, 178177
    noexit: 0.21%, 150552
    traffic_sign: 0.18%, 125280
    access: 0.18%, 124076
    crossing:island: 0.15%, 108724
    direction: 0.14%, 97463
    railway: 0.13%, 91601
    network: 0.10%, 68049
    kerb: 0.09%, 63401
    button_operated: 0.09%, 61035
    wheelchair: 0.08%, 55419
    source: 0.08%, 54207
    traffic_signals:sound: 0.08%, 54145
    ref:IFOPT: 0.07%, 52075
    traffic_signals:direction: 0.07%, 51788
    

    We could reduce the number of tags we need to store by excluding some we definitely don't need, like created_by=JOSM for example, but not even sure if this is really needed. If we want to save memory we should probably rather focus on using a more efficient way to store the tags as currently this is simply a List<Map<String, Object>>. But this is probably something for later and first we should check how useful the node tags can be (hence this draft PR).

    The node tags are available to all tag parsers via:

    List<Map<String, Object>> nodeTags = (List<Map<String, Object>>) way.getTag("node_tags");
    

    and this list contains one entry for each point in the point list of the current edge.

    Related: https://github.com/graphhopper/graphhopper/pull/2430#issuecomment-945404775

    todo:

    • [ ] try some real-world examples, maybe add some encoded values that make use of node tags
    • [ ] review code, pay special attention to barrier node handling
    • [ ] add some tests
    • [ ] fix existing tests
    • [ ] check performance, memory requirements and number of node tags also for global imports
    • [ ] if needed: exclude unnecessary node tags and/or use more memory-efficient way to store node tags
    new feature 
    opened by easbar 1
  • Lack of consideration of number of lanes on highway portions lead to bad snapping in Map Matching

    Lack of consideration of number of lanes on highway portions lead to bad snapping in Map Matching

    Describe the bug When the route is a highway with a large number of lanes, the points are not snapped on the correct road when the gps_accuracy is set to low values such as 15m.

    Because OSM places the way roughly in the the middle of the actual multi lane road, points sometimes are not snapped on certain portions because GH doesn't take into account the number of lanes and hence the width of that road portion. And this can lead to broken sequences.

    To Reproduce Run map matching with gps_accuracy=15 and the following GPX file

    <?xml version="1.0" encoding="UTF-8"?>\n<gpx xmlns="http://www.topografix.com/GPX/1/1" xmlns:gpxtpx="http://www.garmin.com/xmlschemas/TrackPointExtension/v1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd" version="1.1" creator="gpx.py -- https://github.com/tkrajina/gpxpy">\n  <trk>\n    <trkseg>\n      <trkpt lat="43.7213062" lon="4.1842265">\n        <time>2022-11-15T18:03:34+0100</time>\n        <extensions>\n          <gpxtpx:accuracy>27.540000000000003</gpxtpx:accuracy>\n        </extensions>\n      </trkpt>\n      <trkpt lat="43.7205676" lon="4.1878799">\n        <time>2022-11-15T18:04:35+0100</time>\n        <extensions>\n          <gpxtpx:accuracy>15</gpxtpx:accuracy>\n        </extensions>\n      </trkpt>\n      <trkpt lat="43.7182404" lon="4.1854886">\n        <time>2022-11-15T18:05:06+0100</time>\n        <extensions>\n          <gpxtpx:accuracy>15</gpxtpx:accuracy>\n        </extensions>\n      </trkpt>\n      <trkpt lat="43.719211" lon="4.1826475">\n        <time>2022-11-15T18:05:36+0100</time>\n        <extensions>\n          <gpxtpx:accuracy>17.82</gpxtpx:accuracy>\n        </extensions>\n      </trkpt>\n      <trkpt lat="43.7229836" lon="4.181233">\n        <time>2022-11-15T18:06:06+0100</time>\n        <extensions>\n          <gpxtpx:accuracy>15</gpxtpx:accuracy>\n        </extensions>\n      </trkpt>\n      <trkpt lat="43.7271002" lon="4.1788537">\n        <time>2022-11-15T18:06:37+0100</time>\n        <extensions>\n          <gpxtpx:accuracy>15</gpxtpx:accuracy>\n        </extensions>\n      </trkpt>\n      <trkpt lat="43.7259377" lon="4.1778398">\n        <time>2022-11-15T18:07:07+0100</time>\n        <extensions>\n          <gpxtpx:accuracy>15</gpxtpx:accuracy>\n        </extensions>\n      </trkpt>\n      <trkpt lat="43.7245266" lon="4.1663032">\n        <time>2022-11-15T18:07:37+0100</time>\n        <extensions>\n          <gpxtpx:accuracy>15</gpxtpx:accuracy>\n        </extensions>\n      </trkpt>\n      <trkpt lat="43.7237127" lon="4.1527792">\n        <time>2022-11-15T18:08:08+0100</time>\n        <extensions>\n          <gpxtpx:accuracy>15</gpxtpx:accuracy>\n        </extensions>\n      </trkpt>\n      <trkpt lat="43.7182891" lon="4.1399795">\n        <time>2022-11-15T18:08:39+0100</time>\n        <extensions>\n          <gpxtpx:accuracy>15</gpxtpx:accuracy>\n        </extensions>\n      </trkpt>\n      <trkpt lat="43.7113779" lon="4.1287405">\n        <time>2022-11-15T18:09:10+0100</time>\n        <extensions>\n          <gpxtpx:accuracy>15</gpxtpx:accuracy>\n        </extensions>\n      </trkpt>\n      <trkpt lat="43.7039516" lon="4.1178695">\n        <time>2022-11-15T18:09:40+0100</time>\n        <extensions>\n          <gpxtpx:accuracy>15</gpxtpx:accuracy>\n        </extensions>\n      </trkpt>\n      <trkpt lat="43.697838" lon="4.1059378">\n        <time>2022-11-15T18:10:10+0100</time>\n        <extensions>\n          <gpxtpx:accuracy>15</gpxtpx:accuracy>\n        </extensions>\n      </trkpt>\n      <trkpt lat="43.696463" lon="4.0913813">\n        <time>2022-11-15T18:10:41+0100</time>\n        <extensions>\n          <gpxtpx:accuracy>15</gpxtpx:accuracy>\n        </extensions>\n      </trkpt>\n      <trkpt lat="43.693038" lon="4.0785319">\n        <time>2022-11-15T18:11:11+0100</time>\n        <extensions>\n          <gpxtpx:accuracy>15</gpxtpx:accuracy>\n        </extensions>\n      </trkpt>\n      <trkpt lat="43.689549" lon="4.0640863">\n        <time>2022-11-15T18:11:42+0100</time>\n        <extensions>\n          <gpxtpx:accuracy>15</gpxtpx:accuracy>\n        </extensions>\n      </trkpt>\n      <trkpt lat="43.6856738" lon="4.0506326">\n        <time>2022-11-15T18:12:12+0100</time>\n        <extensions>\n          <gpxtpx:accuracy>15</gpxtpx:accuracy>\n        </extensions>\n      </trkpt>\n      <trkpt lat="43.6800437" lon="4.0391233">\n        <time>2022-11-15T18:12:43+0100</time>\n        <extensions>\n          <gpxtpx:accuracy>15</gpxtpx:accuracy>\n        </extensions>\n      </trkpt>\n      <trkpt lat="43.6765424" lon="4.0279658">\n        <time>2022-11-15T18:13:13+0100</time>\n        <extensions>\n          <gpxtpx:accuracy>15</gpxtpx:accuracy>\n        </extensions>\n      </trkpt>\n      <trkpt lat="43.6734005" lon="4.0176153">\n        <time>2022-11-15T18:13:44+0100</time>\n        <extensions>\n          <gpxtpx:accuracy>15</gpxtpx:accuracy>\n        </extensions>\n      </trkpt>\n      <trkpt lat="43.670977" lon="4.0125738">\n        <time>2022-11-15T18:14:14+0100</time>\n        <extensions>\n          <gpxtpx:accuracy>15</gpxtpx:accuracy>\n        </extensions>\n      </trkpt>\n      <trkpt lat="43.6672738" lon="4.0072607">\n        <time>2022-11-15T18:14:44+0100</time>\n        <extensions>\n          <gpxtpx:accuracy>15</gpxtpx:accuracy>\n        </extensions>\n      </trkpt>\n      <trkpt lat="43.6603084" lon="3.9998478">\n        <time>2022-11-15T18:15:15+0100</time>\n        <extensions>\n          <gpxtpx:accuracy>15</gpxtpx:accuracy>\n        </extensions>\n      </trkpt>\n      <trkpt lat="43.6545083" lon="3.9922369">\n        <time>2022-11-15T18:15:46+0100</time>\n        <extensions>\n          <gpxtpx:accuracy>15</gpxtpx:accuracy>\n        </extensions>\n      </trkpt>\n      <trkpt lat="43.6491267" lon="3.9836212">\n        <time>2022-11-15T18:16:16+0100</time>\n        <extensions>\n          <gpxtpx:accuracy>15</gpxtpx:accuracy>\n        </extensions>\n      </trkpt>\n      <trkpt lat="43.6436133" lon="3.9754174">\n        <time>2022-11-15T18:16:46+0100</time>\n        <extensions>\n          <gpxtpx:accuracy>15</gpxtpx:accuracy>\n        </exten9sions>\n      </trkpt>\n      <trkpt lat="43.6358844" lon="3.9705343">\n        <time>2022-11-15T18:17:17+0100</time>\n        <extensions>\n          <gpxtpx:accuracy>15</gpxtpx:accuracy>\n        </extensions>\n      </trkpt>\n      <trkpt lat="43.6290018" lon="3.96602">\n        <time>2022-11-15T18:17:47+0100</time>\n        <extensions>\n          <gpxtpx:accuracy>15</gpxtpx:accuracy>\n        </extensions>\n      </trkpt>\n      <trkpt lat="43.6225519" lon="3.9576182">\n        <time>2022-11-15T18:18:18+0100</time>\n        <extensions>\n          <gpxtpx:accuracy>15</gpxtpx:accuracy>\n        </extensions>\n      </trkpt>\n      <trkpt lat="43.6179214" lon="3.9493805">\n        <time>2022-11-15T18:18:49+0100</time>\n        <extensions>\n          <gpxtpx:accuracy>15</gpxtpx:accuracy>\n        </extensions>\n      </trkpt>\n      <trkpt lat="43.6141007" lon="3.9436283">\n        <time>2022-11-15T18:19:19+0100</time>\n        <extensions>\n          <gpxtpx:accuracy>15</gpxtpx:accuracy>\n        </extensions>\n      </trkpt>\n      <trkpt lat="43.6101974" lon="3.9384315">\n        <time>2022-11-15T18:19:50+0100</time>\n        <extensions>\n          <gpxtpx:accuracy>15</gpxtpx:accuracy>\n        </extensions>\n      </trkpt>\n      <trkpt lat="43.6080267" lon="3.9339111">\n        <time>2022-11-15T18:20:20+0100</time>\n        <extensions>\n          <gpxtpx:accuracy>15</gpxtpx:accuracy>\n        </extensions>\n      </trkpt>\n      <trkpt lat="43.6079773" lon="3.9310966">\n        <time>2022-11-15T18:20:51+0100</time>\n        <extensions>\n          <gpxtpx:accuracy>15</gpxtpx:accuracy>\n        </extensions>\n      </trkpt>\n      <trkpt lat="43.6083647" lon="3.9271085">\n        <time>2022-11-15T18:21:22+0100</time>\n        <extensions>\n          <gpxtpx:accuracy>17.82</gpxtpx:accuracy>\n        </extensions>\n      </trkpt>\n      <trkpt lat="43.6073482" lon="3.9248241">\n        <time>2022-11-15T18:21:52+0100</time>\n        <extensions>\n          <gpxtpx:accuracy>15</gpxtpx:accuracy>\n        </extensions>\n      </trkpt>\n      <trkpt lat="43.606642" lon="3.9223599">\n        <time>2022-11-15T18:22:23+0100</time>\n        <extensions>\n          <gpxtpx:accuracy>15</gpxtpx:accuracy>\n        </extensions>\n      </trkpt>\n      <trkpt lat="43.6059944" lon="3.9212103">\n        <time>2022-11-15T18:22:54+0100</time>\n        <extensions>\n          <gpxtpx:accuracy>15</gpxtpx:accuracy>\n        </extensions>\n      </trkpt>\n    </trkseg>\n  </trk>\n</gpx>
    

    The point at time step 20 gets only snapped on the road ref A9, instead of A709 as well leading to a broken sequence at time step 25 when the roads fully diverge.

    Expected behavior The A709 at the toll gate is per OSM 16 lanes wide, taking that into account would allow to estimate the road width and therefore snap the point on the right road.

    Screenshots & Logs Here is a screenshot illustrating the problem. image

    Here is the GeoJSON to visualize the whole trace.

    {
      "type": "FeatureCollection",
      "features": [
        {
          "geometry": {
            "coordinates": [
              [
                4.184227,
                43.721306
              ],
              [
                4.18788,
                43.720568
              ],
              [
                4.185489,
                43.71824
              ],
              [
                4.182647,
                43.719211
              ],
              [
                4.181233,
                43.722984
              ],
              [
                4.178854,
                43.7271
              ],
              [
                4.17784,
                43.725938
              ],
              [
                4.166303,
                43.724527
              ],
              [
                4.152779,
                43.723713
              ],
              [
                4.139979,
                43.718289
              ],
              [
                4.128741,
                43.711378
              ],
              [
                4.11787,
                43.703952
              ],
              [
                4.105938,
                43.697838
              ],
              [
                4.091381,
                43.696463
              ],
              [
                4.078532,
                43.693038
              ],
              [
                4.064086,
                43.689549
              ],
              [
                4.050633,
                43.685674
              ],
              [
                4.039123,
                43.680044
              ],
              [
                4.027966,
                43.676542
              ],
              [
                4.017615,
                43.6734
              ],
              [
                4.012574,
                43.670977
              ],
              [
                4.007261,
                43.667274
              ],
              [
                3.999848,
                43.660308
              ],
              [
                3.992237,
                43.654508
              ],
              [
                3.983621,
                43.649127
              ],
              [
                3.975417,
                43.643613
              ],
              [
                3.970534,
                43.635884
              ],
              [
                3.96602,
                43.629002
              ],
              [
                3.957618,
                43.622552
              ],
              [
                3.949381,
                43.617921
              ],
              [
                3.943628,
                43.614101
              ],
              [
                3.938432,
                43.610197
              ],
              [
                3.933911,
                43.608027
              ],
              [
                3.931097,
                43.607977
              ],
              [
                3.927109,
                43.608365
              ],
              [
                3.924824,
                43.607348
              ],
              [
                3.92236,
                43.606642
              ],
              [
                3.92121,
                43.605994
              ]
            ],
            "type": "LineString"
          },
          "properties": {
            "deviceId": "dfebaacb-9837-4b5b-b78b-3fd294cc2d17",
            "endDate": "2022-11-15 18:22:54 +0100",
            "eventId": "33194ac5d3c7e5e75c6ef2fff1b633c0729758ef774c2ecaa574fb26693ee512",
            "startDate": "2022-11-15 18:03:34 +0100",
            "stroke": "blue"
          },
          "type": "Feature"
        },
        {
          "type": "Feature",
          "properties": {},
          "geometry": {
            "coordinates": [
              4.012692714858903,
              43.67086517479349
            ],
            "type": "Point"
          }
        },
        {
          "type": "Feature",
          "properties": {},
          "geometry": {
            "coordinates": [
              4.012270800371908,
              43.67119340723403
            ],
            "type": "Point"
          }
        }
      ]
    }
    

    Also the new error message for broken sequence is wrong in this case because it indicates Step 5, instead of step 25. I think we should record the maxTimeStep and use that instead of qe.timeStep (Error message). Also we should probably refer to the original point index instead of the timestep which is after filtering of points and therefore is not always right in case some points were filtered out.

    opened by laurent-chriqui 1
Releases(6.2)
  • 6.2(Dec 1, 2022)

  • 6.0(Sep 13, 2022)

    What's Changed

    • Replace GraphHopperStorage by BaseGraph where it is not needed by @easbar in https://github.com/graphhopper/graphhopper/pull/2540
    • Replace EncodingManager with TagParserManager where it is needed by @easbar in https://github.com/graphhopper/graphhopper/pull/2541
    • Load encoded values from disk by @easbar in https://github.com/graphhopper/graphhopper/pull/2542
    • Remove Weighting#getFlagEncoder by @easbar in https://github.com/graphhopper/graphhopper/pull/2549
    • Avoid Pattern compilation by @otbutz in https://github.com/graphhopper/graphhopper/pull/2489
    • No longer allow changing profiles between imports and loads by @easbar in https://github.com/graphhopper/graphhopper/pull/2550
    • Remove EncodedValueFactory by @easbar in https://github.com/graphhopper/graphhopper/pull/2551
    • use sdkman and switch to most recent JDK by @karussell in https://github.com/graphhopper/graphhopper/pull/2552
    • minor cleanup by @karussell in https://github.com/graphhopper/graphhopper/pull/2554
    • Skip emergency access by @otbutz in https://github.com/graphhopper/graphhopper/pull/2555
    • Remove TagParser#createEncodedValues by @easbar in https://github.com/graphhopper/graphhopper/pull/2559
    • Fix bias in map-matching by @michaz in https://github.com/graphhopper/graphhopper/pull/2560
    • allow skipping the LM constraint check for A* by @karussell in https://github.com/graphhopper/graphhopper/pull/2544
    • Clean up javadoc comments by @karussell in https://github.com/graphhopper/graphhopper/pull/2569
    • Stop removing elements from the priority queue, speeds up flexible algorithms by @easbar in https://github.com/graphhopper/graphhopper/pull/2571
    • Split flag encoders into encoded values and tag parsers by @easbar in https://github.com/graphhopper/graphhopper/pull/2561
    • Log available country rules by @otbutz in https://github.com/graphhopper/graphhopper/pull/2579
    • Use more recent node/npm versions to fix the build by @easbar in https://github.com/graphhopper/graphhopper/pull/2583
    • update deployment guide by @karussell in https://github.com/graphhopper/graphhopper/pull/2576
    • Replace deprecated dropwizard parameter types by @otbutz in https://github.com/graphhopper/graphhopper/pull/2574
    • Consistent edge keys by @easbar in https://github.com/graphhopper/graphhopper/pull/2567
    • Remove 'shared' encoded values with $ sign in name by @karussell in https://github.com/graphhopper/graphhopper/pull/2585
    • Matrix client improvements by @karussell in https://github.com/graphhopper/graphhopper/pull/2587
    • European toll fallback rules by @otbutz in https://github.com/graphhopper/graphhopper/pull/2450
    • use for loop in PathDetailsBuilderFactory by @karussell in https://github.com/graphhopper/graphhopper/pull/2589
    • Make motor vehicle and hgv properties configurable for roads vehicle EVs by @easbar in https://github.com/graphhopper/graphhopper/pull/2594
    • Use separate deleted flag for SPTEntry, prevent exception when calculating routes with non-feasible approximator by @easbar in https://github.com/graphhopper/graphhopper/pull/2600
    • Fix inconsistent took by @boldtrn in https://github.com/graphhopper/graphhopper/pull/2591
    • windows does not need a separate documentation due to WSL by @karussell in https://github.com/graphhopper/graphhopper/pull/2599
    • EdgeKVStorage: store more than Strings by @karussell in https://github.com/graphhopper/graphhopper/pull/2597
    • Fix bug in non-CH AlternativeRoute by @karussell in https://github.com/graphhopper/graphhopper/pull/2603
    • move quickstart info into more prominent installation of README by @karussell in https://github.com/graphhopper/graphhopper/pull/2605
    • Remove GraphHopperStorage by @easbar in https://github.com/graphhopper/graphhopper/pull/2606
    • Find strongly-connected components of station (stop) graph by @michaz in https://github.com/graphhopper/graphhopper/pull/2608
    • Load EncodingManager from properties instead of config by @easbar in https://github.com/graphhopper/graphhopper/pull/2607
    • Increase maximum edge-based CH key for preparation to 2^30 again by @easbar in https://github.com/graphhopper/graphhopper/pull/2612
    • custom_model: introduce value expression by @karussell in https://github.com/graphhopper/graphhopper/pull/2568
    • Update custom model editor: validation + auto-complete for rhs expressions by @easbar in https://github.com/graphhopper/graphhopper/pull/2615
    • Use actual speed maximum rather than flagEncoder#getMaxSpeed() for weighting.getMinWeight() by @easbar in https://github.com/graphhopper/graphhopper/pull/2614
    • Rename getMin/MaxInt -> getMin/MaxStorableInt, getMaxSetValueOrMax -> getMaxOrMaxStorable by @easbar in https://github.com/graphhopper/graphhopper/pull/2616
    • Remove FlagEncoder#getMaxSpeed() by @easbar in https://github.com/graphhopper/graphhopper/pull/2619
    • EdgeKVStorage: store name and ref tags separately by @karussell in https://github.com/graphhopper/graphhopper/pull/2598
    • Remove FlagEncoder by @easbar in https://github.com/graphhopper/graphhopper/pull/2611
    • Valid if PathDetail is null by @RafaelSTelles in https://github.com/graphhopper/graphhopper/pull/2618
    • Support for forward & backward key value pairs by @karussell in https://github.com/graphhopper/graphhopper/pull/2622
    • make global time&distance values consistent with path details and instructions by @karussell in https://github.com/graphhopper/graphhopper/pull/2626
    • Include destination in instructions by @karussell in https://github.com/graphhopper/graphhopper/pull/2624
    • Make profile resolving more flexible for web API by @easbar in https://github.com/graphhopper/graphhopper/pull/2629
    • EdgeKVStorage: allow 32 bits by @karussell in https://github.com/graphhopper/graphhopper/pull/2632
    • Add hint to exception error message by @PanCakeConnaisseur in https://github.com/graphhopper/graphhopper/pull/2638
    • new edge smoothing: "ramer" by @karussell in https://github.com/graphhopper/graphhopper/pull/2634
    • New average_slope EV by @karussell in https://github.com/graphhopper/graphhopper/pull/2645
    • removed defaultIsInfinity and fix bug in DecimalEncodedValueImpl by @karussell in https://github.com/graphhopper/graphhopper/pull/2646
    • improvements for bike by @karussell in https://github.com/graphhopper/graphhopper/pull/2631
    • consider multiple from members for no_entry by @karussell in https://github.com/graphhopper/graphhopper/pull/2648
    • Maps: Add slope detail to elevation diagram by @easbar in https://github.com/graphhopper/graphhopper/pull/2654
    • validate that ids are not negative by @lukasalexanderweber in https://github.com/graphhopper/graphhopper/pull/2652
    • replace car4wd with roads and a custom_model by @karussell in https://github.com/graphhopper/graphhopper/pull/2651
    • Add urban density encoded value to identify built-up areas by @easbar in https://github.com/graphhopper/graphhopper/pull/2637
    • Support ";" access delimiter for car access. by @ratrun in https://github.com/graphhopper/graphhopper/pull/2655
    • Map matching no longer depends on GraphHopper class by @easbar in https://github.com/graphhopper/graphhopper/pull/2657

    New Contributors

    • @RafaelSTelles made their first contribution in https://github.com/graphhopper/graphhopper/pull/2618
    • @PanCakeConnaisseur made their first contribution in https://github.com/graphhopper/graphhopper/pull/2638
    • @lukasalexanderweber made their first contribution in https://github.com/graphhopper/graphhopper/pull/2652

    Full Changelog: https://github.com/graphhopper/graphhopper/compare/5.3...6.0

    Source code(tar.gz)
    Source code(zip)
    graphhopper-web-6.0.jar(40.07 MB)
  • 5.3(Apr 29, 2022)

  • 5.1(Apr 20, 2022)

  • 5.0(Mar 23, 2022)

    What's Changed

    • Move nodes and edges storage out of BaseGraph by @easbar in https://github.com/graphhopper/graphhopper/pull/2399
    • country_rules: fix documentation in example config by @karussell in https://github.com/graphhopper/graphhopper/pull/2414
    • HMM-Lib: Bump Java version to 8 by @boldtrn in https://github.com/graphhopper/graphhopper/pull/2413
    • Consider heading when snapping by @karussell in https://github.com/graphhopper/graphhopper/pull/2411
    • Convert Directory#find to Directory#create by @easbar in https://github.com/graphhopper/graphhopper/pull/2412
    • Register country rules in a map by @otbutz in https://github.com/graphhopper/graphhopper/pull/2418
    • use jdk17 ga and jdk18 ea by @karussell in https://github.com/graphhopper/graphhopper/pull/2419
    • Remove small segment size optimization for sea level elevation tiles by @easbar in https://github.com/graphhopper/graphhopper/pull/2417
    • Remove DataAccess#setSegmentSize by @easbar in https://github.com/graphhopper/graphhopper/pull/2421
    • Don't ignore parsed access by @otbutz in https://github.com/graphhopper/graphhopper/pull/2420
    • Minor improvement to avoid changing the url by @boldtrn in https://github.com/graphhopper/graphhopper/pull/2428
    • Remove AbstractFlagEncoder#encoderBit by @easbar in https://github.com/graphhopper/graphhopper/pull/2434
    • Ignore barrier nodes at junctions by @easbar in https://github.com/graphhopper/graphhopper/pull/2433
    • Improve LMPreparationHandler logging by @otbutz in https://github.com/graphhopper/graphhopper/pull/2426
    • Remove ghLocation parameter from GraphHopper#load by @easbar in https://github.com/graphhopper/graphhopper/pull/2437
    • OSMReader: Keep node tags until we create edges by @easbar in https://github.com/graphhopper/graphhopper/pull/2430
    • Remove byteOrder option for Directory, always use little endianess for all DataAccess by @easbar in https://github.com/graphhopper/graphhopper/pull/2442
    • Split ways at junctions first by @easbar in https://github.com/graphhopper/graphhopper/pull/2444
    • Snap to tower nodes when they are close by @easbar in https://github.com/graphhopper/graphhopper/pull/2446
    • Fix curbside handling at barrier nodes by @easbar in https://github.com/graphhopper/graphhopper/pull/2447
    • Allow CountryRules to provide fallback values for toll by @otbutz in https://github.com/graphhopper/graphhopper/pull/2164
    • Store DataAccess versions in headers instead of properties file by @easbar in https://github.com/graphhopper/graphhopper/pull/2436
    • Extract WaySegmentParser from OSMReader by @easbar in https://github.com/graphhopper/graphhopper/pull/2448
    • DataAccess config for type and load by @karussell in https://github.com/graphhopper/graphhopper/pull/2440
    • Ignore too large mtb:scale values by @easbar in https://github.com/graphhopper/graphhopper/pull/2458
    • Load CH preparations in parallel by @easbar in https://github.com/graphhopper/graphhopper/pull/2455
    • Create edge flags per edge instead of per way by @easbar in https://github.com/graphhopper/graphhopper/pull/2457
    • Remove RoadEnvironment.SHUTTLE_TRAIN by @easbar in https://github.com/graphhopper/graphhopper/pull/2466
    • Remove ferry argument from TagParser#handleWayTags by @easbar in https://github.com/graphhopper/graphhopper/pull/2468
    • Use a point along the edge geometry to determine areas by @otbutz in https://github.com/graphhopper/graphhopper/pull/2472
    • Use geometric center to lookup areas for ways with only two points by @otbutz in https://github.com/graphhopper/graphhopper/pull/2474
    • Remove the ch.prepare.done flag and separate CH and LM profile versions by @easbar in https://github.com/graphhopper/graphhopper/pull/2475
    • removes graphhopper.sh script by @karussell in https://github.com/graphhopper/graphhopper/pull/2431
    • Remove acceptWay optimization by @easbar in https://github.com/graphhopper/graphhopper/pull/2471
    • Improve exceptions by @otbutz in https://github.com/graphhopper/graphhopper/pull/2464
    • Cover MaximumNodesExceededException with unittest by @otbutz in https://github.com/graphhopper/graphhopper/pull/2478
    • Fix HashMap related flaky tests by @shunfan-shao in https://github.com/graphhopper/graphhopper/pull/2480
    • signed EncodedValues by @karussell in https://github.com/graphhopper/graphhopper/pull/2473
    • Remove CH from GraphHopperStorage, allow delta import of CHs by @easbar in https://github.com/graphhopper/graphhopper/pull/2481
    • Remove NotThreadSafe and ProgressListener by @easbar in https://github.com/graphhopper/graphhopper/pull/2486
    • Rename web/com.graphhopper.http to web/com.graphhopper.application by @easbar in https://github.com/graphhopper/graphhopper/pull/2487
    • Use a fixed number of maximum visited nodes for node-based CH by @easbar in https://github.com/graphhopper/graphhopper/pull/2491
    • Do not ensure write access when there are no CHs/LMs to prepare by @easbar in https://github.com/graphhopper/graphhopper/pull/2500
    • broken wheelchair routing - priority and elevation improvements by @karussell in https://github.com/graphhopper/graphhopper/pull/2503
    • Do not use 'week year': YYYY by @karussell in https://github.com/graphhopper/graphhopper/pull/2505
    • Node out of bounds error when using average_speed path detail by @easbar in https://github.com/graphhopper/graphhopper/pull/2517
    • Speed up CH for foot by @easbar in https://github.com/graphhopper/graphhopper/pull/2514
    • Transfer legs by @michaz in https://github.com/graphhopper/graphhopper/pull/2519
    • Improve edge-based CH import performance by @easbar in https://github.com/graphhopper/graphhopper/pull/2522
    • Roads as base by @michaz in https://github.com/graphhopper/graphhopper/pull/2523
    • Make speedTwoDirections final by @easbar in https://github.com/graphhopper/graphhopper/pull/2525
    • matrix and route client: allow usage of request gzipping by @karussell in https://github.com/graphhopper/graphhopper/pull/2511
    • Make sure encoder max speed cannot be exceeded, add DecimalEncodedValue#getNextStorableValue by @easbar in https://github.com/graphhopper/graphhopper/pull/2524
    • Move handleNodeTags from EncodingManager to AbstractFlagEncoder by @easbar in https://github.com/graphhopper/graphhopper/pull/2533
    • Clean up FerrySpeedCalculator, use exact edge distance by @easbar in https://github.com/graphhopper/graphhopper/pull/2528
    • Improve handling of short ferries without duration tag by @easbar in https://github.com/graphhopper/graphhopper/pull/2539
    • Cleanup isBarrier method, fix ford=yes and locked=yes by @easbar in https://github.com/graphhopper/graphhopper/pull/2538
    • Use Weighting instead of access for turn instructions by @karussell in https://github.com/graphhopper/graphhopper/pull/2536
    • Move way name parsing from EncodingManager to OSMReader by @easbar in https://github.com/graphhopper/graphhopper/pull/2537

    New Contributors

    • @shunfan-shao made their first contribution in https://github.com/graphhopper/graphhopper/pull/2480

    Full Changelog: https://github.com/graphhopper/graphhopper/compare/4.0...5.0

    Source code(tar.gz)
    Source code(zip)
    graphhopper-web-5.0.jar(40.01 MB)
  • 3.2(Jul 21, 2021)

  • 2.4(May 5, 2021)

  • 2.3(Dec 17, 2020)

  • 2.2(Nov 12, 2020)

    GraphHopper 2.0 with some additional bugfixes web service jar

    • turn_costs parameter now works with custom weighting, #2176
    • fixed error message when points are not found, #2173
    • stricter url encoding for GraphHopperGeocoding
    • various documentation fixes
    Source code(tar.gz)
    Source code(zip)
  • 1.0-pre39(May 1, 2020)

    1.0-pre31 plus

    • 22e566256 2020-05-01 | upgrade osmosis-osm-binary, fixes #2019 (HEAD -> master, tag: 1.0-pre39, origin/master) [Peter]
    • 3eeccae00 2020-05-01 | ui: update jquery version [Peter]
    • 8123f8336 2020-05-01 | Weighting support via yaml configuration (#1841) [Peter]
    • 9ba35d39a 2020-05-01 | Remove change graph docs [easbar]
    • bee66b01a 2020-04-30 | Extract createRouteCallBack in main-template.js, as in #1841 [easbar]
    • bc545d10e 2020-04-30 | Add instructions to fix error in intellij [easbar]
    • 2ae0cf1c8 2020-04-29 | Use transportation mode for getOffBike (#2022) [Robin]
    • 69e1194f3 2020-04-27 | Profile duration is optional [Michael Zilske]
    • e8667aa79 2020-04-27 | Profile duration as parameter [Michael Zilske]
    • fb56c117e 2020-04-26 | Prune by max street time [Michael Zilske]
    • e6ce0faf0 2020-04-27 | import cleanup from previous commit [Peter]
    • fd8862df3 2020-04-27 | add a test for landmark area-splitting, fixes #2020 (tag: 1.0-pre38) [Peter]
    • 95d252abe 2020-04-26 | isochrone: adapt limit to consumed nodes. visited nodes can be multiple times more (tag: 1.0-pre37) [Peter]
    • d428c4b7f 2020-04-26 | remove legacy turn_costs for isochrone too (#2018) (tag: 1.0-pre36) [Peter]
    • ad7cf96b4 2020-04-24 | Put 'took' in pt response [Michael Zilske]
    • 8d4bc30fe 2020-04-24 | Unparsable enum indeed gives 400 and not 404 [Michael Zilske]
    • 9cd273de3 2020-04-24 | Move parseList helper method to Helper (tag: 1.0-pre35) [easbar]
    • d073a3980 2020-04-24 | Increase shortcut version because properties file changed [easbar]
    • 8a3c28955 2020-04-24 | Remove meaning of turn cost provider name, close #1999 [easbar]
    • ff6909d04 2020-04-23 | Don't rebuild pt-locationindex every time [Michael Zilske]
    • eeb5fab67 2020-04-23 | ..but without weight_limit_offset [Michael Zilske]
    • 18eb041cb 2020-04-23 | Add weight_limit (#2011) [Robin]
    • 4a774e289 2020-04-23 | Don't traverse nodes over z-limit [Michael Zilske]
    • e43fc66bd 2020-04-23 | Failing test for traversal nodes over z-limit [Michael Zilske]
    • d20bd0006 2020-04-23 | timeout should propagate to OkHttp (#2014) [Peter]
    • 82b6f8b26 2020-04-23 | Apply same checks for both GET&POST /route, clean up GHRequest#heading stuff (#2010) [Andi]
    • a606b54b9 2020-04-22 | Merge branch 'pull/2012' [Michael Zilske] |\
      | * aaa897b4b 2020-04-22 | Add flag to reactivate transfer between stops connected to same OSM node. [Mathieu St-Pierre]
    • | 89014277a 2020-04-22 | Add missing measurement.names (tag: 1.0-pre34, origin/1776) [easbar]
    • | a96bb17a4 2020-04-21 | Upgrade tools to Java and some cleanup + new measurement.name in Measurement [easbar]
    • | a278f4990 2020-04-21 | remove RecalculationHook [Peter]
    • | 483535c7b 2020-04-21 | test client-hc routing without internet requirement (#2003) [Peter]
    • | bf7807bfa 2020-04-21 | Throw (client-side) error if gpx export is used with POST [easbar]
    • | a39e8e961 2020-04-21 | Move gpx test from GraphHopperWebIT to RouteResourceTest (#2000) [Andi]
    • | 0e877583d 2020-04-20 | Remove documentation for GPX #2006 [Peter]
    • | c38bf2072 2020-04-20 | Remove gpx for post #2006 [Michael Zilske]
    • | 43401fdb6 2020-04-20 | decrease test memory to 110m as it should be sufficient, #2003 [Peter]
    • | 9454cf7ff 2020-04-20 | Only print seeds when tests fail [easbar]
    • | 44de3eaa7 2020-04-20 | Increase memory limit for tests for now [easbar]
    • | 07022063e 2020-04-20 | Use pluginManagement for maven compiler&test plugins, use java 8 in parent [easbar]
    • | 380f12b74 2020-04-19 | We now get a correct 400 error for bad points [Michael Zilske]
    • | 3308f1bc5 2020-04-19 | We now get a correct 400 error for missing points [Michael Zilske]
    • | 57d8d3d26 2020-04-19 | SPTResource: Annotate with error return type [Michael Zilske]
    • | ac61b4b33 2020-04-19 | Move GHJerseyViolationExceptionMapper to bundle [Michael Zilske]
    • | 12f84fd7b 2020-04-19 | Less code [Michael Zilske]
    • | 7d24fa983 2020-04-19 | Default handling of Instant parameters [Michael Zilske]
    • | 0cd597973 2020-04-19 | Default not-null-check [Michael Zilske]
    • | 6c1d682ab 2020-04-19 | Same for pt [Michael Zilske]
    • | 6957cbefb 2020-04-19 | Use dw20 facility for custom request parameter type [Michael Zilske]
    • | 734266bbd 2020-04-19 | Enum for response type [Michael Zilske]
    • | f075583c8 2020-04-19 | Use special Param types to avoid 404 when number not parseable [Michael Zilske]
    • | 9a42cd239 2020-04-19 | Moare declarative validation [Michael Zilske]
    • | b04d6cfad 2020-04-19 | Default error messages are fine, just serialize them properly [Michael Zilske]
    • | 6a0f2fd54 2020-04-18 | Same with another parameter [Michael Zilske]
    • | 3eaf7c453 2020-04-18 | NotNull annotation instead of throwing [Michael Zilske]
    • | 6e1984506 2020-04-18 | GHPointConverterProvider handles null values correctly [Michael Zilske]
    • | 81aba3818 2020-04-18 | Fixup [Michael Zilske]
    • | 603dff8dc 2020-04-18 | SPTResource can do turn restrictions #1978 [Michael Zilske]
    • | 01e56c0e2 2020-04-18 | IsochroneResource can do turn restrictions #1978 [Michael Zilske]
    • | 66e25e5bf 2020-04-18 | Add test about url parameters for POST requests [easbar]
    • | 0f247ba31 2020-04-18 | Add CarFlagEncoder.setSpeedTwoDirections, remove propertiesString constructor for encoders [easbar]
    • | 78454d080 2020-04-18 | Random cleanups taken from #1841 [easbar]
    • | d71731a7b 2020-04-18 | Remove remaining usages of DropwizardAppRule [easbar]
    • | 675ec0cb5 2020-04-18 | Change routing time log to use ms instead of micros [easbar]
    • | 0cd7d03d1 2020-04-17 | Remove test output [Michael Zilske]
    • | 87f6c2424 2020-04-17 | Edge-based shortest-path trees (Algorithm only) [Michael Zilske]
    • | d94a0a95a 2020-04-17 | trying to upgrade to dropwizard 2.x (#1998) [Peter]
    • | bc320d809 2020-04-17 | ignore skadi elevation to avoid downloading 7MB file #1929 [Peter]
    • | a3d087841 2020-04-17 | Use new profile parameter to select routing profile (#1934) [Andi]
    • | c6427db8e 2020-04-17 | remove query torture (#1997) [Peter]
    • | 4f9d478f2 2020-04-17 | Improve docker image size (#1990) [Harel M]
    • | b808f34da 2020-04-16 | Migrate resource tests to junit5 [easbar]
    • | cf0ca3236 2020-04-16 | Remove unnecessary annotations [easbar]
    • | 7df3192d1 2020-04-16 | Fix error response for /isochrone and /spt, fixes #1991 [easbar]
    • | 745531659 2020-04-15 | Fix Bike2WeightFlagEncoderTest (wouldn't fail) [Michael Zilske]
    • | a5ca5ff4f 2020-04-15 | remove matrix tests against public api [Peter]
    • | fb34ac093 2020-04-14 | Allow overlapping SpatialRules with priorities (#1903) [otbutz] |/
    • 7bee0e42a 2020-04-14 | Add config option preparation_profile to allow cross-querying in hybrid mode (#1983) (tag: 1.0-pre33.4) [Andi]
    • 3f520c03a 2020-04-14 | Fix expected distance value in GraphHopperMatrixIT (once again) [easbar]
    • 7172f8ca1 2020-04-10 | Fix pt client [Michael Zilske]
    • f79750fc6 2020-04-10 | Finish investigating the graph size problem [Michael Zilske]
    • 31ae1e153 2020-04-09 | Investigate the graph size problem [Michael Zilske]
    • 127b6bc20 2020-04-09 | Start investigating transit graph size issue [Michael Zilske]
    • 7377e25a5 2020-04-09 | Remove deltas from integer assertions [Michael Zilske]
    • b38fbda2b 2020-04-09 | Print seed if compareAlgos test in GraphHopperIT fails [easbar]
    • 3b53d57fd 2020-04-07 | Set media type for response in ambiguous method [Michael Zilske]
    • 812211885 2020-04-07 | client-hc: fix integration tests (we need to throw them out here) [Peter]
    • 6a7d45a92 2020-04-07 | Remove bogus z coordinate from isochrones; #fixes 1957 [Michael Zilske]
    • c9fa46f4e 2020-04-07 | Typo [Michael Zilske]
    • 5309761c2 2020-04-07 | Stopping criterion for Isochrones/SPT; fixes #1979 [Michael Zilske]
    • ad16a9016 2020-04-06 | Fix transit client [Michael Zilske]
    • 50f0e657b 2020-04-06 | Update README.md [Michael Zilske]
    • 07009b0df 2020-04-06 | Don't require profiles -- transit doesn't use them [Michael Zilske]
    • bc1c7107f 2020-04-06 | Push buckets further out [Michael Zilske]
    • 187329562 2020-04-06 | Create points directly, not through bucket lists [Michael Zilske]
    • 65246267a 2020-04-06 | Move special data object into resource [Michael Zilske]
    • 721091737 2020-04-06 | test: do no longer exclude alternative test [Peter]
    • f54b0dbe4 2020-04-06 | SPT only contains scanned nodes; visits in scan order [Michael Zilske]
    • a59d024a1 2020-04-06 | Move fudge factors for limit into client code [Michael Zilske]
    • 13d72e9ca 2020-04-06 | Only use finishLimit [Michael Zilske]
    • 3af512ed1 2020-04-06 | Let input use milliseconds, since output uses milliseconds [Michael Zilske]
    • 8eed548df 2020-04-06 | Test time labels directly [Michael Zilske]
    • 97b5d8024 2020-04-06 | Refactor test [Michael Zilske]
    • e4eddf940 2020-04-06 | Isochrone -> ShortestPathTree [Michael Zilske]
    • 6938777f0 2020-04-06 | Remove method that was only used in test [Michael Zilske]
    • d201b3e80 2020-04-06 | Move bucket business to resource [Michael Zilske]
    • d932e7336 2020-04-06 | Reduce one method to another [Michael Zilske]
    • c4ecb128b 2020-04-05 | Merge stuff from advanced isochrones [Michael Zilske]
    • c38d504c6 2020-04-05 | Typo [Michael Zilske]
    • 8c5e13de9 2020-04-03 | Make sure response errors are shown when posting benchmarks (while build should still fail) [easbar]
    • e3902b760 2020-04-01 | Edge-based alternative_route with CH [Michael Zilske]
    • bbda42707 2020-04-01 | Allow weighting and edge_based parameters for now (remove after #1980) (tag: 1.0-pre33.3) [easbar]
    • b27ced4b5 2020-04-01 | Make two more methods in ProfileResolver protected (tag: 1.0-pre33.2) [easbar]
    • 20f216271 2020-04-01 | Add GraphHopper#getProfile(name) [easbar]
    • 9129dda99 2020-03-31 | remove change graph (#1977) [Peter]
    • 640eb809f 2020-03-31 | GraphHopperConfig: add copy constructor [Peter]
    • 58fde258f 2020-03-31 | Allow running isochrones with profiles supporting turn costs (without turn costs) (#1975) [Andi]
    • a01fc06ba 2020-03-31 | Make sure node-based algos are not running with turn costs (#1974) [Andi]
    • 17f63b18a 2020-03-30 | config-example.yml: minor fix [Peter]
    • 8a24e31eb 2020-03-29 | Move turn_costs -> edge_based conversion into ProfileResolver [easbar]
    • 9430a5361 2020-03-29 | Enable edge based when there are curbsides also for POST /route [easbar]
    • f88307df2 2020-03-29 | Convert turn_costs parameter to edge_based also for POST /route, fix #1966 [easbar]
    • fb3eed814 2020-03-28 | Minor, re-use getRandomPoints method in tests [easbar]
    • 791445393 2020-03-28 | Move randomized tests to another package [easbar]
    • dfa19a686 2020-03-28 | Enable turn costs in RandomizedRoutingTest [easbar]
    • f48ee9d45 2020-03-28 | Move specific LM tests out of RandomizedRoutingTest [easbar]
    • 7f5f7b5f1 2020-03-28 | Updates failing test for LM+directed [easbar]
    • 8e407d840 2020-03-28 | Fix GraphHopperMatrixIT (data issue) [easbar]
    • 6daf0687f 2020-03-23 | Move ProfileResolver out of GraphHopper class, strictly require routing profiles (#1958) (tag: 1.0-pre33) [Andi]
    • 04d6a44aa 2020-03-22 | Remove car/vehicle defaults for GET requests (tag: 1.0-pre32) [easbar]
    • 5e26bb2db 2020-03-21 | Fix compile error [easbar]
    • 62e7d3491 2020-03-21 | Use default vehicle when non given for CH/LM profile selection, preserve hints for unprepared profiles [easbar]
    • 1f385ba16 2020-03-20 | Use SOD for aux searches in AlternativeRouteCH [Michael Zilske]
    • 30b9f9b73 2020-03-20 | Sort candidates; default maxPaths = 3 [Michael Zilske]
    • 2fd6cb5b9 2020-03-20 | Move stuff around [Michael Zilske]
    • bcf7c780c 2020-03-20 | Include auxiliary searches in nVisitedNodes [Michael Zilske]
    • c45c5a484 2020-03-20 | Technically more correct termination condition [Michael Zilske]
    • d9a55f820 2020-03-20 | Enhance test [Michael Zilske]
    • 1f9ca90a9 2020-03-20 | use JDK14 and jdk15 ea [Peter]
    Source code(tar.gz)
    Source code(zip)
  • 1.0-pre31(Mar 20, 2020)

    1.0-pre30 plus

    • 2a7e5fbaa 2020-03-20 | improve Measurement for block_area to fix #1961 (#1963) (HEAD -> master, origin/master) [Peter]
    • 499e96371 2020-03-20 | Fix GraphHopperConfigMixIn (otherwise config.yml is not usable) [easbar]
    • c769f799a 2020-03-17 | Improve AlternativeRouteCH [Michael Zilske]
    • 5a01808cb 2020-03-19 | more PMap refactoring (#1962) [Peter]
    • 0d7c365f4 2020-03-19 | Disable turn costs for LM preparation (#1964) [Andi]
    • fa7314413 2020-03-18 | Added more compass directions (#1959) [samruston]
    Source code(tar.gz)
    Source code(zip)
  • 1.0-pre30(Mar 18, 2020)

    Only intended for production usage if you know what you do :)

    Like 1.0-pre26 plus:

    • 198c8ede1 2020-03-18 | removed IPFilter (HEAD -> master, tag: 1.0-pre30, origin/master) [Peter]
    • a5b48cead 2020-03-18 | refactor PMap to use string,object instead of string,string (#1956) [Peter]
    • fe3525239 2020-03-17 | Mapzen (skadi) elevation provider (#1929) [Michael Barry]
    • dd2ff2350 2020-03-16 | throw error if old system parameter is used, see #1897 and #1879 [Peter]
    • d19d57f71 2020-03-15 | use enum instead of int (#1954) [Peter]
    • 9c9bae464 2020-03-13 | GraphHopperServerConfiguration auto-detects available ports (#1928) [Thomas Aulinger]
    • 7367af01d 2020-03-12 | Refactor distance calculation utilities to be elevation-aware (#1944) [Michael Barry]
    • ccd49dc32 2020-03-12 | Bilinear interpolation for height tiles (#1942) [Michael Barry]
    • e37aa9562 2020-03-12 | Move SpatialRuleLookup benchmark into Measurement class (#1894) [otbutz]
    • 1fff78aad 2020-03-12 | Extract profile selection (#1949) [Andi]
    • d27f9c35a 2020-03-10 | removed experimental UnsafeDataAccess (#1620) [Peter]
    • 5d85cc392 2020-03-10 | Avoid graph dependency (#1950) [Peter]
    • d6515a2fb 2020-03-10 | Simplify entire edges on import instead of just pillar nodes (#1943) [Michael Barry]
    • 6d0dc15e2 2020-03-10 | Make AbstractFlagEncoder methods protected: blockFords etc. (tag: 1.0-pre29) [easbar]
    • 32597675b 2020-03-08 | Remove odd LM profile selection rule [easbar]
    • 639bd9ab6 2020-03-08 | Check GraphHopper profiles after initializing the graph [easbar]
    • 9a88d52fb 2020-03-08 | Limit scope of uTurnCostsInt and turnCostProvider in GraphHopper#calcPaths [easbar]
    • 74df25083 2020-03-08 | Remove unused code (tag: 1.0-pre28) [Michael Zilske]
    • 5fe499e4f 2020-03-08 | avoid IntsRef recreation and simpler getter (#1947) [Peter]
    • 4ec39eea1 2020-03-08 | fix test: point hint got more strict, move closer to snapping target [Peter]
    • 3912164e8 2020-03-07 | TurnRelationIterator [Michael Zilske]
    • 04b1b1037 2020-03-06 | improve latest vs. stable docs link [Peter]
    • 937be2d84 2020-03-05 | config-example: further change of camelCase to snake #1918 [Peter]
    • aa97389b2 2020-03-05 | Extract setTurnCost/Restriction in test [easbar]
    • 08f0f57ab 2020-03-05 | Remove unused constructor [Michael Zilske]
    • e0320fe06 2020-03-05 | Clean up TurnCostStorage (#1945) [Michael Zilske]
    • cef07f657 2020-03-04 | flag encoders: no need for 4 parameter constructors introduced in #1936 [Peter]
    • a32d9c37c 2020-03-02 | NameSimilarityEdgeFilter: consistent constructor parameter order [Peter]
    • 7e8c79598 2020-03-02 | access on private roads (#1936) (tag: 1.0-pre27) [Peter]
    • e685415c9 2020-03-02 | clean up TagParsers and e.g. allow a RoadAccess with a different name like truck_road_access [Peter]
    Source code(tar.gz)
    Source code(zip)
  • 1.0-pre26(Mar 1, 2020)

    Only intended for production usage if you know what you do :)

    Like 1.0-pre20 plus:

    • 4c29eeeb5 2020-02-29 | removed unused EncodedValueOld (HEAD -> master, tag: 1.0-pre26, origin/master) [Peter]
    • f3504085f 2020-02-29 | fix integration test for client [Peter]
    • a14e7a96c 2020-02-29 | make DefaultTurnCostProvider thread-safe, fixes #1938 [Peter]
    • 912948161 2020-02-29 | Some minor cleanup [easbar]
    • 8d1570839 2020-02-29 | make readFlags private, remove unnecessary int set and remove QueryGraph.getOriginalEdgeFromVirtNode, #1938 [Peter]
    • 7d1f8c855 2020-02-28 | Add 100m radius restriction to point hint matches (#1935) [samruston]
    • 1f2084fde 2020-02-27 | avoidance of destination only for car, fixes #1831, bug introduced in #1752 [Peter]
    • 0f4cc1c14 2020-02-26 | Minor improvement of error message in profile consistency check [easbar]
    • e656101c0 2020-02-25 | Use new profiles section to configure LM&CH preparations (#1922) (tag: 1.0-pre25) [Andi]
    • 7c1d048d4 2020-02-25 | Create routing template in a factory function for easy override (#1923) [Andi]
    • 0ea8d4613 2020-02-25 | fixed Dockerfile for snake case #1918, fixes #1930 [Peter]
    • e1a3404cd 2020-02-25 | CarFlagEncoder: avoid reference comparison [Peter]
    • bce7174da 2020-02-25 | SpatialRule interface rework (#1880) [otbutz]
    • f006b48dc 2020-02-24 | Dockerfile: use node v13 [Peter]
    • 55384ec49 2020-02-23 | Allow using LM routing algo factory standalone (#1900) [Andi]
    • b56ae1dc4 2020-02-23 | highway=path and bicycle=yes should not get speed for pushing section (#1892) [ratrun]
    • 55408cedb 2020-02-22 | Fix problems with block_area (#1917) [Peter]
    • b57a55e3a 2020-02-21 | fix country rule ordering (#1911) [Peter]
    • a36921234 2020-02-21 | no need to explicitely list the snake case methods (#1918) [Peter]
    • 2136ec322 2020-02-21 | Start using JUnit 5 (#1909) [Andi]
    • 4c5d58946 2020-02-21 | if too few curbsides are specified do not throw IndexOutOfBoundsException for POST requests [Peter]
    • fcc17d902 2020-02-19 | measurement in graphhopper.sh: add turn cost [Peter]
    • 6215dd9e0 2020-02-19 | create routing template in a factory function for easy override [Naser Aliabadi]
    • b0069f16f 2020-02-18 | upgrade commons compress to 1.19 [Peter]
    • 32cfae256 2020-02-18 | Add dependency management and junit4 dependency to parent pom (#1912) [Andi]
    • a05de4b10 2020-02-17 | No longer enable CH by default in GraphHopper class (#1914) (tag: 1.0-pre24) [Andi]
    • 79f3ecd60 2020-02-17 | Update some docs and scripts from -Dgraphhopper to -Ddw.graphhopper [easbar]
    • 7ac624afc 2020-02-16 | Cleanup GraphHopper tests in preparation to profile parameter (#1913) [Andi]
    • 3401a522b 2020-02-14 | Extend RoadClass (#1907) [otbutz]
    • e98d02ccb 2020-02-13 | document command line changes #1897, #1879 [Peter]
    • d679e24fd 2020-02-12 | Put back LMProfile getter (tag: 1.0-pre23) [easbar]
    • 65bea04df 2020-02-12 | Add hint about disabling CH/LM when profile not found. (tag: 1.0-pre22) [easbar]
    • e2686bd85 2020-02-12 | Use LMProfile instead of just Weighting for LMPreparationHandler (#1899) [Andi]
    • ca78601fc 2020-02-10 | Extract RoutingConfig and DefaultWeightingFactory in GraphHopper class [easbar]
    • 76f768c68 2020-02-10 | Adjust test of #471 (tag: 1.0-pre21) [easbar]
    • 0a4388765 2020-02-09 | Allow loading GHStorage with a single CH preparation [easbar]
    • 3d63cdce2 2020-02-10 | Reduce usages of GraphHopper constructor [easbar]
    • 08acd7abf 2020-02-09 | Remove routing algorithm factory decorator abstraction (#1891) [Andi]
    • 0ee5582d5 2020-02-08 | Make CHGraphs/Profiles selectable by name [easbar]
    • 75a8a61bc 2020-02-06 | Put back LM16 measurements [easbar]
    • 5a1f85a1a 2020-02-06 | Minor cleanup in GraphHopper and fix test [easbar]
    • a03a93823 2020-02-05 | Improve turn instructions when leaving the roads (#1882) [Robin]
    • 04cfcd0b1 2020-02-04 | Do some minor cleanup in GraphHopper [easbar]
    • eb6e1d104 2020-02-04 | Change GraphHopper.init(CmdArgs)toinit(GraphHopperConfig)` (#1879) [Andi]
    • 9c2c9ecf4 2020-02-03 | location lookup based on Weighting additionally to access (#1838) [Peter]
    • a9795e01c 2020-02-01 | gh maps: add missing spec files [Peter]
    • a17b6d5d2 2020-01-31 | gh maps: move JS tests specs to correct folder and make them pass; avoid elevation workaround [Peter]
    • 7c27a51f5 2020-01-31 | SpatialRuleLookupBuilderTest: half overhead for benchmark [Peter]
    • 1a994b812 2020-01-30 | #1878 - Add example for input file (#1884) [Harel M]
    • 2b06bd280 2020-01-30 | Improve picking up default graph (#1876) [Peter]
    • 7c52b8ab5 2020-01-29 | Use JTS to determine applicable spatial rules (#1829) [otbutz]
    Source code(tar.gz)
    Source code(zip)
  • 1.0-pre20(Feb 1, 2020)

    Only intended for production usage if you know what you do :)

    Like 1.0-pre18 plus:

    • 2e55c309e 2020-01-28 | Fix step numbering in non-firefox browsers (#1874) (tag: 1.0-pre20) [Rémi Emonet]
    • 7acdcf934 2020-01-28 | Disable rezooming on intermediate point addition (#1868) (tag: 1.0-pre19) [Rémi Emonet]
    • 7f0a357b9 2020-01-28 | Replace our polygon code with the JTS implementation (#1853) [Peter]
    • 9791b3fae 2020-01-28 | AverageSpeedDetails: avoid exception for short edges (#1871) [Peter]
    • 4582ee033 2020-01-28 | Remove TurnWeighting and handle turn weights within Weighting instead (#1863) [Andi]
    • 4811ff378 2020-01-27 | Remove unused maxRetries mechanism in GraphHopper#calcPaths (#1870) [Andi]
    • a15583226 2020-01-27 | style.css: fix double bracket and minor layout tweak [Peter]
    • 72b707310 2020-01-27 | MMapDataAccess: fix bug for larger files [Peter]
    • 9518488f4 2020-01-27 | Add point-number indicator in the list of intermediate points (#1856) [Rémi Emonet]
    • ffb5f10f8 2020-01-27 | Remove rarely used helper method CHProfile#createProfilesForWeightings [easbar]
    • 7d11bd518 2020-01-24 | Clarify prepare.ch.edge_based docs [easbar]
    • dd8d34266 2020-01-24 | Make random tests more strict, but allow extra nodes (zero weight loops) [easbar]
    • 2edb21e2a 2020-01-24 | allow explicitely disabling elevation even if supported [Peter]
    • 3189cce04 2020-01-24 | Increase strict violation limit in random routing tests, fix #1864 [easbar]
    • 8f50c78a5 2020-01-24 | Fix error in turn-costs docs [easbar]
    • 60e6bc279 2020-01-13 | Add missing check during inbound transfers creation that lead to missing transfer when transfers.txt file is present. [Mathieu St-Pierre]
    • be221a57d 2020-01-23 | Failing test for transfer [Michael Zilske]
    • 4ab3635e1 2020-01-23 | Allow using strings to add CH profiles to GraphBuilder (#1861) [Andi]
    Source code(tar.gz)
    Source code(zip)
  • 1.0-pre18(Jan 22, 2020)

    Only intended for production usage if you know what you do :)

    Like 1.0-pre16 plus:

    • c3dad34d9 2020-01-20 | Move stuff around in GTFS (HEAD -> master, origin/master) [Michael Zilske]
    • 0af725fd0 2020-01-20 | Remove overly specific tests [Michael Zilske]
    • 8ab9a6630 2020-01-20 | Makes all tests pass for LM (#1749) [Michael Zilske]
    • 0c17411fc 2020-01-20 | minor test fix [Peter]
    • 41b6a0213 2020-01-19 | GH maps: minor fix if explicit turn_costs parameter [Peter]
    • 9f6a41b0e 2020-01-19 | Fix some whitespace and imports [easbar]
    • 85f8801d6 2020-01-19 | Use RoutingCHGraph adapter for CH query algorithms (#1850) (tag: 1.0-pre17) [Andi]
    • b634573ee 2020-01-16 | Add missing license headers [easbar]
    • d47943165 2020-01-16 | Fix some whitespace [easbar]
    • 8f3be56cc 2020-01-16 | Add benchmark for LM16 [easbar]
    • f95b5b760 2020-01-16 | Fix benchmark for LM (needs turn cost encoder for edge-based) [easbar]
    • c45e78410 2020-01-16 | Add edge based standard & LM routing to Measurement [easbar]
    • 39cd4df5d 2020-01-15 | Changed fullscreen button size (#1356) [Robin]
    • 32919525a 2020-01-15 | fixing int. tests [Peter]
    • fb4dffa4a 2020-01-13 | renamed variables, see https://github.com/graphhopper/graphhopper/pull/1844#discussion_r364012045 [Peter]
    • dc3b5e662 2020-01-13 | Android: VTM 0.13.0 OpenGL vector map library (#1851) [Emux]
    • d967567b4 2020-01-11 | Factor out concat for Paths [Michael Zilske]
    • a9f53f1f6 2020-01-10 | Factor out concat for Paths [Michael Zilske]
    Source code(tar.gz)
    Source code(zip)
  • 1.0-pre16(Jan 10, 2020)

    Only intended for production usage if you know what you do :)

    Like 1.0-pre14 plus:

    • 58681ee7e 2020-01-10 | Use road class to determine if a fork should have an instruction (#1844) (HEAD -> master, origin/master) [Robin]
    • 63f00e121 2020-01-10 | Work towards removing TurnWeighting (#1842) [Andi]
    • e72c67d7f 2020-01-08 | Add .idea (as file) to .gitignore [easbar]
    • bc257ff29 2020-01-04 | Reduce code duplication in AbstractGraphStorageTester [easbar]
    • 4cbba8269 2020-01-04 | include measurement for alternative routes #1722 (tag: 1.0-pre15) [Peter]
    • 631fd1e4c 2020-01-04 | Fix pt regression [Michael Zilske]
    • a947fe4e8 2020-01-04 | Alternative routes with node-based CH (#1722) [Michael Zilske]
    • 8bc9dbca4 2020-01-03 | fix integr. tests failures [Peter]
    • 9e05cf36d 2020-01-02 | avoid skipping ways if mixing encoders in OSMRoadClassParser (#1845) [Peter]
    • f815c6c6b 2019-12-31 | Use calcTurnMillis instead of calcTurnWeight in BidirPathExtractor [easbar]
    • 210cddd79 2019-12-31 | Move getMinWeight into AbstractAdjustedWeighting [easbar]
    Source code(tar.gz)
    Source code(zip)
  • 1.0-pre14(Jan 1, 2020)

    Only intended for production usage if you know what you do :)

    Like 1.0-pre13 plus:

    • 03dd6d4ec 2019-12-30 | (Almost) move access flag checks into weighting for CH preparation (#1837) (tag: 1.0-pre14) [Andi]
    • 0fed2e69a 2019-12-29 | Fix [easbar]
    • 4c064020f 2019-12-29 | Extract PrepareCHEdgeIterator interface and clean up a bit [easbar]
    • b521afbd5 2019-12-29 | Rename PreparationWeighting -> CHWeighting [easbar]
    • 44b2206e0 2019-12-29 | Inline iter() in PrepareCHEdgeIterator [easbar]
    • 086cafc19 2019-12-29 | Fix comment [easbar]
    • f674be229 2019-12-28 | Fix camel/snake case for periodic measurements [easbar]
    • dcf43891f 2019-12-28 | Setup periodic benchmarks [easbar]
    • 9913296f3 2019-12-28 | GH Maps: enable turn costs (#1834) [Peter]
    • ba2d181bb 2019-12-09 | Extract TurnWeighting#calcTurnMillis [easbar]
    • f62e0039a 2019-12-20 | Minor renaming [easbar]
    • 58cdbdfcf 2019-12-19 | Remove DataFlagEncoder (#1826) [Peter]
    Source code(tar.gz)
    Source code(zip)
  • 1.0-pre13(Jan 1, 2020)

    Only intended for production usage if you know what you do :)

    Like 1.0-pre11 plus:

    • e2141489d 2019-12-17 | Refactor AbstractRoutingAlgorithmTester (tag: 1.0-pre13) [easbar]
    • fc26dd1d0 2019-12-13 | No longer ignore curbside=any for GET requests [easbar]
    • af0993f1f 2019-12-13 | Make some weighting fields final [easbar]
    • 7796f466f 2019-12-13 | fix geocoding client bug #1825 [Peter]
    • 543da4b14 2019-12-12 | minor tweak for reuse [Peter]
    • de57fa4f8 2019-12-13 | Add java docs [easbar]
    • 402028f6d 2019-12-13 | Allow adding CHGraphs to GraphHopperStorage after creation [easbar]
    • fa175fff8 2019-12-13 | Rename BaseGraph#checkInit, remove GraphHopperStorage#getAllCHGraphs [easbar]
    • 0f322268e 2019-12-13 | Replace some more usages of GraphHopperStorage constructor with GraphBuilder [easbar]
    • 394869aa4 2019-12-12 | Remove unused dependency [Michael Zilske]
    • 7a6eca5c0 2019-12-12 | Integrate PT (#1824) [Michael Zilske]
    • 498e00d3c 2019-12-11 | Take routing algorithm factory out of PrepareContractionHierarchies (#1819) [Andi]
    • f90d05593 2019-12-11 | a sync request should be a POST request too (#1821) [Peter]
    • 6b8b4cae2 2019-12-10 | reintroduce setter for ConditionalTagInspector, got missing in #1817 (tag: 1.0-pre12) [Peter]
    Source code(tar.gz)
    Source code(zip)
  • 1.0-pre11(Dec 9, 2019)

    Only intended for production usage if you know what you do :)

    Like pre10 plus:

    • 1e1469d86 2019-12-09 | ensure we use separate point hints list internally, as we modify it (HEAD -> master, origin/master) [Peter]
    • 982f8374b 2019-12-08 | mmap/unsafe: include segmentSize when crashing [Peter]
    • 78793cf3e 2019-12-06 | Use PrepareCHGraph adapter for CH preparation (#1818) [Andi]
    • 46030b496 2019-12-05 | make day for conditional tag parsing configurable (#1817) [Peter]
    • cb1bea1da 2019-12-05 | more instruction annotations and bug fix (#1814) [Peter]
    • d992b901d 2019-12-05 | Rename QueryGraphTurnExt -> QueryGraphTurnCostStorage [easbar]
    • cfc976651 2019-12-05 | Remove (anyway broken) pass_through support for CH, remove ch.force_heading parameter, fix #1763 [easbar]
    • c13ea6ba5 2019-12-04 | Clean up PrepareContractionHierarchiesTest [easbar]
    • 88bbcc557 2019-12-04 | Reduce usages of getAllEdges().length() [easbar]
    • 624a9ed88 2019-12-04 | Rename WitnessPathSearcher -> EdgeBasedWitnessPathSearcher [easbar]
    • b7a9ec876 2019-12-04 | Enforce non-CH graphs for all LocationIndex implementations (#1816) [Andi]
    • 139af1a64 2019-12-04 | No longer use LevelEdgeFilter in NodeBasedNodeContractor [easbar]
    • eb3010a04 2019-12-04 | sets default to block_fords=false for all FlagEncoders; bug fix for intended values; fixes #236 [Peter]
    • daa5b9c0a 2019-12-04 | Remove FlagEncoder.getAnnotation (#1811) [Peter]
    Source code(tar.gz)
    Source code(zip)
  • 1.0-pre10(Nov 29, 2019)

    Only intended for production usage if you know what you do :)

    Like pre9 plus:

    • 0a967b3dd 2019-11-29 | bug fix if instructions=false (HEAD -> master, tag: 1.0-pre10, origin/master) [Peter]
    • 9dc4e01c6 2019-11-29 | introduce required encoded values (#1805) [Peter]
    • 96f8798d2 2019-11-28 | for now avoid exception if unknown FlagEncoder name [Peter]
    • b600ddb83 2019-11-28 | PathDetailsBuilderFactory: reduce from EncodingManager to EncodedValueLookup [Peter]
    Source code(tar.gz)
    Source code(zip)
  • 1.0-pre9(Nov 28, 2019)

    Only intended for production usage if you know what you do :)

    Like pre7 plus:

    • 80af19658 2019-11-28 | Close mmap for ElevationProvider if not removed (#1809) (HEAD -> master, tag: 1.0-pre9, origin/master) [Peter]
    • 7bd3e768c 2019-11-28 | Avoid throwing NumberFormatException in the OSMValueExtractor (#1804) [otbutz]
    • 847ea6841 2019-11-26 | avoid serializing empty lists (HEAD -> master, tag: 1.0-pre8, origin/master) [Peter]
    • fc1a4e64b 2019-11-26 | Decouple CH edge iterators from base graph edge iterators (#1806) [Andi]
    • 6ed437da6 2019-11-26 | Use Graph#edge instead of CHGraph#edge [easbar]
    • ee9bf6a9a 2019-11-25 | move relation and turn relation parsing out of FlagEncoder (#1775) [Peter]
    • 03f1f653b 2019-11-25 | fix test [Peter]
    • 967f53613 2019-11-24 | Rename addTurnCost/Restriction -> setTurnCost/Restriction [easbar]
    • 42a541cf9 2019-11-24 | Rename TurnCostExtension -> TurnCostStorage [easbar]
    • ce97613b4 2019-11-23 | make changing precision possible for DecimalDetails and AverageSpeedDetails for #1798 (remove_annotation, refactor_explorer) [Peter]
    • ef8b19136 2019-11-22 | remove FlagEncoder from PathDetailsBuilderFactory (#1798) [Peter]
    • 73c17901b 2019-11-20 | Speed up path simplification with path details/instructions - fixed (#1802) [Andi]
    • 6da0e02a9 2019-11-20 | Remove QueryGraph cache, fix #1768 [easbar]
    • 302882bcd 2019-11-20 | Add integration test for instructions+path details with simplification [easbar]
    Source code(tar.gz)
    Source code(zip)
  • 1.0-pre7(Nov 19, 2019)

    Only intended for production usage if you know what you do :)

    Like pre5 plus:

    • 781b1dbd3 2019-11-19 | make CH selection pluggable (#1797) (tag: 1.0-pre6) [Peter]
    • 82c4d5aeb 2019-11-19 | Return an empty path when start=target and curbside constraints are not opposite to each other. [easbar]
    • d07b5dace 2019-11-18 | Increase angle to ignore instruction for almost straight junction (#1795) [Robin]
    • 6342596d1 2019-11-18 | Add support for EU tunnel codes (#1786) [otbutz]
    • c42279e40 2019-11-14 | wheelchair: minor fix [Peter]
    • c4ec580f9 2019-11-14 | Update location index docs, fix #1793 [easbar]
    • b9c6af3f3 2019-11-14 | Use precompiled Pattern instances (#1789) [otbutz]
    • 798ad4fb5 2019-11-14 | String index (#1784) [Peter]
    • 9f7183378 2019-11-14 | Moves segment size setting of graphs into constructor (#1794) [Andi]
    • d3ebf2ecd 2019-11-13 | Make more usage of PrepareContractionHierarchies#fromGraphHopperStorage [easbar]
    • 5f188636b 2019-11-13 | Minor cleanup in measurements [easbar]
    • 556f3c87b 2019-11-13 | Wheelchair routing profile (#1726) [don-philipe]
    Source code(tar.gz)
    Source code(zip)
  • 1.0-pre5(Nov 19, 2019)

    Only intended for production usage if you know what you do :)

    Like pre4 plus:

    • adcca066d 2019-11-12 | Remove unintentional .setWeighting in GraphHopperIT (tag: 1.0-pre5) [easbar]
    • 524aaeab9 2019-11-12 | Select appropriate CH profile when no weighting or vehicle is given (#1790) [Andi]
    • 8a6e8b5dc 2019-11-12 | Fix test again (another data update), see 6c019586. [easbar]
    • c0e129cd1 2019-11-11 | Minor rename [easbar]
    • 983ae01e2 2019-11-11 | Remove GraphExtension interface (#1783) [Andi]
    • 6c0195868 2019-11-10 | Fix/update test (probably some data issue) [easbar]
    • 5a0e76a92 2019-11-10 | Make GraphExtension.NoOpExtension internal to GraphHopperStorage. [easbar]
    • 869ff2edb 2019-11-10 | Some picks from turn cost encoder refactoring [easbar]
    • 1f5690b6e 2019-11-09 | Add measurements for routing including hints+simplification with path details [easbar]
    • 29f3e0c15 2019-11-06 | Implement importAndClose API (#1759) [Michael Barry]
    • d9fcbc5be 2019-11-05 | update Surface to use ordinal for quality comparison and add more frequently used tags [Peter]
    • f5b08fcd2 2019-11-05 | more robust GHMRequest.compactPointHints [Peter]
    • f15d30208 2019-11-04 | added WeightDetails and xy.priority, improved TimeDetails [Peter]
    • 0ddfbd80c 2019-11-05 | Get rid of some usages of CHGraph#edge [easbar]
    • 11a005ae5 2019-11-01 | Add support for various hazmat tags (#1711) [otbutz]
    • 9c31116de 2019-10-31 | Fix an issue with several pt agencies [Michael Zilske]
    • a0e8fc7f1 2019-10-31 | Create failing test for an issue with several pt agencies [Michael Zilske]
    • 995457f3b 2019-10-30 | Miscellaneous PT tweaks (#1774) [Michael Zilske]
    • 171638a8f 2019-10-30 | PT Client; Yay, Webjars! (#1760) [Michael Zilske]
    • 634038df0 2019-10-29 | Replace Weighting with FlagEncoder in NodeContractor constructor [easbar]
    • 756e9396e 2019-10-29 | Make GHUtility#sortDFS sort edges, not just nodes (#1757) [Michael Barry]
    • 04d1070c9 2019-10-29 | destination support for car that doesn't modify the speed (#1752) [Peter]
    • 1c076ccc2 2019-10-28 | Improvements for bicycle use_sidepath value taggings. See #280 (#1769) [ratrun]
    Source code(tar.gz)
    Source code(zip)
  • 1.0-pre4(Nov 19, 2019)

    Only intended for production usage if you know what you do :)

    Like pre2 plus:

    • 5092c50bd 2019-10-25 | Support some Extended GTFS Route Types (#1761) (tag: 1.0-pre4) [MathStPierre]
    • feff743f9 2019-10-25 | Improve hike ETA (#1750) [Peter]
    • cf6a9801b 2019-10-25 | introduce new POST /route possibility (#1762) [Peter]
    • 58b6eb82e 2019-10-23 | Extract GraphModification from QueryGraph (#1751) [Andi]
    • bca912afe 2019-10-23 | Rename curbSide -> curbside [easbar]
    • 5668e4d0b 2019-10-22 | Prevent running CH contraction twice on the same CHGraph [easbar]
    • 643ddbc28 2019-10-22 | Revert "Adjust signature of GraphHopper#createTurnWeighting" [easbar]
    • cf309c407 2019-10-22 | Adjust signature of GraphHopper#createTurnWeighting [easbar]
    • 46e0feb5d 2019-10-21 | Run benchmarks on bayern + germany [easbar]
    • 4beb48a0d 2019-10-21 | reduce memory usage after sorting graph (#1755) [Michael Barry]
    • 9a88313e9 2019-10-16 | Adjust benchmark parameters (tag: 1.0-pre3) [easbar]
    • 21442e1ff 2019-10-16 | Fix CHGraphImple#debugPrint [easbar]
    • fd1a94ced 2019-10-15 | Move QueryGraph to separate package [easbar]
    • 2ee9623f1 2019-10-15 | Add some QueryGraph#lookup overloads for convenience [easbar]
    • 0a0335c57 2019-10-14 | And remove Weighting and Encoder from Path. Only Graph left. [Michael Zilske]
    • 06022d273 2019-10-14 | Use baseGraph for Instructions and such [Michael Zilske]
    • 9ec267678 2019-10-14 | Move instructions to instructions [Michael Zilske]
    • 2fbfdc16f 2019-10-14 | Move path details to path details [Michael Zilske]
    • 9f6eae3c7 2019-10-14 | Minor cleanup [easbar]
    • bc5926e68 2019-10-14 | Replace explicit QueryGraph#lookup call in GraphHopperGtfs [easbar]
    • 927a95e06 2019-10-12 | Fixes #1411; still occurs, but only in the extreme case. documented. [Michael Zilske]
    • adf6f7c7a 2019-10-12 | Remove unused context variable [Michael Zilske]
    • 0424d67bc 2019-10-12 | Remove unused context variable [Michael Zilske]
    • 87a9e0334 2019-10-11 | pick the isochrone component that contains the origin, fixes #1686 [Michael Zilske]
    • 6f0ef2a42 2019-10-11 | Remove unused 'result' queryparam [Michael Zilske]
    • a916ad9dc 2019-10-11 | Modernize IsochroneResourceTest [Michael Zilske]
    • bec2e7141 2019-10-11 | Modernize IsochroneResourceTest [Michael Zilske]
    • 8a15c301f 2019-10-11 | Remove obsolete interface; move highly-specific function to resource [Michael Zilske]
    • ee02bc112 2019-10-10 | Make measurement not output numbers as strings [easbar]
    • 2f70d7012 2019-10-10 | Add continuous performance testing setup [easbar]
    • 41f650afe 2019-10-09 | Sets versions to 1.0-SNAPSHOT [easbar]
    • bfdc73664 2019-10-09 | Add option to output measurement result as json [easbar]
    • 76d37e3f1 2019-10-09 | Clean up BidirectionalRoutingTest [easbar]
    • ead6173e4 2019-10-09 | Add curbside suppor for matrix requesters [easbar]
    • e1d54525c 2019-10-08 | Landmark bugs (#1745) [Michael Zilske]
    • 0faf680b7 2019-10-07 | removed unused method until proper implementation #1322 / #1086 [Peter]
    • 795d7a33d 2019-10-06 | Present "pt" to the web client even without FlagEncoder [Michael Zilske]
    • 7d5d6c3d0 2019-10-06 | Remove confusing cattle_grid from my test data [Michael Zilske]
    • 0dee7ab1e 2019-10-06 | Stop using FlagEncoder for Pt [Michael Zilske]
    • bcc6d8328 2019-10-06 | Stop using GraphExtension for Pt [Michael Zilske]
    Source code(tar.gz)
    Source code(zip)
  • 0.13.0(Sep 18, 2019)

  • 0.12.0(Mar 25, 2019)

Owner
GraphHopper
Open Source Routing Software from GraphHopper
GraphHopper
Renderers is an Android library created to avoid all the boilerplate needed to use a RecyclerView/ListView with adapters.

Renderers Renderers is an Android library created to avoid all the RecyclerView/Adapter boilerplate needed to create a list/grid of data in your app a

Pedro Vicente Gómez Sánchez 1.2k Nov 19, 2022
Vector map library and writer - running on Android and Desktop.

Mapsforge See the integration guide and changelog. And read through how to contribute guidelines. If you have any questions or problems, don't hesitat

mapsforge 1k Jan 2, 2023
Epoxy is an Android library for building complex screens in a RecyclerView

Epoxy Epoxy is an Android library for building complex screens in a RecyclerView. Models are automatically generated from custom views or databinding

Airbnb 8.1k Jan 4, 2023
Android library to auto-play/pause videos from url in recyclerview.

AutoplayVideos Show some ❤️ and star the repo to support the project This library is created with the purpose to implement recyclerview with videos ea

Krupen Ghetiya 989 Nov 17, 2022
:page_with_curl: [Android Library] Giving powers to RecyclerView

Android library that provides most common functions around recycler-view like Swipe to dismiss, Drag and Drop, Divider in the ui, events for when item

Nishant Srivastava 644 Nov 20, 2022
[] Easy Adapters library for Android

Deprecated Due to the growing use of the RecyclerView and the RecyclerView.Adapter provided adapter class, Easy-Adapter is now deprecated. Whilst the

ribot 425 Nov 25, 2022
This library provides GridAdapters(ListGridAdapter & CursorGridAdapter) which enable you to bind your data in grid card fashion within android.widget.ListView, Also provides many other features related to GridListView.

GridListViewAdapters This libarary enables you to implement GridView like card layout within ListView with added capabilites like Paginations, Additio

Biraj Patel 270 Nov 25, 2022
This library provides Easy Android ListView Adapters(EasyListAdapter & EasyCursorAdapter) which makes designing Multi-Row-Type ListView very simple & cleaner, It also provides many useful features for ListView.

EasyListViewAdapters Whenever you want to display custom items in listview, then only way to achieve this is to implement your own subclass of BaseAda

Biraj Patel 132 Nov 25, 2022
A library to make a mosaic with a preview of multiple images

Preview Image Collection Introduction Preview Image Collection is a library to draw a collage with a number of images like facebook preview album Inst

Agnaldo Pereira 50 Jun 13, 2022
Android library for the adapter view (RecyclerView, ViewPager, ViewPager2)

Antonio Android library for the adapter view (RecyclerView, ViewPager, ViewPager2) Free from implementation of the adapter's boilerplate code ! Reuse

NAVER Z 106 Dec 23, 2022
📭 Extension to Ktor’s routing system to add object oriented routing and much more. 💜

?? Ktor Routing Extensions Extension to Ktor’s routing system to add object-oriented routing and much more. ?? Why? This extension library was created

Noelware 6 Dec 28, 2022
GPS tracking tool for OpenStreetMap

OSMTracker for Android™ official source code repository is https://github.com/labexp/osmtracker-android. For more information about the project, docum

Laboratorio Experimental (ITCR @ SIUA) 455 Dec 25, 2022
GPS tracking tool for OpenStreetMap

OSMTracker for Android™ official source code repository is https://github.com/labexp/osmtracker-android. For more information about the project, docum

Laboratorio Experimental (ITCR @ SIUA) 455 Dec 25, 2022
🍃 Organic Maps is an Android & iOS offline maps app for travelers, tourists, hikers, and cyclists based on top of crowd-sourced OpenStreetMap data and curated with love by MapsWithMe founders.

?? Organic Maps is an Android & iOS offline maps app for travelers, tourists, hikers, and cyclists based on top of crowd-sourced OpenStreetMap data and curated with love by MapsWithMe founders. No ads, no tracking, no data collection, no crapware.

Organic Maps 4.3k Dec 31, 2022
🚧 A fully open-source project for creating and maintaining a Kotlin-based Minecraft: Java Edition server.

Hexalite: Java Edition ⚠️ WARNING: The Hexalite Network is a work in progress. It is not yet ready for production. You may encounter bugs and other is

Hexalite Studios 38 Nov 28, 2022
🚧 A fully open-source project for creating and maintaining a Kotlin-based Minecraft: Java Edition server.

Hexalite: Java Edition ⚠️ WARNING: The Hexalite Network is a work in progress. It is not yet ready for production. You may encounter bugs and other is

Hexalite Network 38 Nov 28, 2022
A modular and portable open source XMPP client library written in Java for Android and Java (SE) VMs

Smack About Smack is an open-source, highly modular, easy to use, XMPP client library written in Java for Java SE compatible JVMs and Android. Being a

Ignite Realtime 2.3k Dec 28, 2022
A modular and portable open source XMPP client library written in Java for Android and Java (SE) VMs

Smack About Smack is an open-source, highly modular, easy to use, XMPP client library written in Java for Java SE compatible JVMs and Android. Being a

Ignite Realtime 2.3k Dec 21, 2021
a 2d Java physics engine, native java port of the C++ physics engines Box2D and LiquidFun

jbox2d Please see the project's BountySource page to vote on issues that matter to you. Commenting/voting on issues helps me prioritize the small amou

jbox2d 1k Jan 2, 2023
XliteKt is an open-source, and forever open-source Kotlin based OSRS Emulator for educational purposes.

xlitekt Introduction XliteKt is an open-source, and forever open-source Kotlin based OSRS Emulator for educational purposes. Currently built around th

Runetopic 6 Dec 16, 2022