1 2# Change Log 3 4All notable changes to this project will be documented in this file. 5This project adheres to [Semantic Versioning](https://semver.org/). 6 7## [unreleased] - 8 9### Added 10 11### Changed 12 13### Fixed 14 15 16## [2.17.2] - 2021-12-16 17 18### Changed 19 20* Libosmium now supports being compiled in C++17 and C++20 mode. The minimum 21 version required is still C++11, but if you use libosmium in an C++17 or 22 C++20 application this should work properly. 23* Switch from catch version 1 to catch2 as test framework. 24* When `std::variant` is available (C++17 and above), libosmium will use that 25 instead of `boost::variant` reducing the dependencies a little bit. 26* Removed various workaround that were needed for older MSVC compilers. 27* Remove use of `boost::filter_iterator` and `boost::indirect_iterator`. The 28 removes the dependency on Boost Iterator. 29* Examples now mostly use the somewhat cleaner `return` instead of 30 `std::exit()` to return an exit code from `main`. 31* As always: Various small code cleanups. 32 33### Fixed 34 35* When ordering OSM objects (mostly use in the `CheckOrder` handler), the 36 smallest id possible (`INTMIN`) wasn't sorted correctly. 37* Threading problem when reading files. 38* Possible dereference of invalid iterator in legacy area assembler. This 39 only affects the legacy area assembler that takes old-style multipolygons 40 into account, so modern code that is not working with history data is not 41 affected. 42* Fixed read from an empty queue when reading a file which could block 43 libosmium forever when an error was encountered while reading a file. 44 45### Deprecated 46 47Several parts of libosmium have been marked deprecated, many of them for a very 48long time. These will not be part of the next version of libosmium: 49 50* Sparsehash index class `osmium::index::map::SparseMemTable` as well as the 51 complete file `osmium/index/map/sparse_mem_table.hpp`. 52* Callback functionality of the `osmium::memory::Buffer` class. The 53 `set_full_callback()` will not be available any more. See the source 54 for replacement options. 55* Various `osmium::builder::build_*` functions in 56 `osmium/builder/builder_helper.hpp`. Use `osmium::builder::add_*` 57 functions instead. Removes `builder_helper.hpp`. 58* `osmium::builder::Builder::add_item(const osmium::memory::Item* item)`. 59 Use the function of the same name taking a reference instead. 60* `osmium::builder::OSMObject/ChangesetBuilder::add_user()`. Use 61 `set_user()` instead. 62* `osmium::builder::ChangesetBuilder::bounds()` returning a modifiable 63 reference. Use `set_bounds()` instead. 64* Several functions around `osmium::io::OutputIterator`. 65* `osmium::Area::inner_ring_cbegin/cend()`, use `inner_rings()` instead. 66* `osmium::RelationMember::ref()`, use `set_ref()` instead. 67* Implicit conversion from `osmium::Timestamp` to `std::time_t`. Use 68 `seconds_since_epoch()` instead. 69* `osmium::string_to_user_id()`, use `string_to_uid` instead. 70* `osmium::static_cast_with_assert()` helper functions as well as the 71 complete include file `osmium/util/cast.hpp`. 72* Some constructors of `osmium::util::MemoryMapping` and 73 `osmium::util::TypedMemoryMapping`. Use other constructor instead. 74 75 76## [2.17.1] - 2021-10-05 77 78### Added 79 80* Add `osmium_tags_filter` example showing use of tags filter. 81* Add `Writer::set_header()` function to set header after constructing. 82 83### Changed 84 85* Various improvements in PBF file reading make it slightly faster and less 86 CPU intensive. 87* Since 2.17.0 Osmium will, when reading files, tell the kernel using 88 `fadvise` that it can remove pages from the buffer cache that are not 89 needed any more. This is usually beneficial, because the memory can be used 90 for something else. But if you are reading the same OSM file multiple times 91 at the same time or in short succession, it might be better to keep those 92 buffer pages. In that case you can set the environment variable 93 `OSMIUM_CLEAN_PAGE_CACHE_AFTER_READ` to `no` and Osmium will not call 94 `fadvise`. Set it to `yes` or anything else (or not set it at all) to get 95 the default behaviour. 96* If the macro `OSMIUM_DEFINE_EXPORT` is defined, all exception classes used 97 by Osmium will get "tagged as exported" using `__declspec(dllexport)` when 98 using MSVC or `__attribute__ ((visibility("default")))` on other compilers. 99 This is needed in PyOsmium. 100 101### Fixed 102 103* Fix integer parser. IDs in OPL files can now be anything between -2^63 and 104 2^63-1. 105 106 107## [2.17.0] - 2021-04-26 108 109### Added 110 111* Add "ids" output format. New IDS output format that is similar to 112 the OPL format, but only the entity type and id is written out. 113* Add convenience functions `left()`, `right()`, `top()`, `bottom()` to 114 access `osmium::Box` boundaries. 115* Add polygon output to WKB factory. 116* Add functions to access storage from `node_locations_for_ways` 117 handler. 118* Add flag `osmium::io::buffers_type` for telling the `Reader` class whether 119 you want buffers read to only contain a single type of OSM entity. 120* Add convenient named `nodes()`, `ways()`, and `relations()` accessor 121 functions to `nwr_array` class. 122* Add `DeltaDecode::value()` accessor function. 123* Add variant of the `Buffer::purge_removed()` function which doesn't take 124 a callback parameter. 125 126### Changed 127 128* Different varint decoding for faster PBF decoding. This makes PBF 129 decoding about 15% faster. 130* Several code optimmizations in (PBF) writer code that speed up 131 writing of OSM files considerably while using less CPU and spreading 132 the load on multiple CPUs. 133* Use memset/memcpy instead of `std::fill_n` and `std::copy` in object 134 builder for some slight speedups. 135* Ignore metadata setting on reader for history/change files. History 136 and change files must be read with metadata, because otherwise the 137 information is lost whether an object is visible or deleted. So 138 ignore this setting in that case. 139* On Linux: Use fadvise() to tell kernel about our reading patterns: 140 1. Tell kernel that we are reading OSM files sequentially. This 141 should improve pre-fetching of data blocks. 142 2. Tell kernel that we are done with block so they can be released. 143 This means we don't hog the buffer cache for something that 144 will, in all likelyhood, not be needed any more. 145* Use assert() instead of exception in "can not happen" situation in 146 the relations manager code. 147* Various code cleanups. 148 149### Fixed 150 151* Test failure with `add_tag_list` on some systems. 152* Test framework fix for aarch64 architecture. 153* Remove undefined behaviour in bzip2 compression code. 154* Rename some local variables to not shadow member functions. 155* Wrap `osmium::util::MemoryMapping::unmap()` in try/catch on Windows 156 also because we call this from a noexcept function. 157* Removed superfluous `std::forward`s and fixed code that called 158 `std::forward` multiple times on the same object. 159* Fix in OPL parser which could lead to invalid data being generated. 160* Fixed three bugs in O5M parser which could lead to an infinit loop 161 or segmentation faults. 162 163## [2.16.0] - 2021-01-08 164 165### Added 166 167* The PBF reader and writer now understand PBF blobs compressed with the LZ4 168 compression algorithm in addition to the usual ZLIB compression (or no 169 compression at all). LZ4 is much faster to compress and uncompress. Use 170 by setting the `pbf_compression` output file format option to `lz4`. You 171 have to define `OSMIUM_WITH_LZ4` to enable this before including any 172 libosmium includes. 173* The function `osmium::io::supported_pbf_compression_types` can now be used 174 to get a list of all PBF compression types supported. 175* The output file option `pbf_compression_level` can now be set to an integer. 176 The range depends on the compression type used, 0-9 for zlib compression 177 and 1-65537 for lz4 compression. 178* Adds `ptr_begin()`/`ptr_end()` functions to `ObjectPointerCollection` for 179 accessing the pointers instead of the underlying objects. 180 181### Changed 182 183* The `osmium::io::Writer::close()` function now returns the number of bytes 184 written to an OSM file if it is available (and 0 otherwise). 185* Use stable sort when sorting `ObjectPointerCollection`. 186 187### Fixed 188 189* Various small fixes and cleanups. 190 191 192## [2.15.6] - 2020-06-27 193 194### Added 195 196* Add `IdSetSmall::merge_sorted` function. 197 198### Changed 199 200* Little optimization for IdSetSmall: Don't add the same id twice in a row. 201 202### Fixed 203 204* Do not build areas with "recursion depth > 20". This happens when there 205 are complex multipolygon with many rings touching in single points. This 206 is a quick fix that hopefully keeps us going until we find a better 207 solution. 208 209## [2.15.5] - 2020-04-21 210 211### Added 212 213* Additional constructor for `builder::attr::member_type(_string)` taking 214 char type making it even easier to generate test data. 215* Allow single C string or `std::string` as argument for `builder::attr::_tag`. 216 Must contain key and value separated by the equal sign. 217* New `builder::attr::_t()` function to set tags from comma-separated string. 218* New `nwr_array` iterator. 219* Support for the PROJ library has now been declared deprecated. The old 220 PROJ API (up to version PROJ 6) is currently still available, but will 221 be removed in a future version. Support for the new PROJ API will not be 222 in libosmium. See https://github.com/osmcode/osmium-proj for some code 223 that might help you if you need this. 224 225### Changed 226 227* Check how much space is available in file system before resizing memory 228 mapped file (not on Windows). This means we can, at least in some cases, 229 show an error message instead of crashing the program. 230 231### Fixed 232 233* Parsing coordinates in PBF files did not work correctly if an lat/lon 234 offset was specified (which almost never happens). 235* Make OPL parser more strict: Attributes can only be specified once. 236* Do not close stdout after writing OSM file to it. 237 238## [2.15.4] - 2019-11-28 239 240### Added 241 242* Add osmium::Options::empty() for consistency with STL containers. 243 244### Fixed 245 246* Massive reduction of memory consumption in area assembly code. For some 247 very complex polygons memory usage can drop from multiple gigabytes to just 248 megabytes. 249 250## [2.15.3] - 2019-09-16 251 252### Added 253 254* New header option "sorting" when reading and writing PBFs. If the header 255 option "sorting" is set to `Type_then_ID`, the optional header property 256 `Sort.Type_then_ID` is set on writing to PBF files. When reading PBF files 257 with this header property, the "sorting" header option is set accordingly. 258 259### Fixed 260 261* Do not propagate C++ exception through C code. We are using the Expat 262 XML parser, a C library. It calls callbacks in our code. When those 263 callbacks throw, the exception was propagated through the C code. This 264 did work in the tests, but that behaviour isn't guaranteed (C++ 265 standard says it is implementation defined). This fixes it by catching 266 the exception and rethrowing it later. 267 268## [2.15.2] - 2019-08-16 269 270### Added 271 272* Instead of handler classes, the `apply` function can now also take 273 lambdas (or objects from classes implementing `operator()`). 274* Add swap, copy constructor and assignment operator to IdSetDense. 275 276### Changed 277 278* Enable use of the old proj API in proj version 6. This is a stopgap 279 solution until we find a better one. 280* Better error messages when there is an error parsing a timestamp. 281* Cleaned up a lot of code based on clang-tidy warnings. 282* Ignore <bbox> or <bounds> subelement of <way> or <relation>. <bounds> 283 elements are created by Overpass API as subelements of ways or relations 284 when the "out bb" format is used. <bbox> subelements turn up in files 285 downloaded from http://download.openstreetmap.fr/replication . Libosmium 286 used to throw an error like "Unknown element in <way>: bbox". With this 287 commit, these subelements are ignored, ie. there is no error any more, 288 but the data is not read. 289* Add swap, copy constructor and assignment operator to IdSetDense. 290* Update included catch.hpp to 1.12.2. 291* Retire use of `OSMIUM_NORETURN` macro. Use `[[noreturn]]` instead. 292 293### Fixed 294 295* Do not build areas with more than 100 locations where rings touch. 296 Places where rings touch are unusual for normal multipolygons and the 297 algorithm in libosmium that assembles multipolygons does not handle 298 them well. If there are too many touching points it becomes very slow. 299 This is not a problem for almost all multipolygons. As I am writing 300 this there are only three relations in the OSM database with more than 301 100 touching points, all of them rather weird boundaries in the US. 302 With this commit libosmium will simply ignore those areas to keep the 303 processing speed within reasonable bounds. 304 305 306## [2.15.1] - 2019-02-26 307 308### Added 309 310* More tests. 311* CMake config: also find clang-tidy-7. 312 313### Changed 314 315* Example and benchmark programs now don't crash with exceptions any more 316 but report them properly. 317 318### Fixed 319 320* Compile with NDEBUG in RelWithDebInfo mode. 321* Correctly throw exception in `multimap::dump_as_list()`. 322* Integer truncation on 32 bit systems in `MemoryUsage`. 323* Exception specification on some functions. 324* Forwarding references that might have hidden copy/move constructors. 325 326 327## [2.15.0] - 2018-12-07 328 329### Added 330 331* Function `dump_as_array()` to dump sparse array indexes. 332* Set the `xml_josm_upload` header option when reading XML files. 333* New function `OSMObject::remove_tags()` marks tags on OSM objects as 334 removed. 335* More tests. 336 337### Changed 338 339* When reading OSM files Libosmium now has less memory overhead, especially 340 when reading PBF files. This works by using more, but smaller buffers. 341* The `TagsFilter` class is now based on the `TagsFilterBase` template 342 class which allows setting the result type. This allows the filter to 343 return more data depending on the rule that matched. 344* Use enums for many constants instead of (static) const(expr) variables. 345* Make `chunk_bits` in `IdSetDense` configurable. 346* Hardcode `%lld` format instead of using `<cinttypes>` PRI macro. 347* Update included gdalcpp to version 1.2.0. 348 349### Fixed 350 351* The gzip/bzip2 compression code was overhauled and is better tested now. 352 This fixes some bugs on Windows. 353 354 355## [2.14.2] - 2018-07-23 356 357### Fixed 358 359* PBF reader and writer depended on byte order of system architecture. 360* Removed an unreliable test that didn't work on some architectures. 361 362 363## [2.14.1] - 2018-07-23 364 365### Changed 366 367* Libosmium now needs the newest Protozero version 1.6.3. 368* Removes dependency on the utfcpp library for conversions between Unicode 369 code points and UTF-8. We have our own functions for this now. This also 370 gives us more control on where errors are thrown in this code. 371* Add support for using the CRC32 implementation from the zlib library in 372 addition to the one from Boost. It is significantly faster and means we 373 have one less dependency, because zlib is needed anyway in almost all 374 programs using Osmium due to its use in the PBF format. Set macro 375 `OSMIUM_TEST_CRC_USE_BOOST` before compiling the tests, if you want to 376 run the tests with the boost library code, otherwise it will use the 377 zlib code. Note that to use this you have to change your software slightly, 378 see the documentation of the `CRC_zlib` class for details. 379* Add a `clear_user()` function to OSMObject and Changeset which allows 380 removing the user name of an entity without re-creating it in a new buffer. 381* In Osmium the 0 value of the Timestamp is used to denote the "invalid" 382 Timestamp, and its output using the `to_iso()` function is the empty 383 string. But this is the wrong output for OSM XML files, where a 384 timestamp that's not set should still be output as 385 1970-01-01T00:00:00Z. This version introduces a new `to_is_all()` 386 function which will do this and uses that function in the XML writer. 387* Use `protozero::byteswap_inplace` instead of `htonl`/`ntohl`. Makes the 388 code simpler and also works on Windows. 389* Marked `MultipolygonCollector` class as deprecated. Use the 390 `MultipolygonManager` class introduced in 2.13.0 instead. 391* Lots of code cleanups especially around `assert`s. Libosmium checks out 392 clean with `clang-tidy` now. Some documentation updates. 393 394### Fixed 395 396* Fix compilation error when `fileno()` is a macro (as in OpenBSD 6.3). 397* Make `Box` output consistent with the output of a single `Location` 398 and avoids problems with some locales. 399 400 401## [2.14.0] - 2018-03-31 402 403### Added 404 405* Add `ReaderWithProgressBar` class. This wraps an `osmium::io::Reader` and an 406 `osmium::ProgressBar` into a nice little package allowing easier use in the 407 common case. 408* Add polygon implementation for WKT and GeoJSON geometry factories. (Thanks 409 to Horace Williams.) 410* Various tests. 411 412### Changed 413 414* Add git submodule with `osm-testdata` repository. Before this the repository 415 had to be installed externally. Now a submodule update can be used to get the 416 correct version of the osm-testdata repository. 417* The XML file reader was rewritten to be more strict. Cases where it could 418 be tricked into failing badly were removed. There are now more tests for the 419 XML parser. 420* Replaced `strftime` by our own implementation. Uses a specialized 421 implementation for our use case instead the more general `strftime`. 422 Benchmarked this to be faster. 423* Changed the way IDs are parsed from strings. No asserts are used any more but 424 checks are done and an exception is thrown when IDs are out of range. This 425 also changes the way negative values are handled. The value `-1` is now 426 always accepted for all IDs and returned as `0`. This deprecates the 427 `string_to_user_id()` function, use `string_to_uid()` instead which returns a 428 different type. 429* It was always a bit confusing that some of the util classes and functions are 430 directly in the `osmium` namespace and some are in `osmium::util`. The 431 `osmium::util` namespace is now declared `inline`. which allows all util 432 classes and functions to be addressed directly in the `osmium` namespace 433 while keeping backwards compatibility. 434* An error is now thrown when the deprecated `pbf_add_metadata` file format 435 option is used. Use `add_metadata` instead. 436* Extended the `add_metadata` file format option. In addition to allowing the 437 values `true`, `yes`, `false`, and `no`, the new values `all` and `none` 438 are now recognized. The option can also be set to a list of attributes 439 separated by the `+` sign. Attributes are `version`, `timestamp`, 440 `changeset`, `uid`, and `user`. All output formats have been updated to 441 only output the specified attributes. This is based on the new 442 `osmium::metadata_options` class which stores information about what metadata 443 an `OSMObject` has or should have. (Thanks to Michael Reichert.) 444* The `<` (less than) operator on `OSMObject`s now ignores the case when 445 one or both of the timestamps on the objects are not set at all. This 446 allows better handling of OSM data files with reduced metadata. 447* Allow `version = -1` and `changeset = -1` in PBF input. This value is 448 sometimes used by other programs to denote "no value". Osmium uses the `0` 449 for this. 450* The example programs using the `getopt_long` function have been rewritten to 451 work without it. This makes using libosmium on Windows easier, where this 452 function is not available. 453* Removed the embedded protozero from repository. Like other dependencies you 454 have to install protozero first. If you check out the protozero repository 455 in the same directory where you checked out libosmium, libosmium's CMake 456 will find it. 457* Various code cleanups, fixing of include order, etc. 458* Remove need for `winsock2` library in Windows by using code from Protozero. 459 (Thanks alex85k.) 460* Add MSYS2 build to Appveyor and fixed some Windows compile issues. (Thanks 461 to alex85k.) 462* Use array instead of map to store input/output format creators. 463* Update included `catch.hpp` to version 1.12.1. 464 465### Fixed 466 467* Remove check for lost ways in multipolygon assembler. This rules out too many 468 valid multipolygons, more specifically more complex ones with touching inner 469 rings. 470* Use different macro magic for registering index maps. This allows the maps 471 to be used for several types at the same time. 472* Lots of code was rewritten to fix warnings reported by `clang-tidy` making 473 libosmium more robust. 474* Make ADL work for `begin()`/`end()` of `InputIterator<Reader>`. 475* Various fixes to make the code more robust, including an undefined behaviour 476 in the debug output format and a buffer overflow in the o5m parser. 477* Range checks in o5m parser throw exceptions now instead of triggering 478 assertions. 479* Better checking that PBF data is in range. 480* Check `read` and `write` system calls for `EINTR`. 481* Use tag and type from protozero to make PBF parser more robust. 482* Test `testdata-multipolygon` on Windows was using the wrong executable name. 483 484 485## [2.13.1] - 2017-08-25 486 487### Added 488 489- New "blackhole" file format which throws away all data written into it. 490 Used for benchmarking. 491 492### Changed 493 494- When reading OPL files, CRLF file endings are now handled correctly. 495- Reduce the max number of threads allowed for the `Pool` to 32. This should 496 still be plenty and might help with test failures on some architectures. 497 498### Fixed 499 500- Tests now run correctly independent of git `core.autocrlf` setting. 501- Set binary mode for all files on Windows in example code. 502- Low-level file functions now set an invalid parameter handler on Windows 503 to properly handle errors. 504- Restore earlier behaviour allowing zero-length mmap. It is important to 505 allow zero-length memory mapping, because it is possible that such an index 506 is empty, for instance when one type of object is missing from an input 507 file as in https://github.com/osmcode/osmium-tool/issues/65. Drawback is 508 that files must be opened read-write for this to work, even if we only 509 want to read from them. 510- Use Approx() to compare floating point values in tests. 511- Fix broken `Item` test on 32 bit platforms. 512 513 514## [2.13.0] - 2017-08-15 515 516### Added 517 518- New `RelationsManager` class superseeds the `relations::Collector` class. 519 The new class is much more modular and easier to extend. If you are using 520 the Collector class, you are encouraged to switch. 521- New `MultipolygonManager` based on the `RelationsManager` class superseeds 522 the `MultipolygonCollector` class. The examples have been changed to use the 523 new class and all users are encouraged to switch. There is also a 524 `MultipolygonManagerLegacy` class if you still need old-style multipolygon 525 support (see below). 526- New `FlexMem` index class that works with input files of any size and 527 stores the index in memory. This should now be used as the default index 528 for node location stores. Several example programs now use this index. 529- New `CallbackBuffer` class, basically a convenient wrapper around the 530 `Buffer` class with an additional callback function that is called whenever 531 the buffer is full. 532- Introduce new `ItemStash` class for storing OSM objects in memory. 533- New `osmium::geom::overlaps()` function to check if two `Box` objects 534 overlap. 535- Add function `IdSet::used_memory()` to get estimate of memory used in the 536 set. 537- New `is_defined()` and `is_undefined()` methods on `Location` class. 538- Tests for all provided example programs. (Some tests currently fail 539 on Windows for the `osmium_index_lookup` program.) 540 541### Changed 542 543- The area `Assembler` now doesn't work with old-style multipolygons (those 544 are multipolygon relations with the tags on the outer ways(s) instead of 545 on the relation) any more. Because old-style multipolygons are now (mostly) 546 gone from the OSM database this is usually what you want. The new 547 `AssemblerLegacy` class can be used if you actually need support for 548 old-style multipolygons, for instance if you are working with historical 549 data. (In that case you also need to use the `MultipolygonManagerLegacy` 550 class instead of the `MultipolygonManager` class.) 551- Changes for consistent ordering of OSM data: OSM data can come in any order, 552 but usual OSM files are ordered by type, ID, and version. These changes 553 extend this ordering to negative IDs which are sometimes used for objects 554 that have not been uploaded to the OSM server yet. The negative IDs are 555 ordered now before the positive ones, both in order of their absolute value. 556 This is the same ordering as JOSM uses. 557- Multipolygon assembler now checks for three or more overlapping segments 558 which are always an error and can report them. 559- Enable use of user-provided `thread::Pool` instances in `Reader` and 560 `Writer` for special use cases. 561- Growing a `Buffer` will now work with any capacity parameter, it is 562 always rounded up for proper alignment. Buffer constructor with three 563 arguments will now check that commmitted is not larger than capacity. 564- Updated embedded protozero to 1.5.2. 565- Update version of Catch unit test framework to 1.9.7. 566- And, as always, lots of small code cleanups and more tests. 567 568### Fixed 569 570- Buffers larger than 2^32 bytes do now work. 571- Output coordinate with value of -2^31 correctly. 572- Changeset comments with more than 2^16 characters are now allowed. The new 573 maximum size is 2^32. 574- `ChangesetDiscussionBuilder::add_comment_text()` could fail silently instead 575 of throwing an exception. 576- Changeset bounding boxes are now always output to OSM files (any format) 577 if at least one of the corners is defined. This is needed to handle broken 578 data from the main OSM database which contains such cases. The OPL reader 579 has also been fixed to handle this case. 580- In the example `osmium_location_cache_create`, the index file written is 581 always truncated first. 582 583 584## [2.12.2] - 2017-05-03 585 586### Added 587 588- Add two argument (key, value) overload of `TagMatcher::operator()`. 589 590### Changed 591 592- Detect, report, and remove duplicate ways in multipolygon relations. 593- Change EOF behaviour of Reader: The `Reader::read()` function will now 594 always return an invalid buffer exactly once to signal EOF. 595- Update QGIS multipolygon project that is part of the test suite to show 596 more problem types. 597- Copy multipolygon QGIS file for tests to build dir in cmake step. 598- Some code cleanups and improved debug output in multipolygon code. 599- Refactor I/O code to simplify code. 600- Disable some warnings on MSVC. 601- Various small code and build script changes. 602 603### Fixed 604 605- Two bugs in area assembler affecting very complex multipolygons and 606 multipolygons with overlapping or nearly overlapping lines. 607- Invalid use of iterators leading to undefined behaviour in area assembler 608 code. 609- Area assembler stats were not correctly counting inner rings that are 610 areas in their own right. 611- Fix a thread problem valgrind found that might or might not be real. 612- Read OPL file correctly even if trailing newline in file is missing. 613- Include order for `osmium/index/map` headers and 614 `osmium/index/node_locations_map.hpp` (or 615 `osmium/handler/node_locations_for_ways.hpp`) doesn't matter any more. 616 617 618## [2.12.1] - 2017-04-10 619 620### Added 621 622- New `TagsFilter::set_default_result()` function. 623 624### Changed 625 626- Use larger capacity for `Buffer` if necessary for alignment instead of 627 throwing an exception. Minimum buffer size is now 64 bytes. 628- Check order of input data in relations collector. The relations collector 629 can not deal with history data or a changes file. This was documented as a 630 requirement, but often lead to problems, because this was ignored by users. 631 So it now checks that the input data it gets is ordered and throws an 632 exception otherwise. 633- When writing an OSM file, set generator to libosmium if not set by app. 634 635### Fixed 636 637- Infinite loop in `Buffer::reserve_space()`. (Issue #202.) 638- `ObjectPointerCollection::unique()` now removes elements at end. 639- Tests comparing double using `==` operator. 640- Build on Cygwin. 641 642 643## [2.12.0] - 2017-03-07 644 645### Added 646 647- `TagMatcher` and `TagsFilter` classes for more flexibly matching tags and 648 selecting objects based on tags. This obsoletes the less flexible classes 649 based on `osmium::tags::Filter` classes. 650- Extended `index::RelationsMap(Stash|Index)` classes to also allow 651 parent-to-member lookups. 652- New `nrw_array` helper class. 653- `ObjectPointerCollection::unique()` function. 654 655### Changed 656 657- Area assembler can now detect invalid locations and report them in the 658 stats and through the problem reporter. If the new config option 659 `ignore_invalid_locations` is set, the Assembler will pretend they weren't 660 even referenced in the ways. (Issue #195.) 661- `osmium::area::Assembler::operator()` will now return a boolean reporting 662 whether building of the area(s) was successful. 663- Split up area `Assembler` class into three classes: The 664 `detail::BasicAssembler` is now the parent class. `Assembler` is the child 665 class for usual use. The new `GeomAssembler` also derives from 666 `BasicAssembler` and builds areas without taking tags into account at all. 667 This is to support osm2pgsql which does tag handling itself. (Issue #194.) 668- The `Projection` class can do any projection supported by the Proj.4 669 library. As a special case it now uses our own Mercator projection 670 functions when the web mercator projection (EPSG 3857) is used. This is 671 much faster than going through Proj.4. 672- Better error messages for low-level file utility functions. 673- Mark `build_tag_list*` functions in `builder_helper.hpp` as deprecated. You 674 should use the functions from `osmium/builder/attr.hpp` instead. 675- Improved performance of the `osmium::tags::match_(any|all|none)_of` 676 functions. 677- Improved performance of string comparison in `tags::Filter`. 678- Update version of Catch unit test framework to 1.8.1. This meant some 679 tests had to be updated. 680- Use `get_noexcept()` in `NodeLocationsForWays` handler. 681- And lots of code and test cleanups... 682 683### Fixed 684 685- Terminate called on full non-auto-growing buffer. (Issue #189.) 686- When file formats were used that were not compiled into the binary, it 687 terminated instead of throwing. (Issue #197.) 688- Windows build problem related to including two different winsock versions. 689- Windows build problem related to forced build for old Windows versions. 690 (Issue #196.) 691- Clear stream contents in ProblemReporterException correctly. 692- Add `-pthread` compiler and linker options on Linux/OSX. This should fix 693 a problem where some linker versions will not link binaries correctly when 694 the `--as-needed` option is used. 695- The `Filter::count()` method didn't compile at all. 696- XML reader doesn't fail on relation member ref=0 any more. 697 698 699## [2.11.0] - 2017-01-14 700 701### Added 702 703- New index::RelationsMap(Stash|Index) classes implementing an index for 704 looking up parent relation IDs given a member relation ID. 705- Add `get_noexcept()` method to all index maps. For cases where ids are 706 often not in the index using this can speed up a program considerably. 707- New non-const WayNodeList::operator[]. 708- Default constructed "invalid" Coordinates. 709- Tile constructor from web mercator coordinates and some helper 710 functions for tile arithmetic. 711- Tag matcher matching keys using a regex. 712- New `envelope()` functions on `NodeRefList`, `Way`, and `Area` returning a 713 `Box` object with the geometric envelope of the object. 714- Add `amenity_list` example. 715 716### Changed 717 718- Replaced the implementation for the web mercator projection using the usual 719 tan-formula with a polynomial approximation which is much faster and good 720 enough for OSM data which only has ~1cm resolution anyway. See 721 https://github.com/osmcode/mercator-projection for all the details and 722 benchmarks. You can disable this by defining the macro 723 `OSMIUM_USE_SLOW_MERCATOR_PROJECTION` before including any of the Osmium 724 headers. 725- Removed the outdated `Makefile`. Always use CMake directly to build. 726- Refactoring of `osmium::apply()` removing the resursive templates for faster 727 compile times and allowing rvalue handlers. 728- Lots of code and test cleanups and more documentation. 729 730### Fixed 731 732- Handle endianess on FreeBSD properly. 733- Fixed doxygen config for reproducible builds. 734 735 736## [2.10.3] - 2016-11-20 737 738### Changed 739 740- Round out ObjectPointerCollection implementation and test it. 741- Updated embedded protozero to 1.4.5. 742 743 744## [2.10.2] - 2016-11-16 745 746### Changed 747 748- Updated embedded protozero to 1.4.4. 749 750### Fixed 751 752- Buffer overflow in osmium::Buffer. 753 754 755## [2.10.1] - 2016-11-15 756 757### Changed 758 759- Updated embedded protozero to 1.4.3. 760 761### Fixed 762 763- Made IdSet work on 32bit systems. 764- Fixed endianness check for WKB tests. 765 766 767## [2.10.0] - 2016-11-11 768 769### Added 770 771- The `Reader` can take an additional optional `read_meta` flag. If this is 772 set to false the PBF input will ignore metadata on OSM objects (like version, 773 timestamp, uid, ...) which speeds up file reading by 10 to 20%. 774- New `IdSet` virtual class with two implementations: `IdSetDense` and 775 `IdSetSmall`. Used to efficiently store a set of Ids. This is often needed 776 to track, for instance, which nodes are needed for ways, etc. 777- Added more examples and better documented existing examples. 778- Add a benchmark "mercator" converting all node locations in a file to 779 WebMercator and creating geometries in WKB format. 780 781### Changed 782 783- Better queue handling makes I/O faster in some circumstances. 784- The `FindOsmium.cmake` CMake script can now check a current enough libosmium 785 version is found. 786- Builders can now be constructed with a reference to parent builder. 787- Made builders more robust by adding asserts that will catch common usage 788 problems. 789- Calling `OSMObjectBuilder::add_user()` is now optional, and the method was 790 renamed to `set_user()`. (`add_user()` is marked as deprecated.) 791- Benchmarks now show compiler and compiler options used. 792- `Builder::add_item()` now takes a reference instead of pointer (old version 793 of the function marked as deprecated). 794- GEOS support is deprecated. It does not work any more for GEOS 3.6 or newer. 795 Reason is the changed interface in GEOS 3.6. If there is interest for the 796 GEOS support, we can add support back in later (but probably using the 797 GEOS C API which is more stable than the C++ API). Some tests using GEOS 798 were rewritten to work without it. 799- The `BoolVector` has been deprecated in favour of the new `IdSet` classes. 800- Lots of code cleanups and improved API documentation in many places. 801- The relations collector can now tell you whether a relation member was in 802 the input data. See the new `is_available()` and 803 `get_availability_and_offset()` methods. 804- Updated embedded Catch unit test header to version 1.5.8. 805 806### Fixed 807 808- Parsing of coordinates starting with decimal dot and coordinates in 809 scientific notation. 810- `~` operator for `entity_bits` doesn't set unused bits any more. 811- Progress bar can now be (temporarily) removed, to allow other output. 812 813 814## [2.9.0] - 2016-09-15 815 816### Added 817 818- Support for reading OPL files. 819- For diff output OSM objects in buffers can be marked as only in one or the 820 other file. The OPL and debug output formats support diff output based on 821 this. 822- Add documentation and range checks to `Tile` struct. 823- More documentation. 824- More examples and more extensive comments on examples. 825- Support for a progress report in `osmium::io::Reader()` and a `ProgressBar` 826 utility class to use it. 827- New `OSMObject::set_timestamp(const char*)` function. 828 829### Changed 830 831- Parse coordinates in scientific notations ourselves. 832- Updated included protozero version to 1.4.2. 833- Lots of one-argument constructors are now explicit. 834- Timestamp parser now uses our own implementation instead of strptime. 835 This is faster and independant of locale settings. 836- More cases of invalid areas with duplicate segments are reported as 837 errors. 838 839### Fixed 840 841- Fixed a problem limiting cache file sizes on Windows to 32 bit. 842- Fixed includes. 843- Exception messages for invalid areas do not report "area contains no rings" 844 any more, but "invalid area". 845 846 847## [2.8.0] - 2016-08-04 848 849### Added 850 851- EWKT support. 852- Track `pop` type calls and queue underruns when `OSMIUM_DEBUG_QUEUE_SIZE` 853 environment variable is set. 854 855### Changed 856 857- Switched to newest protozero v1.4.0. This should deliver some speedups 858 when parsing PBF files. This also removes the DeltaEncodeIterator class, 859 which isn't needed any more. 860- Uses `std::unordered_map` instead of `std::map` in PBF string table code 861 speeding up writing of PBF files considerably. 862- Uses less memory when writing PBF files (smaller string table by default). 863- Removes dependency on sparsehash and boost program options libraries for 864 examples. 865- Cleaned up threaded queue code. 866 867### Fixed 868 869- A potentially very bad bug was fixed: When there are many and/or long strings 870 in tag keys and values and/or user names and/or relation roles, the string 871 table inside a PBF block would overflow. I have never seen this happen for 872 normal OSM data, but that doesn't mean it can't happen. The result is that 873 the strings will all be mixed up, keys for values, values for user names or 874 whatever. 875- Automatically set correct SRID when creating WKB and GEOS geometries. 876 Note that this changes the behaviour of libosmium when creating GEOS 877 geometries. Before we created them with -1 as SRID unless set otherwise. 878 Manual setting of the SRID on the GEOSGeometryFactory is now deprecated. 879- Allow coordinates of nodes in scientific notation when reading XML files. 880 This shouldn't be used really, but sometimes you can find them. 881 882 883## [2.7.2] - 2016-06-08 884 885### Changed 886 887- Much faster output of OSM files in XML, OPL, or debug formats. 888 889### Fixed 890 891- Parsing and output of coordinates now faster and always uses decimal dot 892 independant of locale setting. 893- Do not output empty discussion elements in changeset XML output. 894- Data corruption regression in mmap based indexes. 895 896 897## [2.7.1] - 2016-06-01 898 899### Fixes 900 901- Update version number in version.hpp. 902 903 904## [2.7.0] - 2016-06-01 905 906### Added 907 908- New functions for iterating over specific item types in buffers 909 (`osmium::memory::Buffer::select()`), over specific subitems 910 (`osmium::OSMObject::subitems()`), and for iterating over all rings of 911 an area (`osmium::Areas::outer_rings()`, `inner_rings()`). 912- Debug output optionally prints CRC32 when `add_crc32` file option is set. 913 914### Changed 915 916- XML parser will not allow any XML entities which are usually not used in OSM 917 files anyway. This can help avoiding DOS attacks. 918- Removed SortedQueue implementation which was never used. 919- Also incorporate Locations in NodeRefs into CRC32 checksums. This means 920 all checksums will be different compared to earlier versions of libosmium. 921- The completely new algorithm for assembling multipolygons is much faster, 922 has better error reporting, generates statistics and can build more complex 923 multipolygons correctly. The ProblemReporter classes have changed to make 924 this happen, if you have written your own, you have to fix it. 925- Sparse node location stores are now only sorted if needed, ie. when nodes 926 come in unordered. 927 928### Fixed 929 930- Output operator for Location shows full precision. 931- Undefined behaviour in WKB writer and `types_from_string()` function. 932- Fix unsigned overflow in pool.hpp. 933- OSM objects are now ordered by type (nodes, then ways, then relations), 934 then ID, then version, then timestamp. Ordering by timestamp is normally 935 not necessary, because there can't be two objects with same type, ID, and 936 version but different timestamp. But this can happen when diffs are 937 created from OSM extracts, so we check for this here. This change also 938 makes sure IDs are always ordered by absolute IDs, positives first, so 939 order is 0, 1, -1, 2, -2, ... 940- Data corruption bug fixed in disk based indexes (used for the node 941 location store for instance). This only affected you, if you created 942 and index, closed it, and re-opened it (possibly in a different process) 943 and if there were missing nodes. If you looked up those nodes, you got 944 location (0,0) back instead of an error. 945- Memory corruption bug showing up with GDAL 2. 946 947 948## [2.6.1] - 2016-02-22 949 950### Added 951 952- Add `WITH_PROFILING` option to CMake config. When enabled, this sets the 953 `-fno-omit-frame-pointer` compiler option. 954 955### Changed 956 957- Massive speed improvements when building multipolygons. 958- Uses (and includes) new version 1.3.0 of protozero library. 959- Removed dependency on Boost Iterator for PBF writer. 960- Example program `osmium_area_test` now uses `cerr` instead of `cout` for 961 debug output. 962 963 964## [2.6.0] - 2016-02-04 965 966### Added 967 968- The new handler osmium::handler::CheckOrder can be used to check that a 969 file is properly ordered. 970- Add new method to build OSM nodes, ways, relations, changesets, and areas 971 in buffers that wraps the older Builder classes. The new code is much easier 972 to use and very flexible. There is no documentation yet, but the tests in 973 `test/t/builder/test_attr.cpp` can give you an idea how it works. 974- Add util class to get memory usage of current process on Linux. 975 976### Changed 977 978- New Buffer memory management speeds up Buffer use, because it doesn't clear 979 the memory unnecessarily. 980 981### Fixed 982 983- osmium::Box::extend() function now ignores invalid locations. 984- Install of external library headers. 985- Check way has at least one node before calling `is_closed()` in area 986 assembler. 987- Declaration/definition of some friend functions was in the wrong namespace. 988 989 990## [2.5.4] - 2015-12-03 991 992### Changed 993 994- Included gdalcpp.hpp header was updated to version 1.1.1. 995- Included protozero library was updated to version 1.2.3. 996- Workarounds for missing constexpr support in Visual Studio removed. All 997 constexpr features we need are supported now. 998- Some code cleanup after running clang-tidy on the code. 999- Re-added `Buffer::value_type` typedef. Turns out it is needed when using 1000 `std::back_inserter` on the Buffer. 1001 1002### Fixed 1003 1004- Bugs with Timestamp code on 32 bit platforms. This necessitated 1005 some changes in Timestamp which might lead to changes in user 1006 code. 1007- Bug in segment intersection code (which appeared on i686 platform). 1008 1009 1010## [2.5.3] - 2015-11-17 1011 1012### Added 1013 1014- `osmium::make_diff_iterator()` helper function. 1015 1016### Changed 1017 1018- Deprecated `osmium::Buffer::set_full_callback()`. 1019- Removed DataFile class which was never used anywhere. 1020- Removed unused and obscure `Buffer::value_type` typedef. 1021 1022### Fixed 1023 1024- Possible overrun in Buffer when using the full-callback. 1025- Incorrect swapping of Buffer. 1026 1027 1028## [2.5.2] - 2015-11-06 1029 1030# Fixed 1031 1032- Writing data through an OutputIterator was extremly slow due to 1033 lock contention. 1034 1035 1036## [2.5.1] - 2015-11-05 1037 1038### Added 1039 1040- Header `osmium/fwd.hpp` with forward declarations of the most commonly 1041 used Osmium classes. 1042 1043### Changed 1044 1045- Moved `osmium/io/overwrite.hpp` to `osmium/io/writer_options.hpp` 1046 If you still include the old file, you'll get a warning. 1047 1048 1049## [2.5.0] - 2015-11-04 1050 1051### Added 1052 1053- Helper functions to make input iterator ranges and output iterators. 1054- Add support for reading o5m and o5c files. 1055- Option for osmium::io::Writer to fsync file after writing. 1056- Lots of internal asserts() and other robustness checks. 1057 1058### Changed 1059 1060- Updated included protozero library to version 1.2.0. 1061- Complete overhaul of the I/O system making it much more robust against 1062 wrong data and failures during I/O operations. 1063- Speed up PBF writing by running parts of it in parallel. 1064- OutputIterator doesn't hold an internal buffer any more, but it uses 1065 one in Writer. Calling flush() on the OutputIterator isn't needed any 1066 more. 1067- Reader now throws when trying to read after eof or an error. 1068- I/O functions that used to throw `std::runtime_error` now throw 1069 `osmium::io_error` or derived. 1070- Optional parameters on `osmium::io::Writer` now work in any order. 1071 1072### Fixed 1073 1074- PBF reader now decodes locations of invisible nodes properly. 1075- Invalid Delta encode iterator dereference. 1076- Lots of includes fixed to include (only) what's used. 1077- Dangling reference in area assembly code. 1078 1079 1080## [2.4.1] - 2015-08-29 1081 1082### Fixed 1083 1084- CRC calculation of tags and changesets. 1085 1086 1087## [2.4.0] - 2015-08-29 1088 1089### Added 1090 1091- Checks that user names, member roles and tag keys and values are not longer 1092 than 256 * 4 bytes. That is the maximum length 256 Unicode characters 1093 can have in UTF-8 encoding. 1094- Support for GDAL 2. GDAL 1 still works. 1095 1096### Changed 1097 1098- Improved CMake build scripts. 1099- Updated internal version of Protozero to 1.1.0. 1100- Removed `toogr*` examples. They are in their own repository now. 1101 See https://github.com/osmcode/osm-gis-export. 1102- Files about to be memory-mapped (for instance index files) are now set 1103 to binary mode on Windows so the application doesn't have to do this. 1104 1105### Fixed 1106 1107- Hanging program when trying to open file with an unknown file format. 1108- Building problems with old boost versions. 1109- Initialization errors in PBF writer. 1110- Bug in byte swap code. 1111- Output on Windows now always uses binary mode, even when writing to 1112 stdout, so OSM xml and opl files always use LF line endings. 1113 1114 1115## [2.3.0] - 2015-08-18 1116 1117### Added 1118 1119- Allow instantiating osmium::geom::GEOSFactory with existing GEOS factory. 1120- Low-level functions to support generating a architecture- and endian- 1121 independant CRC from OSM data. This is intended to be uses with boost::crc. 1122- Add new debug output format. This format is not intended to be read 1123 automatically, but for human consumption. It formats the data nicely. 1124- Make writing of metadata configurable for XML and OPL output (use 1125 `add_metadata=false` as file option). 1126 1127### Changed 1128 1129- Changed `add_user()` and `add_role()` in builders to use string length 1130 without the 0-termination. 1131- Improved code setting file format from suffix/format argument. 1132- Memory mapping utility class now supports readonly, private writable or 1133 shared writable operation. 1134- Allow empty version (0) in PBF files. 1135- Use utf8cpp header-only lib instead of boost for utf8 decoding. The library 1136 is included in the libosmium distribution. 1137- New PBF reader and writer based on the protozero. A complete rewrite of the 1138 code for reading and writing OSM PBF files. It doesn't use the Google 1139 protobuf library and it doesn't use the OSMPBF/OSM-Binary library any more. 1140 Instead is uses the protozero lightweight protobuf header library which is 1141 included in the code. Not only does the new code have less dependencies, it 1142 is faster and more robust. https://github.com/mapbox/protozero 1143 1144### Fixed 1145 1146- Various smaller bug fixes. 1147- Add encoding for relation member roles in OPL format. 1148- Change character encoding to new format in OPL: variable length hex code 1149 between % characters instead of a % followed by 4-digit hex code. This is 1150 necessary because unicode characters can be longer than the 4-digit hex 1151 code. 1152- XML writer: The linefeed, carriage return, and tab characters are now 1153 escaped properly. 1154- Reading large XML files could block. 1155 1156## [2.2.0] - 2015-07-04 1157 1158### Added 1159 1160- Conversion functions for some low-level types. 1161- BoolVector index class. 1162- `min_op`/`max_op` utility functions. 1163- More tests here and there. 1164- Helper methods `is_between()` and `is_visible_at()` to DiffObject. 1165- GeoJSON factory using the RapidJSON library. 1166- Support for tile calculations. 1167- Create simple polygons from ways in geom factories. 1168- `MemoryMapping` and `TypedMemoryMapping` helper classes. 1169- `close()` function to `mmap_vector_base` class. 1170- Function on `Buffer` class to get iterator to specific offset. 1171- Explicit cast operator from `osmium::Timestamp` to `uint32_t`. 1172 1173### Changed 1174 1175- Throw exception on illegal values in functions parsing strings to get ids, 1176 versions, etc. 1177- Improved error message for geometry exceptions. 1178 1179### Fixed 1180 1181- Throw exception from `dump_as_array()` and `dump_as_list()` functions if not 1182 implemented in an index. 1183- After writing OSM files, program could stall up to a second. 1184- Dense location store was written out only partially. 1185- Use `uint64_t` as counter in benchmarks, so there can be no overflows. 1186- Example programs now read packed XML files, too. 1187- Refactoring of memory mapping code. Removes leak on Windows. 1188- Better check for invalid locations. 1189- Mark `cbegin()` and `cend()` of `mmap_vector_base` as const functions. 1190 1191## [2.1.0] - 2015-03-31 1192 1193### Added 1194 1195- When writing PBF files, sorting the PBF stringtables is now optional. 1196- More tests and documentation. 1197 1198### Changed 1199 1200- Some functions are now declared `noexcept`. 1201- XML parser fails now if the top-level element is not `osm` or `osmChange`. 1202 1203### Fixed 1204 1205- Race condition in PBF reader. 1206- Multipolygon collector was accessing non-existent NodeRef. 1207- Doxygen documentation wan't showing all classes/functions due to a bug in 1208 Doxygen (up to version 1.8.8). This version contains a workaround to fix 1209 this. 1210 1211[unreleased]: https://github.com/osmcode/libosmium/compare/v2.17.2...HEAD 1212[2.17.2]: https://github.com/osmcode/libosmium/compare/v2.17.1...v2.17.2 1213[2.17.1]: https://github.com/osmcode/libosmium/compare/v2.17.0...v2.17.1 1214[2.17.0]: https://github.com/osmcode/libosmium/compare/v2.16.0...v2.17.0 1215[2.16.0]: https://github.com/osmcode/libosmium/compare/v2.15.6...v2.16.0 1216[2.15.6]: https://github.com/osmcode/libosmium/compare/v2.15.5...v2.15.6 1217[2.15.5]: https://github.com/osmcode/libosmium/compare/v2.15.4...v2.15.5 1218[2.15.4]: https://github.com/osmcode/libosmium/compare/v2.15.3...v2.15.4 1219[2.15.3]: https://github.com/osmcode/libosmium/compare/v2.15.2...v2.15.3 1220[2.15.2]: https://github.com/osmcode/libosmium/compare/v2.15.1...v2.15.2 1221[2.15.1]: https://github.com/osmcode/libosmium/compare/v2.15.0...v2.15.1 1222[2.15.0]: https://github.com/osmcode/libosmium/compare/v2.14.2...v2.15.0 1223[2.14.2]: https://github.com/osmcode/libosmium/compare/v2.14.1...v2.14.2 1224[2.14.1]: https://github.com/osmcode/libosmium/compare/v2.14.0...v2.14.1 1225[2.14.0]: https://github.com/osmcode/libosmium/compare/v2.13.1...v2.14.0 1226[2.13.1]: https://github.com/osmcode/libosmium/compare/v2.13.0...v2.13.1 1227[2.13.0]: https://github.com/osmcode/libosmium/compare/v2.12.2...v2.13.0 1228[2.12.2]: https://github.com/osmcode/libosmium/compare/v2.12.1...v2.12.2 1229[2.12.1]: https://github.com/osmcode/libosmium/compare/v2.12.0...v2.12.1 1230[2.12.0]: https://github.com/osmcode/libosmium/compare/v2.11.0...v2.12.0 1231[2.11.0]: https://github.com/osmcode/libosmium/compare/v2.10.3...v2.11.0 1232[2.10.3]: https://github.com/osmcode/libosmium/compare/v2.10.2...v2.10.3 1233[2.10.2]: https://github.com/osmcode/libosmium/compare/v2.10.1...v2.10.2 1234[2.10.1]: https://github.com/osmcode/libosmium/compare/v2.10.0...v2.10.1 1235[2.10.0]: https://github.com/osmcode/libosmium/compare/v2.9.0...v2.10.0 1236[2.9.0]: https://github.com/osmcode/libosmium/compare/v2.8.0...v2.9.0 1237[2.8.0]: https://github.com/osmcode/libosmium/compare/v2.7.2...v2.8.0 1238[2.7.2]: https://github.com/osmcode/libosmium/compare/v2.7.1...v2.7.2 1239[2.7.1]: https://github.com/osmcode/libosmium/compare/v2.7.0...v2.7.1 1240[2.7.0]: https://github.com/osmcode/libosmium/compare/v2.6.1...v2.7.0 1241[2.6.1]: https://github.com/osmcode/libosmium/compare/v2.6.0...v2.6.1 1242[2.6.0]: https://github.com/osmcode/libosmium/compare/v2.5.4...v2.6.0 1243[2.5.4]: https://github.com/osmcode/libosmium/compare/v2.5.3...v2.5.4 1244[2.5.3]: https://github.com/osmcode/libosmium/compare/v2.5.2...v2.5.3 1245[2.5.2]: https://github.com/osmcode/libosmium/compare/v2.5.1...v2.5.2 1246[2.5.1]: https://github.com/osmcode/libosmium/compare/v2.5.0...v2.5.1 1247[2.5.0]: https://github.com/osmcode/libosmium/compare/v2.4.1...v2.5.0 1248[2.4.1]: https://github.com/osmcode/libosmium/compare/v2.4.0...v2.4.1 1249[2.4.0]: https://github.com/osmcode/libosmium/compare/v2.3.0...v2.4.0 1250[2.3.0]: https://github.com/osmcode/libosmium/compare/v2.2.0...v2.3.0 1251[2.2.0]: https://github.com/osmcode/libosmium/compare/v2.1.0...v2.2.0 1252[2.1.0]: https://github.com/osmcode/libosmium/compare/v2.0.0...v2.1.0 1253 1254