Releases: iisys-hof/map-matching-2
v1.0.10
This release fixes some bugs with duplicate point detection and with reprojection of non-OSM networks.
- We had a read-after-move in the models for the duplicate point detection and for the observations in the HMM. How this did not trigger any issues until now, is a mystery.
- Importing non-OSM networks (see the data examples) did not work with reprojection to other spatial reference systems. This was fixed.
- Some small bugfixes and error message harmonization was done.
Full Changelog: v1.0.9...v1.0.10
v1.0.9
This release again fixes some bugs with different than the default spatial reference systems (SRSs) and also outputs the sum of finished and aborted matches in CLI.
- In spherical-equatorial SRSs we had an inconcistency with the radius definition, that was fixed. The main use of sperical-equatorial SRS type is to use haversine instead of geographical distance and azimuth computations, which are faster but less accurate.
- We corrected the euclidean-distance computation (only used for A* heuristic) to compute in meters in all SRSs. For cartesian SRS type, this automatically works (as long as the SRS is in meters), for geographic and spherical-equatorial SRS type, the degrees are converted into meters by a simple spherical trogonometry formula, so that the computation remains fast.
- The CLI verbose output in the match mode now also outputs the sum of finished and aborted tracks, which is useful, when
--max-time
is set and some tracks are aborted, to find out quickly if and how many were aborted before further consultation of the individual results.
Full Changelog: v1.0.8...v1.0.9
v1.0.8
This release quick-fixes an issue with --max-time
setting not aborting correctly within candidate search with very high density tracks when trajectory simplification is turned off.
- When a track had very high density, candidate adoption with trajectory simplification being turned off might lead to the
--max-time
setting not working as intended. This should be fixed now, new abort conditions were introduced.
Full Changelog: v1.0.7...v1.0.8
v1.0.7
This release fixes a bug with the --memory-mapping off
serialization and deserialization, and it introduces a switch --ignore-non-existent
for switching the comparison behavior to the old one before v1.0.6.
- Turning off memory mapping via
--memory-mapping off
is not recommended (not to be confused with--memory-mapped-preparation off
that is useful for faster network preparation when enough RAM is available). However, due to some bugs in the code, it did not even work before. It should work now again with 1.0.7. Beware that this setting is needed for both preparation and matching, if used, and that the matching startup time needs a lot longer due to the initial deserialization of the serialized network. Prefer using memory mapping (the default). - A new switch for the comparison
--ignore-non-existent
does exactly what it says, it does not presume empty matches for non-existing matches for given ground truth routes but simply ignores them. So when you have a match file with for example only 10 percent of the tracks matched that are in the ground truth file for comparison, you can now ignore the remaining ground truth routes, or you can omit this setting and it presumes that the matching for the remaining 90 percent was not done, with zero accuracy assumed. So you can switch with the behavior before 1.0.6 (with the setting active) or use the new behavior without the setting applied.
Full Changelog: v1.0.6...v1.0.7
v1.0.6
This release fixes some rare bugs in the code, adds A* shortest path algorithm (however, not recommended and not the default), re-implements the --selector
parameter that was accidentially missing its implementation since 1.0, and makes the comparison check if all given ground_truth tracks have corresponding matches.
- The A* shortest path algorithm can be used with the new
--a-star
setting, however it is in fact slower and yields worse accuracy than the default Dijkstra's shortest path algorithm. There are two reasons: First, the heuristic method is not admissible, i.e., it calculcates euclidean distance on geographic and spherical coordinate systems, which leads in some cases to overshooting the target distance, which in turn makes A* finding suboptimal solutions. In cartesian coordinate systems, it should work correctly, but nevertheless, it is slower, because, second, we use a single-source-multiple-target shortest path search and cache the results, so with one Dijkstra call, we calculate dozens up to hundreds of routes in one go, whereas the A* algorithm is a single-source-single-target algorithm that needs to be called dozens up to hundreds of times. Therefore, the A* implementation is purely "theoretical" and not recommended to use in practice. - The
--routing-max-distance-factor
, which is the dynamic upper bound for the Dijkstra algorithm, can now be disabled by setting a negative value (e.g., -1). This is just for testing purposes, because in practice, it slows down the matching speed dramatically, depending on the road network size. The default should usually be fine and makes sure that the matching is nearly equally fast, no matter the size of the network. - The
--selector
parameter simply missed its implementation. Oops. It works correctly now again. - When in comparison mode, a ground truth track existed but no match, the ground truth was simply ignored. This could lead to a high overall accuracy (i.e., weighted mean correct fraction) when in reality, multiple tracks missed from the matches. Now if matches are missing for a ground truth, the comparison presumes an empty match and yields for that specific track an accuracy of zero. If you want the old behavior, you need to make sure that the ground truth does not contain tracks that are not in the matches, or you can use the
--compare-selector
parameter multiple times to specify all ids that you want to compare. - We also updated expat to 2.6.4 and protobuf to 29.1.
Full Changelog: v1.0.5...v1.0.6
v1.0.5
This release fixes a bug when --filter-duplicates off
is used. It should work correctly now.
- In the model configuration, lengths and azimuths of the track were incorrectly accessed when they were not existing due to the points lying on top of each other (which means in this software that the segment between the points has no valid length and no valid azimuth). As this can only happen when duplicate filtering is turned off, this issue slipped though until now.
Full Changelog: v1.0.4...v1.0.5
v1.0.4
This release fixes an issue with the edge tags missing in the final tags binary as well as removes the libosmium indices in favor of an own solution.
- There was an issue fixed where edge tags were not correctly copied from the adjacency list tags file into the final compressed sparse row tags file. The previous version was a little bit faster because it omitted that processing, which was wrong.
- We used the libosmium indices during importing of OpenStreetMap data. These created an additional temporary file on the OS disk even when the remaining temporary files were created on another disk. Moreover, the indices managed data that was in fact duplicate. The new solution works without the additional temporary file, so less memory and disk are used. Also, the network import should be a little bit faster now.
Full Changelog: v1.0.3...v1.0.4
v1.0.3
This version increases the prepare step speed significantly. We changed the way tags are processed. As such, much less unnecessary data is created, less RAM and disk space are needed, and the overall import is faster.
- Tags are now saved completely in the tags.bin file and queried by id of the node or edge (which is currently not done in the matching or comparison phase, only for the export of the nodes and edges into csv files). This means, tags are no longer directly stored at the nodes and edges, which reduces a lot of space, because previously, even empty tag containers needed space. This also means that when the "--simplify all" mode is used (default), opposed to the "--simplified osm-aware", the tags do not correctly match the node and edge IDs, because they are aggregated beyond the ID they were originally assigned to. Use "osm-aware" if you need the original OSM tags and IDs unchanged, for example when you export the "edge_ids" column in the results.
- The empty tag is now a single instance and reused, which again saves space and time.
- Node and edge IDs are now unsigned, should not make an issue with OSM because negative IDs are deprecated or used only for certain polygons, which we don't process. So OSM IDs should still be the same as before. For the matching without special needs, it is currently not relevant.
- We fixed a bug that crashed MSVC builds under Windows in comparison mode.
Full Changelog: v1.0.2...v1.0.3
As usual, the prepare step needs to be redone. Good that it is faster now!
v1.0.2
This version introduces a new parameter "--max-time" that now works for all models and algorithms.
- Previously, only Q-Learning supported a max-time (and it needed an additional parameter fixed-time, that was removed in favor of setting max-time to zero or omitting it).
Now all models support max-time, which means that they abort a match if the time-limit has been reached.
The time is specified in seconds, so "--max-time 30" means abort a matching after 30 seconds if no solution has been found yet. You can also use fractions, i.e., "--max-time 7.5" for 7.5 seconds, or long times, i.e., "--max-time 3600" for one hour.
The measurement is per track, so the case when the program "hangs" on the last track "like forever" can be solved with this setting. If a track is aborted, and there are more to match, the now free worker immediately continues with the next track. - A new column "abort" in the output csv file has been added so that you know which tracks were aborted. Also in the CLI output in verbose mode, you see which tracks were aborted. This is useful for eventual filtering of the results so that tracks that could not be matched within the time with the given settings can be selected and tried again with less complex settings, for example, without candidate adoption.
- We changed the way the matching result is outputted so that it does less unnecessary calculations when export-edges is off or the "edges_list" column is not set in the output csv. This should improve the overall speed in the default case where both options are off.
- The dependencies were updated to their latest versions, date from 3.0.1 to 3.0.2 and protobuf from 28.1 to 28.2.
- Previously prepared network data needs to be re-prepared, as already explained in the earlier release 1.0.1. This is to make sure no memory-layout changes due to recompilation and source-code changes lead to crashes or memory-access errors with the memory-mapped files. It should be safe not to be this restrictive, but due to the novelty of this feature, let's be extra safe, just in case, for now.
- The README now contains more prominently the nice results from the data sets that were introduced more hidden in the last release.
Full Changelog: v1.0.1...v1.0.2
As usual, prebuilt binaries for Linux (AppImage) and Windows (portable ZIP file) are given.
Thank you for your support!
v1.0.1
This version has some small improvements over the last release:
- The preparation step is a little bit faster now due to an improved in-place construction of some graph data and tags data in the memory mapped files.
- The new
edge_ids
match export column is disabled by default now, because on OSM networks, it only works correctly when these were prepared with the--simplify osm-aware
setting. In the default settings, edges with different ids might be merged and only one of the ids remains, which is no issue when the original edge_ids are not of interest. So it doesn't make any difference for the match results but this advanced export setting needs the original edge_ids preserved and this is not guaranteed by the default simplification setting. - Prepared memory mapped networks are compiler dependent, because the memory layout is different depending on the compiler (or the standard library used). They are now also version dependent of the program version, so they need to be re-prepared when using a different program version. This is to make sure that no memory access crashes happen when the memory layout changed due to a software update.
- Benchmarks were re-made with the new version and for every data set in the
data
directory, benchmarks and accuracy metrics are now also provided so that you can verify if the results on your system are similar. - Some tests with Clang 19 were done, but unfortunately, there is currently a bug in Boost that prevents compilation: boostorg/thread#402. We need to wait for the next Boost release that should contain this fix.
- Updated the README with new information on how to build on Windows without an IDE correctly. It is important to note that this software only works correctly on 64-bit operating systems and with 64-bit compilers. A 32-bit compiled application usually has a memory limit of 2 GB and this tool needs more than that memory already in some of our example benchmarks that we provide here. Additionally, some more small corrections and details were added.
Full Changelog: v1.0.0...v1.0.1
The reception since the 1.0 release has been great so far!
Thank you all for your support!