#include "catch.hpp" #include <sstream> #include <osmium/osm/timestamp.hpp> TEST_CASE("Timestamp") { SECTION("can be default initialized to invalid value") { osmium::Timestamp t; REQUIRE(0 == uint32_t(t)); REQUIRE("" == t.to_iso()); REQUIRE_FALSE(t.valid()); } SECTION("invalid value is zero") { osmium::Timestamp t(static_cast<time_t>(0)); REQUIRE(0 == uint32_t(t)); REQUIRE("" == t.to_iso()); REQUIRE_FALSE(t.valid()); } SECTION("can be initialized from time_t") { osmium::Timestamp t(static_cast<time_t>(1)); REQUIRE(1 == uint32_t(t)); REQUIRE("1970-01-01T00:00:01Z" == t.to_iso()); REQUIRE(t.valid()); } SECTION("can be initialized from const char*") { osmium::Timestamp t("2000-01-01T00:00:00Z");
void write_field_timestamp(char c, const osmium::Timestamp& timestamp) { *m_out += c; *m_out += timestamp.to_iso(); }
OGREnvelope extract( Options& options, osmium::geom::OGRFactory<osmium::geom::Projection>& factory, osmium::memory::Buffer::t_iterator<osmium::OSMObject> begin, osmium::memory::Buffer::t_iterator<osmium::OSMObject> relations, osmium::memory::Buffer::t_iterator<osmium::OSMObject> end, osmium::Timestamp point_in_time) { options.vout << "Working on " << point_in_time << "...\n"; options.vout << " Filtering data...\n"; // nodes and ways using diff_iterator = osmium::DiffIterator<osmium::memory::Buffer::t_iterator<osmium::OSMObject>>; osmium::memory::Buffer fbuffer{initial_buffer_size, osmium::memory::Buffer::auto_grow::yes}; { const diff_iterator dbegin{begin, relations}; const diff_iterator dend{relations, relations}; std::for_each(dbegin, dend, [point_in_time, &fbuffer](const osmium::DiffObject& d) { if (d.is_visible_at(point_in_time)) { fbuffer.add_item(d.curr()); fbuffer.commit(); } }); } options.vout << " Done. Filtered data needs " << (fbuffer.committed() / (1024 * 1024)) << " MBytes.\n"; // relations osmium::memory::Buffer rbuffer(initial_buffer_size, osmium::memory::Buffer::auto_grow::yes); { const diff_iterator dbegin{relations, end}; const diff_iterator dend{end, end}; std::for_each(dbegin, dend, [point_in_time, &rbuffer](const osmium::DiffObject& d) { if (d.is_visible_at(point_in_time)) { rbuffer.add_item(d.curr()); rbuffer.commit(); } }); } osmium::area::AssemblerLegacy::config_type assembler_config; osmium::area::MultipolygonManagerLegacy<osmium::area::AssemblerLegacy> mp_manager{assembler_config}; options.vout << " Reading relations...\n"; osmium::apply(rbuffer, mp_manager); mp_manager.prepare_for_lookup(); index_type index_pos; location_handler_type location_handler(index_pos); location_handler.ignore_errors(); options.vout << " Creating geometries...\n"; const std::string date = point_in_time.to_iso().substr(0, 10); std::vector<std::string> datasource_options; std::string datasource_name{options.output_directory + "/" + date}; if (options.output_format == "GeoJSON") { datasource_name += ".json"; } else if (options.output_format == "SQLite") { datasource_name += ".db"; datasource_options.push_back("SPATIALITE=TRUE"); CPLSetConfigOption("OGR_SQLITE_SYNCHRONOUS", "FALSE"); CPLSetConfigOption("OGR_SQLITE_CACHE", "512"); } gdalcpp::Dataset dataset{options.output_format, datasource_name, gdalcpp::SRS{factory.proj_string()}, datasource_options}; #ifdef HANDLER HANDLER geom_handler{factory, dataset, date}; #else BuildingsHandler geom_handler{factory, dataset, date}; #endif osmium::apply(fbuffer.begin(), fbuffer.end(), location_handler, geom_handler, mp_manager.handler([&geom_handler](const osmium::memory::Buffer& buffer) { osmium::apply(buffer, geom_handler); })); return geom_handler.envelope(); }