diff --git a/WORKSPACE b/WORKSPACE index 3ba69c91..0ecff6a5 100644 --- a/WORKSPACE +++ b/WORKSPACE @@ -560,3 +560,26 @@ http_archive( build_file = "//third_party:BUILD.zip_file", integrity = "sha256-K+KFNzufwccL4vEJLErEtNKNVjnWStClXVF2mKpI6lI=" ) + +http_archive( + name = "libosmium", + urls = ["https://github.com/osmcode/libosmium/archive/refs/tags/v2.20.0.zip"], + build_file = "//third_party:BUILD.libosmium", + strip_prefix = "libosmium-2.20.0", + integrity = "sha256-cS7BoPRNtinhyvatqlM2kV9CPLD2ZJFC14I5i1p1x3k=", +) + +http_archive( + name = "protozero", + urls = ["https://github.com/mapbox/protozero/archive/refs/tags/v1.7.1.zip"], + build_file = "//third_party:BUILD.protozero", + strip_prefix = "protozero-1.7.1", + +) + +http_archive( + name = "openstreetmap_snippet", + urls = ["https://www.dropbox.com/scl/fi/ku5dwktiul0wzx9ocelwc/us-virgin-islands-latest.osm.zip?rlkey=ggo7dnskexdqxvira6m6y32f3&dl=1"], + build_file = "//third_party:BUILD.zip_file", + integrity = "sha256-miPvL6co2035EGlkvbcksmTO6HwB/AknVLQK+/YDet0=" +) diff --git a/common/openstreetmap/BUILD b/common/openstreetmap/BUILD new file mode 100644 index 00000000..43f068b5 --- /dev/null +++ b/common/openstreetmap/BUILD @@ -0,0 +1,11 @@ + +cc_test( + name = "openstreetmap_test", + srcs = ["openstreetmap_test.cc"], + data = ["@openstreetmap_snippet//:files"], + deps = [ + "@fmt", + "@libosmium", + "@com_google_googletest//:gtest_main", + ] +) diff --git a/common/openstreetmap/openstreetmap_test.cc b/common/openstreetmap/openstreetmap_test.cc new file mode 100644 index 00000000..ab4127ca --- /dev/null +++ b/common/openstreetmap/openstreetmap_test.cc @@ -0,0 +1,44 @@ + +#include + +#include +#include + +#include "fmt/format.h" +#include "gtest/gtest.h" +#include "osmium/handler.hpp" +#include "osmium/handler/dump.hpp" +#include "osmium/io/pbf_input.hpp" +#include "osmium/visitor.hpp" + +namespace robot::openstreetmap { +TEST(OpenstreetmapTest, can_open_pbf_file) { + // Setup + struct TestHandler : public osmium::handler::Handler { + int node_counter = 0; + int way_counter = 0; + int relation_counter = 0; + + void node(const osmium::Node &node) { node_counter++; } + + void way(const osmium::Way &way) { way_counter++; } + + void relation(const osmium::Relation &relation) { relation_counter++; } + }; + const std::filesystem::path osm_pbf_path( + "external/openstreetmap_snippet/us-virgin-islands-latest.osm.pbf"); + osmium::io::Reader reader(osm_pbf_path, osmium::osm_entity_bits::node | + osmium::osm_entity_bits::way | + osmium::osm_entity_bits::relation); + + // Action + auto handler = TestHandler(); + osmium::apply(reader, handler); + + // Verification + EXPECT_GT(handler.node_counter, 0); + EXPECT_GT(handler.way_counter, 0); + EXPECT_GT(handler.relation_counter, 0); +} + +} // namespace robot::openstreetmap diff --git a/third_party/BUILD.libosmium b/third_party/BUILD.libosmium new file mode 100644 index 00000000..fcf30781 --- /dev/null +++ b/third_party/BUILD.libosmium @@ -0,0 +1,19 @@ + +cc_library( + name = "libosmium", + visibility = ["//visibility:public"], + hdrs = glob(["include/**/*.hpp"], + exclude = [ + "include/io/any_input.hpp", + "include/io/any_output.hpp", + "include/io/xml_input.hpp", + "include/io/xml_output.hpp" + ] + ), + strip_include_prefix="include", + deps = [ + "@protozero", + "@org_bzip_bzip2//:bz2lib", + "@zlib", + ] +) diff --git a/third_party/BUILD.protozero b/third_party/BUILD.protozero new file mode 100644 index 00000000..e2621c9f --- /dev/null +++ b/third_party/BUILD.protozero @@ -0,0 +1,26 @@ + +cc_library( + name = "protozero", + visibility = ["//visibility:public"], + hdrs = [ + "include/protozero/basic_pbf_builder.hpp", + "include/protozero/basic_pbf_writer.hpp", + "include/protozero/buffer_fixed.hpp", + "include/protozero/buffer_string.hpp", + "include/protozero/buffer_tmpl.hpp", + "include/protozero/buffer_vector.hpp", + "include/protozero/byteswap.hpp", + "include/protozero/config.hpp", + "include/protozero/data_view.hpp", + "include/protozero/exception.hpp", + "include/protozero/iterators.hpp", + "include/protozero/pbf_builder.hpp", + "include/protozero/pbf_message.hpp", + "include/protozero/pbf_reader.hpp", + "include/protozero/pbf_writer.hpp", + "include/protozero/types.hpp", + "include/protozero/varint.hpp", + "include/protozero/version.hpp", + ], + strip_include_prefix = "include", +)