All notable changes to this project will be documented in this file. This project adheres to Semantic Versioning.
2.20.0 - 2023-09-20
- Optionally allow fractional seconds in timestamps in OSM files.
- Enable
posix_fadvise
usage on FreeBSD. - Make parsing PBFs a bit less picky.
- Various small code cleanups.
- Don't use class template arguments on
GeometryFactory
constructor definition.
2.19.0 - 2023-01-19
- Mark RapidJSON support as deprecated.
- Update included Catch to v2.13.10.
- Remove deprecated BoolVector class.
- Remove deprecated NWRIdSet class.
- Remove deprecated AssemblerConfig constructor.
- Print start of offending string in overlong string exception.
- Implement
set_thread_name()
on FreeBSD. - Some small code cleanups.
- Fix return type in
MembersDatabaseCommon::count_not_removed()
. - Make bzip2 unit tests pass on musl-based systems.
- Fix bug in members database test case.
2.18.0 - 2022-02-07
- Use
system_error
instead ofruntime_error
where it fits better. - Remove
OSMIUM_NORETURN
macro. This hasn't been used in a while.
Several parts of libosmium have been marked deprecated, many of them for a very long time. These are now removed:
- Sparsehash index class
osmium::index::map::SparseMemTable
as well as the complete fileosmium/index/map/sparse_mem_table.hpp
. - Callback functionality of the
osmium::memory::Buffer
class. Theset_full_callback()
will not be available any more. See the source for replacement options. - Various
osmium::builder::build_*
functions inosmium/builder/builder_helper.hpp
. Useosmium::builder::add_*
functions instead. Removesbuilder_helper.hpp
. osmium::builder::Builder::add_item(const osmium::memory::Item* item)
. Use the function of the same name taking a reference instead.osmium::builder::OSMObject/ChangesetBuilder::add_user()
. Useset_user()
instead.osmium::builder::ChangesetBuilder::bounds()
returning a modifiable reference. Useset_bounds()
instead.- Several functions around
osmium::io::OutputIterator
. osmium::Area::inner_ring_cbegin/cend()
, useinner_rings()
instead.osmium::RelationMember::ref()
, useset_ref()
instead.- Implicit conversion from
osmium::Timestamp
tostd::time_t
. Useseconds_since_epoch()
instead. osmium::string_to_user_id()
, usestring_to_uid
instead.osmium::static_cast_with_assert()
helper functions as well as the complete include fileosmium/util/cast.hpp
.- Some constructors of
osmium::util::MemoryMapping
andosmium::util::TypedMemoryMapping
. Use other constructor instead.
2.17.3 - 2022-01-19
- Removed possible deadlock when shutting down active Reader.
2.17.2 - 2021-12-16
- Libosmium now supports being compiled in C++17 and C++20 mode. The minimum version required is still C++11, but if you use libosmium in an C++17 or C++20 application this should work properly.
- Switch from catch version 1 to catch2 as test framework.
- When
std::variant
is available (C++17 and above), libosmium will use that instead ofboost::variant
reducing the dependencies a little bit. - Removed various workaround that were needed for older MSVC compilers.
- Remove use of
boost::filter_iterator
andboost::indirect_iterator
. The removes the dependency on Boost Iterator. - Examples now mostly use the somewhat cleaner
return
instead ofstd::exit()
to return an exit code frommain
. - As always: Various small code cleanups.
- When ordering OSM objects (mostly use in the
CheckOrder
handler), the smallest id possible (INTMIN
) wasn't sorted correctly. - Threading problem when reading files.
- Possible dereference of invalid iterator in legacy area assembler. This only affects the legacy area assembler that takes old-style multipolygons into account, so modern code that is not working with history data is not affected.
- Fixed read from an empty queue when reading a file which could block libosmium forever when an error was encountered while reading a file.
Several parts of libosmium have been marked deprecated, many of them for a very long time. These will not be part of the next version of libosmium:
- Sparsehash index class
osmium::index::map::SparseMemTable
as well as the complete fileosmium/index/map/sparse_mem_table.hpp
. - Callback functionality of the
osmium::memory::Buffer
class. Theset_full_callback()
will not be available any more. See the source for replacement options. - Various
osmium::builder::build_*
functions inosmium/builder/builder_helper.hpp
. Useosmium::builder::add_*
functions instead. Removesbuilder_helper.hpp
. osmium::builder::Builder::add_item(const osmium::memory::Item* item)
. Use the function of the same name taking a reference instead.osmium::builder::OSMObject/ChangesetBuilder::add_user()
. Useset_user()
instead.osmium::builder::ChangesetBuilder::bounds()
returning a modifiable reference. Useset_bounds()
instead.- Several functions around
osmium::io::OutputIterator
. osmium::Area::inner_ring_cbegin/cend()
, useinner_rings()
instead.osmium::RelationMember::ref()
, useset_ref()
instead.- Implicit conversion from
osmium::Timestamp
tostd::time_t
. Useseconds_since_epoch()
instead. osmium::string_to_user_id()
, usestring_to_uid
instead.osmium::static_cast_with_assert()
helper functions as well as the complete include fileosmium/util/cast.hpp
.- Some constructors of
osmium::util::MemoryMapping
andosmium::util::TypedMemoryMapping
. Use other constructor instead.
2.17.1 - 2021-10-05
- Add
osmium_tags_filter
example showing use of tags filter. - Add
Writer::set_header()
function to set header after constructing.
- Various improvements in PBF file reading make it slightly faster and less CPU intensive.
- Since 2.17.0 Osmium will, when reading files, tell the kernel using
fadvise
that it can remove pages from the buffer cache that are not needed any more. This is usually beneficial, because the memory can be used for something else. But if you are reading the same OSM file multiple times at the same time or in short succession, it might be better to keep those buffer pages. In that case you can set the environment variableOSMIUM_CLEAN_PAGE_CACHE_AFTER_READ
tono
and Osmium will not callfadvise
. Set it toyes
or anything else (or not set it at all) to get the default behaviour. - If the macro
OSMIUM_DEFINE_EXPORT
is defined, all exception classes used by Osmium will get "tagged as exported" using__declspec(dllexport)
when using MSVC or__attribute__ ((visibility("default")))
on other compilers. This is needed in PyOsmium.
- Fix integer parser. IDs in OPL files can now be anything between -2^63 and 2^63-1.
2.17.0 - 2021-04-26
- Add "ids" output format. New IDS output format that is similar to the OPL format, but only the entity type and id is written out.
- Add convenience functions
left()
,right()
,top()
,bottom()
to accessosmium::Box
boundaries. - Add polygon output to WKB factory.
- Add functions to access storage from
node_locations_for_ways
handler. - Add flag
osmium::io::buffers_type
for telling theReader
class whether you want buffers read to only contain a single type of OSM entity. - Add convenient named
nodes()
,ways()
, andrelations()
accessor functions tonwr_array
class. - Add
DeltaDecode::value()
accessor function. - Add variant of the
Buffer::purge_removed()
function which doesn't take a callback parameter.
- Different varint decoding for faster PBF decoding. This makes PBF decoding about 15% faster.
- Several code optimmizations in (PBF) writer code that speed up writing of OSM files considerably while using less CPU and spreading the load on multiple CPUs.
- Use memset/memcpy instead of
std::fill_n
andstd::copy
in object builder for some slight speedups. - Ignore metadata setting on reader for history/change files. History and change files must be read with metadata, because otherwise the information is lost whether an object is visible or deleted. So ignore this setting in that case.
- On Linux: Use fadvise() to tell kernel about our reading patterns:
- Tell kernel that we are reading OSM files sequentially. This should improve pre-fetching of data blocks.
- Tell kernel that we are done with block so they can be released. This means we don't hog the buffer cache for something that will, in all likelyhood, not be needed any more.
- Use assert() instead of exception in "can not happen" situation in the relations manager code.
- Various code cleanups.
- Test failure with
add_tag_list
on some systems. - Test framework fix for aarch64 architecture.
- Remove undefined behaviour in bzip2 compression code.
- Rename some local variables to not shadow member functions.
- Wrap
osmium::util::MemoryMapping::unmap()
in try/catch on Windows also because we call this from a noexcept function. - Removed superfluous
std::forward
s and fixed code that calledstd::forward
multiple times on the same object. - Fix in OPL parser which could lead to invalid data being generated.
- Fixed three bugs in O5M parser which could lead to an infinit loop or segmentation faults.
2.16.0 - 2021-01-08
- The PBF reader and writer now understand PBF blobs compressed with the LZ4
compression algorithm in addition to the usual ZLIB compression (or no
compression at all). LZ4 is much faster to compress and uncompress. Use
by setting the
pbf_compression
output file format option tolz4
. You have to defineOSMIUM_WITH_LZ4
to enable this before including any libosmium includes. - The function
osmium::io::supported_pbf_compression_types
can now be used to get a list of all PBF compression types supported. - The output file option
pbf_compression_level
can now be set to an integer. The range depends on the compression type used, 0-9 for zlib compression and 1-65537 for lz4 compression. - Adds
ptr_begin()
/ptr_end()
functions toObjectPointerCollection
for accessing the pointers instead of the underlying objects.
- The
osmium::io::Writer::close()
function now returns the number of bytes written to an OSM file if it is available (and 0 otherwise). - Use stable sort when sorting
ObjectPointerCollection
.
- Various small fixes and cleanups.
2.15.6 - 2020-06-27
- Add
IdSetSmall::merge_sorted
function.
- Little optimization for IdSetSmall: Don't add the same id twice in a row.
- Do not build areas with "recursion depth > 20". This happens when there are complex multipolygon with many rings touching in single points. This is a quick fix that hopefully keeps us going until we find a better solution.
2.15.5 - 2020-04-21
- Additional constructor for
builder::attr::member_type(_string)
taking char type making it even easier to generate test data. - Allow single C string or
std::string
as argument forbuilder::attr::_tag
. Must contain key and value separated by the equal sign. - New
builder::attr::_t()
function to set tags from comma-separated string. - New
nwr_array
iterator. - Support for the PROJ library has now been declared deprecated. The old PROJ API (up to version PROJ 6) is currently still available, but will be removed in a future version. Support for the new PROJ API will not be in libosmium. See https://github.com/osmcode/osmium-proj for some code that might help you if you need this.
- Check how much space is available in file system before resizing memory mapped file (not on Windows). This means we can, at least in some cases, show an error message instead of crashing the program.
- Parsing coordinates in PBF files did not work correctly if an lat/lon offset was specified (which almost never happens).
- Make OPL parser more strict: Attributes can only be specified once.
- Do not close stdout after writing OSM file to it.
2.15.4 - 2019-11-28
- Add osmium::Options::empty() for consistency with STL containers.
- Massive reduction of memory consumption in area assembly code. For some very complex polygons memory usage can drop from multiple gigabytes to just megabytes.
2.15.3 - 2019-09-16
- New header option "sorting" when reading and writing PBFs. If the header
option "sorting" is set to
Type_then_ID
, the optional header propertySort.Type_then_ID
is set on writing to PBF files. When reading PBF files with this header property, the "sorting" header option is set accordingly.
- Do not propagate C++ exception through C code. We are using the Expat XML parser, a C library. It calls callbacks in our code. When those callbacks throw, the exception was propagated through the C code. This did work in the tests, but that behaviour isn't guaranteed (C++ standard says it is implementation defined). This fixes it by catching the exception and rethrowing it later.
2.15.2 - 2019-08-16
- Instead of handler classes, the
apply
function can now also take lambdas (or objects from classes implementingoperator()
). - Add swap, copy constructor and assignment operator to IdSetDense.
- Enable use of the old proj API in proj version 6. This is a stopgap solution until we find a better one.
- Better error messages when there is an error parsing a timestamp.
- Cleaned up a lot of code based on clang-tidy warnings.
- Ignore or subelement of or . elements are created by Overpass API as subelements of ways or relations when the "out bb" format is used. subelements turn up in files downloaded from http://download.openstreetmap.fr/replication . Libosmium used to throw an error like "Unknown element in : bbox". With this commit, these subelements are ignored, ie. there is no error any more, but the data is not read.
- Add swap, copy constructor and assignment operator to IdSetDense.
- Update included catch.hpp to 1.12.2.
- Retire use of
OSMIUM_NORETURN
macro. Use[[noreturn]]
instead.
- Do not build areas with more than 100 locations where rings touch. Places where rings touch are unusual for normal multipolygons and the algorithm in libosmium that assembles multipolygons does not handle them well. If there are too many touching points it becomes very slow. This is not a problem for almost all multipolygons. As I am writing this there are only three relations in the OSM database with more than 100 touching points, all of them rather weird boundaries in the US. With this commit libosmium will simply ignore those areas to keep the processing speed within reasonable bounds.
2.15.1 - 2019-02-26
- More tests.
- CMake config: also find clang-tidy-7.
- Example and benchmark programs now don't crash with exceptions any more but report them properly.
- Compile with NDEBUG in RelWithDebInfo mode.
- Correctly throw exception in
multimap::dump_as_list()
. - Integer truncation on 32 bit systems in
MemoryUsage
. - Exception specification on some functions.
- Forwarding references that might have hidden copy/move constructors.
2.15.0 - 2018-12-07
- Function
dump_as_array()
to dump sparse array indexes. - Set the
xml_josm_upload
header option when reading XML files. - New function
OSMObject::remove_tags()
marks tags on OSM objects as removed. - More tests.
- When reading OSM files Libosmium now has less memory overhead, especially when reading PBF files. This works by using more, but smaller buffers.
- The
TagsFilter
class is now based on theTagsFilterBase
template class which allows setting the result type. This allows the filter to return more data depending on the rule that matched. - Use enums for many constants instead of (static) const(expr) variables.
- Make
chunk_bits
inIdSetDense
configurable. - Hardcode
%lld
format instead of using<cinttypes>
PRI macro. - Update included gdalcpp to version 1.2.0.
- The gzip/bzip2 compression code was overhauled and is better tested now. This fixes some bugs on Windows.
2.14.2 - 2018-07-23
- PBF reader and writer depended on byte order of system architecture.
- Removed an unreliable test that didn't work on some architectures.
2.14.1 - 2018-07-23
- Libosmium now needs the newest Protozero version 1.6.3.
- Removes dependency on the utfcpp library for conversions between Unicode code points and UTF-8. We have our own functions for this now. This also gives us more control on where errors are thrown in this code.
- Add support for using the CRC32 implementation from the zlib library in
addition to the one from Boost. It is significantly faster and means we
have one less dependency, because zlib is needed anyway in almost all
programs using Osmium due to its use in the PBF format. Set macro
OSMIUM_TEST_CRC_USE_BOOST
before compiling the tests, if you want to run the tests with the boost library code, otherwise it will use the zlib code. Note that to use this you have to change your software slightly, see the documentation of theCRC_zlib
class for details. - Add a
clear_user()
function to OSMObject and Changeset which allows removing the user name of an entity without re-creating it in a new buffer. - In Osmium the 0 value of the Timestamp is used to denote the "invalid"
Timestamp, and its output using the
to_iso()
function is the empty string. But this is the wrong output for OSM XML files, where a timestamp that's not set should still be output as 1970-01-01T00:00:00Z. This version introduces a newto_is_all()
function which will do this and uses that function in the XML writer. - Use
protozero::byteswap_inplace
instead ofhtonl
/ntohl
. Makes the code simpler and also works on Windows. - Marked
MultipolygonCollector
class as deprecated. Use theMultipolygonManager
class introduced in 2.13.0 instead. - Lots of code cleanups especially around
assert
s. Libosmium checks out clean withclang-tidy
now. Some documentation updates.
- Fix compilation error when
fileno()
is a macro (as in OpenBSD 6.3). - Make
Box
output consistent with the output of a singleLocation
and avoids problems with some locales.
2.14.0 - 2018-03-31
- Add
ReaderWithProgressBar
class. This wraps anosmium::io::Reader
and anosmium::ProgressBar
into a nice little package allowing easier use in the common case. - Add polygon implementation for WKT and GeoJSON geometry factories. (Thanks to Horace Williams.)
- Various tests.
- Add git submodule with
osm-testdata
repository. Before this the repository had to be installed externally. Now a submodule update can be used to get the correct version of the osm-testdata repository. - The XML file reader was rewritten to be more strict. Cases where it could be tricked into failing badly were removed. There are now more tests for the XML parser.
- Replaced
strftime
by our own implementation. Uses a specialized implementation for our use case instead the more generalstrftime
. Benchmarked this to be faster. - Changed the way IDs are parsed from strings. No asserts are used any more but
checks are done and an exception is thrown when IDs are out of range. This
also changes the way negative values are handled. The value
-1
is now always accepted for all IDs and returned as0
. This deprecates thestring_to_user_id()
function, usestring_to_uid()
instead which returns a different type. - It was always a bit confusing that some of the util classes and functions are
directly in the
osmium
namespace and some are inosmium::util
. Theosmium::util
namespace is now declaredinline
. which allows all util classes and functions to be addressed directly in theosmium
namespace while keeping backwards compatibility. - An error is now thrown when the deprecated
pbf_add_metadata
file format option is used. Useadd_metadata
instead. - Extended the
add_metadata
file format option. In addition to allowing the valuestrue
,yes
,false
, andno
, the new valuesall
andnone
are now recognized. The option can also be set to a list of attributes separated by the+
sign. Attributes areversion
,timestamp
,changeset
,uid
, anduser
. All output formats have been updated to only output the specified attributes. This is based on the newosmium::metadata_options
class which stores information about what metadata anOSMObject
has or should have. (Thanks to Michael Reichert.) - The
<
(less than) operator onOSMObject
s now ignores the case when one or both of the timestamps on the objects are not set at all. This allows better handling of OSM data files with reduced metadata. - Allow
version = -1
andchangeset = -1
in PBF input. This value is sometimes used by other programs to denote "no value". Osmium uses the0
for this. - The example programs using the
getopt_long
function have been rewritten to work without it. This makes using libosmium on Windows easier, where this function is not available. - Removed the embedded protozero from repository. Like other dependencies you have to install protozero first. If you check out the protozero repository in the same directory where you checked out libosmium, libosmium's CMake will find it.
- Various code cleanups, fixing of include order, etc.
- Remove need for
winsock2
library in Windows by using code from Protozero. (Thanks alex85k.) - Add MSYS2 build to Appveyor and fixed some Windows compile issues. (Thanks to alex85k.)
- Use array instead of map to store input/output format creators.
- Update included
catch.hpp
to version 1.12.1.
- Remove check for lost ways in multipolygon assembler. This rules out too many valid multipolygons, more specifically more complex ones with touching inner rings.
- Use different macro magic for registering index maps. This allows the maps to be used for several types at the same time.
- Lots of code was rewritten to fix warnings reported by
clang-tidy
making libosmium more robust. - Make ADL work for
begin()
/end()
ofInputIterator<Reader>
. - Various fixes to make the code more robust, including an undefined behaviour in the debug output format and a buffer overflow in the o5m parser.
- Range checks in o5m parser throw exceptions now instead of triggering assertions.
- Better checking that PBF data is in range.
- Check
read
andwrite
system calls forEINTR
. - Use tag and type from protozero to make PBF parser more robust.
- Test
testdata-multipolygon
on Windows was using the wrong executable name.
2.13.1 - 2017-08-25
- New "blackhole" file format which throws away all data written into it. Used for benchmarking.
- When reading OPL files, CRLF file endings are now handled correctly.
- Reduce the max number of threads allowed for the
Pool
to 32. This should still be plenty and might help with test failures on some architectures.
- Tests now run correctly independent of git
core.autocrlf
setting. - Set binary mode for all files on Windows in example code.
- Low-level file functions now set an invalid parameter handler on Windows to properly handle errors.
- Restore earlier behaviour allowing zero-length mmap. It is important to allow zero-length memory mapping, because it is possible that such an index is empty, for instance when one type of object is missing from an input file as in osmcode/osmium-tool#65. Drawback is that files must be opened read-write for this to work, even if we only want to read from them.
- Use Approx() to compare floating point values in tests.
- Fix broken
Item
test on 32 bit platforms.
2.13.0 - 2017-08-15
- New
RelationsManager
class superseeds therelations::Collector
class. The new class is much more modular and easier to extend. If you are using the Collector class, you are encouraged to switch. - New
MultipolygonManager
based on theRelationsManager
class superseeds theMultipolygonCollector
class. The examples have been changed to use the new class and all users are encouraged to switch. There is also aMultipolygonManagerLegacy
class if you still need old-style multipolygon support (see below). - New
FlexMem
index class that works with input files of any size and stores the index in memory. This should now be used as the default index for node location stores. Several example programs now use this index. - New
CallbackBuffer
class, basically a convenient wrapper around theBuffer
class with an additional callback function that is called whenever the buffer is full. - Introduce new
ItemStash
class for storing OSM objects in memory. - New
osmium::geom::overlaps()
function to check if twoBox
objects overlap. - Add function
IdSet::used_memory()
to get estimate of memory used in the set. - New
is_defined()
andis_undefined()
methods onLocation
class. - Tests for all provided example programs. (Some tests currently fail
on Windows for the
osmium_index_lookup
program.)
- The area
Assembler
now doesn't work with old-style multipolygons (those are multipolygon relations with the tags on the outer ways(s) instead of on the relation) any more. Because old-style multipolygons are now (mostly) gone from the OSM database this is usually what you want. The newAssemblerLegacy
class can be used if you actually need support for old-style multipolygons, for instance if you are working with historical data. (In that case you also need to use theMultipolygonManagerLegacy
class instead of theMultipolygonManager
class.) - Changes for consistent ordering of OSM data: OSM data can come in any order, but usual OSM files are ordered by type, ID, and version. These changes extend this ordering to negative IDs which are sometimes used for objects that have not been uploaded to the OSM server yet. The negative IDs are ordered now before the positive ones, both in order of their absolute value. This is the same ordering as JOSM uses.
- Multipolygon assembler now checks for three or more overlapping segments which are always an error and can report them.
- Enable use of user-provided
thread::Pool
instances inReader
andWriter
for special use cases. - Growing a
Buffer
will now work with any capacity parameter, it is always rounded up for proper alignment. Buffer constructor with three arguments will now check that commmitted is not larger than capacity. - Updated embedded protozero to 1.5.2.
- Update version of Catch unit test framework to 1.9.7.
- And, as always, lots of small code cleanups and more tests.
- Buffers larger than 2^32 bytes do now work.
- Output coordinate with value of -2^31 correctly.
- Changeset comments with more than 2^16 characters are now allowed. The new maximum size is 2^32.
ChangesetDiscussionBuilder::add_comment_text()
could fail silently instead of throwing an exception.- Changeset bounding boxes are now always output to OSM files (any format) if at least one of the corners is defined. This is needed to handle broken data from the main OSM database which contains such cases. The OPL reader has also been fixed to handle this case.
- In the example
osmium_location_cache_create
, the index file written is always truncated first.
2.12.2 - 2017-05-03
- Add two argument (key, value) overload of
TagMatcher::operator()
.
- Detect, report, and remove duplicate ways in multipolygon relations.
- Change EOF behaviour of Reader: The
Reader::read()
function will now always return an invalid buffer exactly once to signal EOF. - Update QGIS multipolygon project that is part of the test suite to show more problem types.
- Copy multipolygon QGIS file for tests to build dir in cmake step.
- Some code cleanups and improved debug output in multipolygon code.
- Refactor I/O code to simplify code.
- Disable some warnings on MSVC.
- Various small code and build script changes.
- Two bugs in area assembler affecting very complex multipolygons and multipolygons with overlapping or nearly overlapping lines.
- Invalid use of iterators leading to undefined behaviour in area assembler code.
- Area assembler stats were not correctly counting inner rings that are areas in their own right.
- Fix a thread problem valgrind found that might or might not be real.
- Read OPL file correctly even if trailing newline in file is missing.
- Include order for
osmium/index/map
headers andosmium/index/node_locations_map.hpp
(orosmium/handler/node_locations_for_ways.hpp
) doesn't matter any more.
2.12.1 - 2017-04-10
- New
TagsFilter::set_default_result()
function.
- Use larger capacity for
Buffer
if necessary for alignment instead of throwing an exception. Minimum buffer size is now 64 bytes. - Check order of input data in relations collector. The relations collector can not deal with history data or a changes file. This was documented as a requirement, but often lead to problems, because this was ignored by users. So it now checks that the input data it gets is ordered and throws an exception otherwise.
- When writing an OSM file, set generator to libosmium if not set by app.
- Infinite loop in
Buffer::reserve_space()
. (Issue #202.) ObjectPointerCollection::unique()
now removes elements at end.- Tests comparing double using
==
operator. - Build on Cygwin.
2.12.0 - 2017-03-07
TagMatcher
andTagsFilter
classes for more flexibly matching tags and selecting objects based on tags. This obsoletes the less flexible classes based onosmium::tags::Filter
classes.- Extended
index::RelationsMap(Stash|Index)
classes to also allow parent-to-member lookups. - New
nrw_array
helper class. ObjectPointerCollection::unique()
function.
- Area assembler can now detect invalid locations and report them in the
stats and through the problem reporter. If the new config option
ignore_invalid_locations
is set, the Assembler will pretend they weren't even referenced in the ways. (Issue #195.) osmium::area::Assembler::operator()
will now return a boolean reporting whether building of the area(s) was successful.- Split up area
Assembler
class into three classes: Thedetail::BasicAssembler
is now the parent class.Assembler
is the child class for usual use. The newGeomAssembler
also derives fromBasicAssembler
and builds areas without taking tags into account at all. This is to support osm2pgsql which does tag handling itself. (Issue #194.) - The
Projection
class can do any projection supported by the Proj.4 library. As a special case it now uses our own Mercator projection functions when the web mercator projection (EPSG 3857) is used. This is much faster than going through Proj.4. - Better error messages for low-level file utility functions.
- Mark
build_tag_list*
functions inbuilder_helper.hpp
as deprecated. You should use the functions fromosmium/builder/attr.hpp
instead. - Improved performance of the
osmium::tags::match_(any|all|none)_of
functions. - Improved performance of string comparison in
tags::Filter
. - Update version of Catch unit test framework to 1.8.1. This meant some tests had to be updated.
- Use
get_noexcept()
inNodeLocationsForWays
handler. - And lots of code and test cleanups...
- Terminate called on full non-auto-growing buffer. (Issue #189.)
- When file formats were used that were not compiled into the binary, it terminated instead of throwing. (Issue #197.)
- Windows build problem related to including two different winsock versions.
- Windows build problem related to forced build for old Windows versions. (Issue #196.)
- Clear stream contents in ProblemReporterException correctly.
- Add
-pthread
compiler and linker options on Linux/OSX. This should fix a problem where some linker versions will not link binaries correctly when the--as-needed
option is used. - The
Filter::count()
method didn't compile at all. - XML reader doesn't fail on relation member ref=0 any more.
2.11.0 - 2017-01-14
- New index::RelationsMap(Stash|Index) classes implementing an index for looking up parent relation IDs given a member relation ID.
- Add
get_noexcept()
method to all index maps. For cases where ids are often not in the index using this can speed up a program considerably. - New non-const WayNodeList::operator[].
- Default constructed "invalid" Coordinates.
- Tile constructor from web mercator coordinates and some helper functions for tile arithmetic.
- Tag matcher matching keys using a regex.
- New
envelope()
functions onNodeRefList
,Way
, andArea
returning aBox
object with the geometric envelope of the object. - Add
amenity_list
example.
- Replaced the implementation for the web mercator projection using the usual
tan-formula with a polynomial approximation which is much faster and good
enough for OSM data which only has ~1cm resolution anyway. See
https://github.com/osmcode/mercator-projection for all the details and
benchmarks. You can disable this by defining the macro
OSMIUM_USE_SLOW_MERCATOR_PROJECTION
before including any of the Osmium headers. - Removed the outdated
Makefile
. Always use CMake directly to build. - Refactoring of
osmium::apply()
removing the resursive templates for faster compile times and allowing rvalue handlers. - Lots of code and test cleanups and more documentation.
- Handle endianess on FreeBSD properly.
- Fixed doxygen config for reproducible builds.
2.10.3 - 2016-11-20
- Round out ObjectPointerCollection implementation and test it.
- Updated embedded protozero to 1.4.5.
2.10.2 - 2016-11-16
- Updated embedded protozero to 1.4.4.
- Buffer overflow in osmium::Buffer.
2.10.1 - 2016-11-15
- Updated embedded protozero to 1.4.3.
- Made IdSet work on 32bit systems.
- Fixed endianness check for WKB tests.
2.10.0 - 2016-11-11
- The
Reader
can take an additional optionalread_meta
flag. If this is set to false the PBF input will ignore metadata on OSM objects (like version, timestamp, uid, ...) which speeds up file reading by 10 to 20%. - New
IdSet
virtual class with two implementations:IdSetDense
andIdSetSmall
. Used to efficiently store a set of Ids. This is often needed to track, for instance, which nodes are needed for ways, etc. - Added more examples and better documented existing examples.
- Add a benchmark "mercator" converting all node locations in a file to WebMercator and creating geometries in WKB format.
- Better queue handling makes I/O faster in some circumstances.
- The
FindOsmium.cmake
CMake script can now check a current enough libosmium version is found. - Builders can now be constructed with a reference to parent builder.
- Made builders more robust by adding asserts that will catch common usage problems.
- Calling
OSMObjectBuilder::add_user()
is now optional, and the method was renamed toset_user()
. (add_user()
is marked as deprecated.) - Benchmarks now show compiler and compiler options used.
Builder::add_item()
now takes a reference instead of pointer (old version of the function marked as deprecated).- GEOS support is deprecated. It does not work any more for GEOS 3.6 or newer. Reason is the changed interface in GEOS 3.6. If there is interest for the GEOS support, we can add support back in later (but probably using the GEOS C API which is more stable than the C++ API). Some tests using GEOS were rewritten to work without it.
- The
BoolVector
has been deprecated in favour of the newIdSet
classes. - Lots of code cleanups and improved API documentation in many places.
- The relations collector can now tell you whether a relation member was in
the input data. See the new
is_available()
andget_availability_and_offset()
methods. - Updated embedded Catch unit test header to version 1.5.8.
- Parsing of coordinates starting with decimal dot and coordinates in scientific notation.
~
operator forentity_bits
doesn't set unused bits any more.- Progress bar can now be (temporarily) removed, to allow other output.
2.9.0 - 2016-09-15
- Support for reading OPL files.
- For diff output OSM objects in buffers can be marked as only in one or the other file. The OPL and debug output formats support diff output based on this.
- Add documentation and range checks to
Tile
struct. - More documentation.
- More examples and more extensive comments on examples.
- Support for a progress report in
osmium::io::Reader()
and aProgressBar
utility class to use it. - New
OSMObject::set_timestamp(const char*)
function.
- Parse coordinates in scientific notations ourselves.
- Updated included protozero version to 1.4.2.
- Lots of one-argument constructors are now explicit.
- Timestamp parser now uses our own implementation instead of strptime. This is faster and independant of locale settings.
- More cases of invalid areas with duplicate segments are reported as errors.
- Fixed a problem limiting cache file sizes on Windows to 32 bit.
- Fixed includes.
- Exception messages for invalid areas do not report "area contains no rings" any more, but "invalid area".
2.8.0 - 2016-08-04
- EWKT support.
- Track
pop
type calls and queue underruns whenOSMIUM_DEBUG_QUEUE_SIZE
environment variable is set.
- Switched to newest protozero v1.4.0. This should deliver some speedups when parsing PBF files. This also removes the DeltaEncodeIterator class, which isn't needed any more.
- Uses
std::unordered_map
instead ofstd::map
in PBF string table code speeding up writing of PBF files considerably. - Uses less memory when writing PBF files (smaller string table by default).
- Removes dependency on sparsehash and boost program options libraries for examples.
- Cleaned up threaded queue code.
- A potentially very bad bug was fixed: When there are many and/or long strings in tag keys and values and/or user names and/or relation roles, the string table inside a PBF block would overflow. I have never seen this happen for normal OSM data, but that doesn't mean it can't happen. The result is that the strings will all be mixed up, keys for values, values for user names or whatever.
- Automatically set correct SRID when creating WKB and GEOS geometries. Note that this changes the behaviour of libosmium when creating GEOS geometries. Before we created them with -1 as SRID unless set otherwise. Manual setting of the SRID on the GEOSGeometryFactory is now deprecated.
- Allow coordinates of nodes in scientific notation when reading XML files. This shouldn't be used really, but sometimes you can find them.
2.7.2 - 2016-06-08
- Much faster output of OSM files in XML, OPL, or debug formats.
- Parsing and output of coordinates now faster and always uses decimal dot independant of locale setting.
- Do not output empty discussion elements in changeset XML output.
- Data corruption regression in mmap based indexes.
2.7.1 - 2016-06-01
- Update version number in version.hpp.
2.7.0 - 2016-06-01
- New functions for iterating over specific item types in buffers
(
osmium::memory::Buffer::select()
), over specific subitems (osmium::OSMObject::subitems()
), and for iterating over all rings of an area (osmium::Areas::outer_rings()
,inner_rings()
). - Debug output optionally prints CRC32 when
add_crc32
file option is set.
- XML parser will not allow any XML entities which are usually not used in OSM files anyway. This can help avoiding DOS attacks.
- Removed SortedQueue implementation which was never used.
- Also incorporate Locations in NodeRefs into CRC32 checksums. This means all checksums will be different compared to earlier versions of libosmium.
- The completely new algorithm for assembling multipolygons is much faster, has better error reporting, generates statistics and can build more complex multipolygons correctly. The ProblemReporter classes have changed to make this happen, if you have written your own, you have to fix it.
- Sparse node location stores are now only sorted if needed, ie. when nodes come in unordered.
- Output operator for Location shows full precision.
- Undefined behaviour in WKB writer and
types_from_string()
function. - Fix unsigned overflow in pool.hpp.
- OSM objects are now ordered by type (nodes, then ways, then relations), then ID, then version, then timestamp. Ordering by timestamp is normally not necessary, because there can't be two objects with same type, ID, and version but different timestamp. But this can happen when diffs are created from OSM extracts, so we check for this here. This change also makes sure IDs are always ordered by absolute IDs, positives first, so order is 0, 1, -1, 2, -2, ...
- Data corruption bug fixed in disk based indexes (used for the node location store for instance). This only affected you, if you created and index, closed it, and re-opened it (possibly in a different process) and if there were missing nodes. If you looked up those nodes, you got location (0,0) back instead of an error.
- Memory corruption bug showing up with GDAL 2.
2.6.1 - 2016-02-22
- Add
WITH_PROFILING
option to CMake config. When enabled, this sets the-fno-omit-frame-pointer
compiler option.
- Massive speed improvements when building multipolygons.
- Uses (and includes) new version 1.3.0 of protozero library.
- Removed dependency on Boost Iterator for PBF writer.
- Example program
osmium_area_test
now usescerr
instead ofcout
for debug output.
2.6.0 - 2016-02-04
- The new handler osmium::handler::CheckOrder can be used to check that a file is properly ordered.
- Add new method to build OSM nodes, ways, relations, changesets, and areas
in buffers that wraps the older Builder classes. The new code is much easier
to use and very flexible. There is no documentation yet, but the tests in
test/t/builder/test_attr.cpp
can give you an idea how it works. - Add util class to get memory usage of current process on Linux.
- New Buffer memory management speeds up Buffer use, because it doesn't clear the memory unnecessarily.
- osmium::Box::extend() function now ignores invalid locations.
- Install of external library headers.
- Check way has at least one node before calling
is_closed()
in area assembler. - Declaration/definition of some friend functions was in the wrong namespace.
2.5.4 - 2015-12-03
- Included gdalcpp.hpp header was updated to version 1.1.1.
- Included protozero library was updated to version 1.2.3.
- Workarounds for missing constexpr support in Visual Studio removed. All constexpr features we need are supported now.
- Some code cleanup after running clang-tidy on the code.
- Re-added
Buffer::value_type
typedef. Turns out it is needed when usingstd::back_inserter
on the Buffer.
- Bugs with Timestamp code on 32 bit platforms. This necessitated some changes in Timestamp which might lead to changes in user code.
- Bug in segment intersection code (which appeared on i686 platform).
2.5.3 - 2015-11-17
osmium::make_diff_iterator()
helper function.
- Deprecated
osmium::Buffer::set_full_callback()
. - Removed DataFile class which was never used anywhere.
- Removed unused and obscure
Buffer::value_type
typedef.
- Possible overrun in Buffer when using the full-callback.
- Incorrect swapping of Buffer.
2.5.2 - 2015-11-06
- Writing data through an OutputIterator was extremly slow due to lock contention.
2.5.1 - 2015-11-05
- Header
osmium/fwd.hpp
with forward declarations of the most commonly used Osmium classes.
- Moved
osmium/io/overwrite.hpp
toosmium/io/writer_options.hpp
If you still include the old file, you'll get a warning.
2.5.0 - 2015-11-04
- Helper functions to make input iterator ranges and output iterators.
- Add support for reading o5m and o5c files.
- Option for osmium::io::Writer to fsync file after writing.
- Lots of internal asserts() and other robustness checks.
- Updated included protozero library to version 1.2.0.
- Complete overhaul of the I/O system making it much more robust against wrong data and failures during I/O operations.
- Speed up PBF writing by running parts of it in parallel.
- OutputIterator doesn't hold an internal buffer any more, but it uses one in Writer. Calling flush() on the OutputIterator isn't needed any more.
- Reader now throws when trying to read after eof or an error.
- I/O functions that used to throw
std::runtime_error
now throwosmium::io_error
or derived. - Optional parameters on
osmium::io::Writer
now work in any order.
- PBF reader now decodes locations of invisible nodes properly.
- Invalid Delta encode iterator dereference.
- Lots of includes fixed to include (only) what's used.
- Dangling reference in area assembly code.
2.4.1 - 2015-08-29
- CRC calculation of tags and changesets.
2.4.0 - 2015-08-29
- Checks that user names, member roles and tag keys and values are not longer than 256 * 4 bytes. That is the maximum length 256 Unicode characters can have in UTF-8 encoding.
- Support for GDAL 2. GDAL 1 still works.
- Improved CMake build scripts.
- Updated internal version of Protozero to 1.1.0.
- Removed
toogr*
examples. They are in their own repository now. See https://github.com/osmcode/osm-gis-export. - Files about to be memory-mapped (for instance index files) are now set to binary mode on Windows so the application doesn't have to do this.
- Hanging program when trying to open file with an unknown file format.
- Building problems with old boost versions.
- Initialization errors in PBF writer.
- Bug in byte swap code.
- Output on Windows now always uses binary mode, even when writing to stdout, so OSM xml and opl files always use LF line endings.
2.3.0 - 2015-08-18
- Allow instantiating osmium::geom::GEOSFactory with existing GEOS factory.
- Low-level functions to support generating a architecture- and endian- independant CRC from OSM data. This is intended to be uses with boost::crc.
- Add new debug output format. This format is not intended to be read automatically, but for human consumption. It formats the data nicely.
- Make writing of metadata configurable for XML and OPL output (use
add_metadata=false
as file option).
- Changed
add_user()
andadd_role()
in builders to use string length without the 0-termination. - Improved code setting file format from suffix/format argument.
- Memory mapping utility class now supports readonly, private writable or shared writable operation.
- Allow empty version (0) in PBF files.
- Use utf8cpp header-only lib instead of boost for utf8 decoding. The library is included in the libosmium distribution.
- New PBF reader and writer based on the protozero. A complete rewrite of the code for reading and writing OSM PBF files. It doesn't use the Google protobuf library and it doesn't use the OSMPBF/OSM-Binary library any more. Instead is uses the protozero lightweight protobuf header library which is included in the code. Not only does the new code have less dependencies, it is faster and more robust. https://github.com/mapbox/protozero
- Various smaller bug fixes.
- Add encoding for relation member roles in OPL format.
- Change character encoding to new format in OPL: variable length hex code between % characters instead of a % followed by 4-digit hex code. This is necessary because unicode characters can be longer than the 4-digit hex code.
- XML writer: The linefeed, carriage return, and tab characters are now escaped properly.
- Reading large XML files could block.
2.2.0 - 2015-07-04
- Conversion functions for some low-level types.
- BoolVector index class.
min_op
/max_op
utility functions.- More tests here and there.
- Helper methods
is_between()
andis_visible_at()
to DiffObject. - GeoJSON factory using the RapidJSON library.
- Support for tile calculations.
- Create simple polygons from ways in geom factories.
MemoryMapping
andTypedMemoryMapping
helper classes.close()
function tommap_vector_base
class.- Function on
Buffer
class to get iterator to specific offset. - Explicit cast operator from
osmium::Timestamp
touint32_t
.
- Throw exception on illegal values in functions parsing strings to get ids, versions, etc.
- Improved error message for geometry exceptions.
- Throw exception from
dump_as_array()
anddump_as_list()
functions if not implemented in an index. - After writing OSM files, program could stall up to a second.
- Dense location store was written out only partially.
- Use
uint64_t
as counter in benchmarks, so there can be no overflows. - Example programs now read packed XML files, too.
- Refactoring of memory mapping code. Removes leak on Windows.
- Better check for invalid locations.
- Mark
cbegin()
andcend()
ofmmap_vector_base
as const functions.
2.1.0 - 2015-03-31
- When writing PBF files, sorting the PBF stringtables is now optional.
- More tests and documentation.
- Some functions are now declared
noexcept
. - XML parser fails now if the top-level element is not
osm
orosmChange
.
- Race condition in PBF reader.
- Multipolygon collector was accessing non-existent NodeRef.
- Doxygen documentation wan't showing all classes/functions due to a bug in Doxygen (up to version 1.8.8). This version contains a workaround to fix this.