From 38337d8a15e86e5b4338a33676ed38651893a328 Mon Sep 17 00:00:00 2001 From: Patrick Brosi Date: Thu, 9 Nov 2023 12:43:50 +0100 Subject: [PATCH 1/6] Delete tests for removed options --no-geom-relations (#59) --- tests/config/Config.cpp | 72 ----------------------------------------- 1 file changed, 72 deletions(-) diff --git a/tests/config/Config.cpp b/tests/config/Config.cpp index 291c2aa5..2747b73c 100644 --- a/tests/config/Config.cpp +++ b/tests/config/Config.cpp @@ -117,51 +117,6 @@ TEST(CONFIG_Config, fromArgsHelpLong) { "^Allowed options:"); } -// ____________________________________________________________________________ -TEST(CONFIG_Config, fromArgsHelpAdvancedShortMultiple) { - osm2rdf::config::Config config; - assertDefaultConfig(config); - - const auto arg = "-" + osm2rdf::config::constants::HELP_OPTION_SHORT; - const int argc = 3; - char* argv[argc] = {const_cast(""), const_cast(arg.c_str()), - const_cast(arg.c_str())}; - ::testing::FLAGS_gtest_death_test_style = "threadsafe"; - ASSERT_EXIT(config.fromArgs(argc, argv), - ::testing::ExitedWithCode(osm2rdf::config::ExitCode::SUCCESS), - osm2rdf::config::constants::NO_GEOM_RELATIONS_OPTION_HELP); -} - -// ____________________________________________________________________________ -TEST(CONFIG_Config, fromArgsHelpAdvancedShortCombined) { - osm2rdf::config::Config config; - assertDefaultConfig(config); - - const auto arg = "-" + osm2rdf::config::constants::HELP_OPTION_SHORT + - osm2rdf::config::constants::HELP_OPTION_SHORT; - const int argc = 2; - char* argv[argc] = {const_cast(""), const_cast(arg.c_str())}; - ::testing::FLAGS_gtest_death_test_style = "threadsafe"; - ASSERT_EXIT(config.fromArgs(argc, argv), - ::testing::ExitedWithCode(osm2rdf::config::ExitCode::SUCCESS), - osm2rdf::config::constants::NO_GEOM_RELATIONS_OPTION_HELP); -} - -// ____________________________________________________________________________ -TEST(CONFIG_Config, fromArgsHelpAdvancedLong) { - osm2rdf::config::Config config; - assertDefaultConfig(config); - - const auto arg = "--" + osm2rdf::config::constants::HELP_OPTION_LONG; - const int argc = 3; - char* argv[argc] = {const_cast(""), const_cast(arg.c_str()), - const_cast(arg.c_str())}; - ::testing::FLAGS_gtest_death_test_style = "threadsafe"; - ASSERT_EXIT(config.fromArgs(argc, argv), - ::testing::ExitedWithCode(osm2rdf::config::ExitCode::SUCCESS), - osm2rdf::config::constants::NO_GEOM_RELATIONS_OPTION_HELP); -} - // ____________________________________________________________________________ TEST(CONFIG_Config, fromArgsHelpExpertShortMultiple) { osm2rdf::config::Config config; @@ -397,22 +352,6 @@ TEST(CONFIG_Config, fromArgsNoFactsLong) { ASSERT_TRUE(config.noFacts); } -// ____________________________________________________________________________ -TEST(CONFIG_Config, fromArgsNoGeometricRelationsLong) { - osm2rdf::config::Config config; - assertDefaultConfig(config); - osm2rdf::util::CacheFile cf("/tmp/dummyInput"); - - const auto arg = - "--" + osm2rdf::config::constants::NO_GEOM_RELATIONS_OPTION_LONG; - const int argc = 3; - char* argv[argc] = {const_cast(""), const_cast(arg.c_str()), - const_cast("/tmp/dummyInput")}; - config.fromArgs(argc, argv); - ASSERT_EQ("", config.output.string()); - ASSERT_TRUE(config.noGeometricRelations); -} - // ____________________________________________________________________________ TEST(CONFIG_Config, fromArgsStoreLocationsOnDiskLongImplicit) { osm2rdf::config::Config config; @@ -1447,17 +1386,6 @@ TEST(CONFIG_Config, getInfoSkipWikiLinks) { osm2rdf::config::constants::SKIP_WIKI_LINKS_INFO)); } -// ____________________________________________________________________________ -TEST(CONFIG_Config, getInfoNoGeometricRelations) { - osm2rdf::config::Config config; - assertDefaultConfig(config); - config.noGeometricRelations = true; - - const std::string res = config.getInfo(""); - ASSERT_THAT(res, ::testing::HasSubstr( - osm2rdf::config::constants::NO_GEOM_RELATIONS_INFO)); -} - // ____________________________________________________________________________ TEST(CONFIG_Config, getInfoNoAreaGeomRelations) { osm2rdf::config::Config config; From ce51a225b69f479122bee2f2daead4548c639641 Mon Sep 17 00:00:00 2001 From: Axel Lehmann Date: Thu, 9 Nov 2023 13:07:39 +0100 Subject: [PATCH 2/6] Remove obsolete nodedata (#60) * Remove obsolete nodedata This reduces the memory footprint as better algorithmic solutions are now implemented and the (huge) lookup-table has now next to no benefit on speed but a huge memory penality. * Remove now obsolete branch and statistic value --- include/osm2rdf/osm/GeometryHandler.h | 11 +---- src/osm/GeometryHandler.cpp | 69 +++------------------------ tests/osm/GeometryHandler.cpp | 26 +++++----- 3 files changed, 19 insertions(+), 87 deletions(-) diff --git a/include/osm2rdf/osm/GeometryHandler.h b/include/osm2rdf/osm/GeometryHandler.h index d237f3a3..2102d158 100644 --- a/include/osm2rdf/osm/GeometryHandler.h +++ b/include/osm2rdf/osm/GeometryHandler.h @@ -57,7 +57,6 @@ struct GeomRelationStats { size_t _skippedByBoxIdIntersectCutout = 0; size_t _skippedByContainedInInnerRing = 0; size_t _skippedByBorderContained = 0; - size_t _skippedByNodeContained = 0; size_t _skippedByInner = 0; size_t _skippedByOuter = 0; size_t _skippedByBox = 0; @@ -79,7 +78,6 @@ struct GeomRelationStats { _skippedByOrientedBox += lh._skippedByOrientedBox; _skippedByConvexHull += lh._skippedByConvexHull; _skippedByBorderContained += lh._skippedByBorderContained; - _skippedByNodeContained += lh._skippedByNodeContained; return *this; } @@ -96,7 +94,6 @@ struct GeomRelationStats { void skippedByOrientedBox() { _skippedByOrientedBox++; } void skippedByConvexHull() { _skippedByConvexHull++; } void skippedByBorderContained() { _skippedByBorderContained++; } - void skippedByNodeContained() { _skippedByNodeContained++; } void fullCheck() { _fullChecks++; } [[nodiscard]] std::string printPercNum(size_t n) const { @@ -146,9 +143,6 @@ struct GeomRelationStats { [[nodiscard]] std::string printSkippedByOuter() const { return printPercNum(_skippedByOuter); } - [[nodiscard]] std::string printSkippedByNodeContained() const { - return printPercNum(_skippedByNodeContained); - } [[nodiscard]] std::string printFullChecks() const { return printPercNum(_fullChecks); } @@ -299,7 +293,7 @@ class GeometryHandler { FRIEND_TEST(OSM_GeometryHandler, dumpUnnamedAreaRelationsSimpleContainsOnly); // Calculate relations for each node. - NodesContainedInAreasData dumpNodeRelations(); + void dumpNodeRelations(); FRIEND_TEST(OSM_GeometryHandler, noNodeGeometricRelations); FRIEND_TEST(OSM_GeometryHandler, dumpNodeRelationsEmpty1); FRIEND_TEST(OSM_GeometryHandler, dumpNodeRelationsEmpty2); @@ -307,8 +301,7 @@ class GeometryHandler { FRIEND_TEST(OSM_GeometryHandler, dumpNodeRelationsSimpleContains); // Calculate relations for each way. - void dumpWayRelations( - const osm2rdf::osm::NodesContainedInAreasData& nodeData); + void dumpWayRelations(); FRIEND_TEST(OSM_GeometryHandler, noWayGeometricRelations); FRIEND_TEST(OSM_GeometryHandler, dumpWayRelationsEmpty1); FRIEND_TEST(OSM_GeometryHandler, dumpWayRelationsEmpty2); diff --git a/src/osm/GeometryHandler.cpp b/src/osm/GeometryHandler.cpp index 5de7430f..ec49a815 100644 --- a/src/osm/GeometryHandler.cpp +++ b/src/osm/GeometryHandler.cpp @@ -525,8 +525,8 @@ void GeometryHandler::calculateRelations() { prepareDAG(); dumpNamedAreaRelations(); dumpUnnamedAreaRelations(); - const auto& nodeData = dumpNodeRelations(); - dumpWayRelations(nodeData); + dumpNodeRelations(); + dumpWayRelations(); } // ____________________________________________________________________________ @@ -1134,10 +1134,8 @@ void GeometryHandler::dumpUnnamedAreaRelations() { // ____________________________________________________________________________ template -osm2rdf::osm::NodesContainedInAreasData -GeometryHandler::dumpNodeRelations() { +void GeometryHandler::dumpNodeRelations() { // Store for each node all relevant areas - NodesContainedInAreasData nodeData; if (_config.noNodeGeometricRelations) { std::cerr << std::endl; std::cerr << currentTimeFormatted() << " " @@ -1175,7 +1173,7 @@ GeometryHandler::dumpNodeRelations() { osm2rdf::ttl::constants::IRI__OSM2RDF_INTERSECTS_NON_AREA, \ osm2rdf::ttl::constants::IRI__OSM2RDF_INTERSECTS, \ osm2rdf::ttl::constants::IRI__OSM2RDF_CONTAINS, \ - osm2rdf::ttl::constants::IRI__OSM2RDF_INTERSECTS_AREA, nodeData, \ + osm2rdf::ttl::constants::IRI__OSM2RDF_INTERSECTS_AREA, \ progressBar, ia, entryCount) reduction(+ : stats) default(none) \ schedule(dynamic) for (size_t i = 0; i < _numNodes; i++) { @@ -1280,8 +1278,6 @@ GeometryHandler::dumpNodeRelations() { areaIRI, osm2rdf::ttl::constants::IRI__OPENGIS_CONTAINS, nodeIRI); } } -#pragma omp critical(nodeDataChange) - std::copy(skip.begin(), skip.end(), std::back_inserter(nodeData[nodeId])); #pragma omp critical(progress) progressBar.update(entryCount++); } @@ -1317,13 +1313,11 @@ GeometryHandler::dumpNodeRelations() { << (static_cast(stats._totalChecks) / _numWays) << " areas checked per geometry on average" << std::endl; } - return nodeData; } // ____________________________________________________________________________ template -void GeometryHandler::dumpWayRelations( - const NodesContainedInAreasData& nodeData) { +void GeometryHandler::dumpWayRelations() { if (_config.noWayGeometricRelations) { std::cerr << std::endl; std::cerr << currentTimeFormatted() << " " @@ -1351,7 +1345,7 @@ void GeometryHandler::dumpWayRelations( progressBar.update(entryCount); #pragma omp parallel for shared( \ std::cout, std::cerr, osm2rdf::ttl::constants::NAMESPACE__OSM_WAY, \ - nodeData, osm2rdf::ttl::constants::NAMESPACE__OSM_RELATION, \ + osm2rdf::ttl::constants::NAMESPACE__OSM_RELATION, \ osm2rdf::ttl::constants::IRI__OPENGIS_INTERSECTS, \ osm2rdf::ttl::constants::IRI__OSM2RDF_INTERSECTS_NON_AREA, \ osm2rdf::ttl::constants::IRI__OSM2RDF_INTERSECTS_AREA, \ @@ -1381,22 +1375,10 @@ void GeometryHandler::dumpWayRelations( std::string wayIRI = _writer->generateIRI(NAMESPACE__OSM_WAY, wayId); // Set containing all areas we are inside of - SkipSet skipNodeContained; SkipSet skipIntersects; SkipSet skipContains; std::unordered_set skipByContainedInInner; - // Store known areas in set. - for (const auto& nodeId : wayNodeIds) { - auto nodeDataIt = nodeData.find(nodeId); - if (nodeDataIt == nodeData.end()) { - continue; - } - - skipNodeContained.insert(nodeDataIt->second.begin(), - nodeDataIt->second.end()); - } - const auto& queryResult = indexQryIntersect(way); for (const auto& areaRef : queryResult) { @@ -1455,41 +1437,6 @@ void GeometryHandler::dumpWayRelations( _writer->writeTriple(wayIRI, IRI__OSM2RDF_INTERSECTS_AREA, areaIRI); } - if (_config.ogcGeoTriplesMode) { - if (_config.ogcGeoTriplesMode > 1) { - // transitive closure - writeTransitiveClosure(successors, wayIRI, - IRI__OPENGIS_INTERSECTS, - IRI__OPENGIS_INTERSECTS); - } - - _writer->writeTriple(areaIRI, IRI__OPENGIS_INTERSECTS, wayIRI); - _writer->writeTriple(wayIRI, IRI__OPENGIS_INTERSECTS, areaIRI); - } - } else if (skipNodeContained.find(areaId) != skipNodeContained.end()) { - intersectStats.skippedByNodeContained(); - geomRelInf.intersects = RelInfoValue::YES; - - const auto& successors = - _directedAreaGraph.findSuccessorsFast(areaId); - skipIntersects.insert(successors.begin(), successors.end()); - - std::string areaIRI = - _writer->generateIRI(areaNS(areaFromType), areaObjId); - - if (_config.osm2rdfGeoTriplesMode) { - if (_config.osm2rdfGeoTriplesMode > 1) { - // transitive closure - writeTransitiveClosure(successors, wayIRI, - IRI__OSM2RDF_INTERSECTS_NON_AREA, - IRI__OSM2RDF_INTERSECTS_AREA); - } - - _writer->writeTriple(areaIRI, IRI__OSM2RDF_INTERSECTS_NON_AREA, - wayIRI); - _writer->writeTriple(wayIRI, IRI__OSM2RDF_INTERSECTS_AREA, areaIRI); - } - if (_config.ogcGeoTriplesMode) { if (_config.ogcGeoTriplesMode > 1) { // transitive closure @@ -1606,10 +1553,6 @@ void GeometryHandler::dumpWayRelations( << intersectStats.printSkippedByBorderContained() << " because A was part of B's ring\n" << osm2rdf::util::formattedTimeSpacer << " " - << intersectStats.printSkippedByNodeContained() - << " because a node of A is in a " - "ring of B\n" - << osm2rdf::util::formattedTimeSpacer << " " << intersectStats.printSkippedByBox() << " by non-intersecting bounding boxes \n" << osm2rdf::util::formattedTimeSpacer << " " diff --git a/tests/osm/GeometryHandler.cpp b/tests/osm/GeometryHandler.cpp index 7350fcfc..68cd1f4b 100644 --- a/tests/osm/GeometryHandler.cpp +++ b/tests/osm/GeometryHandler.cpp @@ -1794,8 +1794,7 @@ TEST(OSM_GeometryHandler, dumpNodeRelationsSimpleIntersects) { gh.prepareRTree(); gh.prepareDAG(); - const auto nd = gh.dumpNodeRelations(); - ASSERT_EQ(1, nd.size()); + gh.dumpNodeRelations(); output.flush(); output.close(); @@ -1915,8 +1914,7 @@ TEST(OSM_GeometryHandler, dumpNodeRelationsSimpleContains) { gh.prepareRTree(); gh.prepareDAG(); - const auto nd = gh.dumpNodeRelations(); - ASSERT_EQ(1, nd.size()); + gh.dumpNodeRelations(); output.flush(); output.close(); @@ -1956,7 +1954,7 @@ TEST(OSM_GeometryHandler, noWayGeometricRelations) { gh.prepareRTree(); gh.prepareDAG(); - gh.dumpWayRelations(osm2rdf::osm::NodesContainedInAreasData{}); + gh.dumpWayRelations(); output.flush(); output.close(); @@ -1992,7 +1990,7 @@ TEST(OSM_GeometryHandler, dumpWayRelationsEmpty1) { gh.prepareRTree(); gh.prepareDAG(); - gh.dumpWayRelations(osm2rdf::osm::NodesContainedInAreasData{}); + gh.dumpWayRelations(); output.flush(); output.close(); @@ -2088,7 +2086,7 @@ TEST(OSM_GeometryHandler, dumpWayRelationsEmpty2) { gh.prepareRTree(); gh.prepareDAG(); - gh.dumpWayRelations(osm2rdf::osm::NodesContainedInAreasData{}); + gh.dumpWayRelations(); output.flush(); output.close(); @@ -2207,7 +2205,7 @@ TEST(OSM_GeometryHandler, dumpWayRelationsSimpleIntersects) { gh.prepareRTree(); gh.prepareDAG(); - gh.dumpWayRelations(osm2rdf::osm::NodesContainedInAreasData{}); + gh.dumpWayRelations(); output.flush(); output.close(); @@ -2331,7 +2329,7 @@ TEST(OSM_GeometryHandler, dumpWayRelationsSimpleContains) { gh.prepareRTree(); gh.prepareDAG(); - gh.dumpWayRelations(osm2rdf::osm::NodesContainedInAreasData{}); + gh.dumpWayRelations(); output.flush(); output.close(); @@ -2465,9 +2463,8 @@ TEST(OSM_GeometryHandler, dumpWayRelationsSimpleIntersectsWithNodeInfo) { gh.prepareRTree(); gh.prepareDAG(); - const auto nd = gh.dumpNodeRelations(); - ASSERT_EQ(2, nd.size()); - gh.dumpWayRelations(nd); + gh.dumpNodeRelations(); + gh.dumpWayRelations(); output.flush(); output.close(); @@ -2614,9 +2611,8 @@ TEST(OSM_GeometryHandler, dumpWayRelationsSimpleContainsWithNodeInfo) { gh.prepareRTree(); gh.prepareDAG(); - const auto nd = gh.dumpNodeRelations(); - ASSERT_EQ(1, nd.size()); - gh.dumpWayRelations(nd); + gh.dumpNodeRelations(); + gh.dumpWayRelations(); output.flush(); output.close(); From efc743168ccd9aad62a926666bd87261e63f9e37 Mon Sep 17 00:00:00 2001 From: Axel Lehmann Date: Thu, 9 Nov 2023 14:10:57 +0100 Subject: [PATCH 3/6] Area linestring remove (#54) * Do not store Ways which are Areas as LINESTRING geometries. * Add config to add LINESTRINGS for Ways which form areas * Add reference to libosmium * Restore Config.cpp format --- include/osm2rdf/config/Config.h | 1 + include/osm2rdf/config/Constants.h | 8 +++ include/osm2rdf/osm/Way.h | 1 + src/config/Config.cpp | 14 ++++- src/osm/FactHandler.cpp | 29 ++++++----- src/osm/Way.cpp | 18 +++++++ tests/E2E.cpp | 5 ++ tests/config/Config.cpp | 43 ++++++++++++--- tests/osm/FactHandler.cpp | 1 + tests/osm/Way.cpp | 84 ++++++++++++++++++++++++++++++ 10 files changed, 183 insertions(+), 21 deletions(-) diff --git a/include/osm2rdf/config/Config.h b/include/osm2rdf/config/Config.h index f18103b9..faeb05db 100644 --- a/include/osm2rdf/config/Config.h +++ b/include/osm2rdf/config/Config.h @@ -66,6 +66,7 @@ struct Config { bool addAreaConvexHull = false; bool addAreaEnvelope = false; bool addAreaOrientedBoundingBox = false; + bool addAreaWayLinestrings = false; bool addNodeConvexHull = false; bool addNodeEnvelope = false; bool addNodeOrientedBoundingBox = false; diff --git a/include/osm2rdf/config/Constants.h b/include/osm2rdf/config/Constants.h index 7cceb167..277e78ce 100644 --- a/include/osm2rdf/config/Constants.h +++ b/include/osm2rdf/config/Constants.h @@ -201,6 +201,14 @@ const static inline std::string ADD_AREA_ORIENTED_BOUNDING_BOX_OPTION_LONG = const static inline std::string ADD_AREA_ORIENTED_BOUNDING_BOX_OPTION_HELP = "Add oriented-bounding-box to areas"; +const static inline std::string ADD_AREA_WAY_LINESTRINGS_INFO = + "Adding linestrings for ways which form areas"; +const static inline std::string ADD_AREA_WAY_LINESTRINGS_OPTION_SHORT = ""; +const static inline std::string ADD_AREA_WAY_LINESTRINGS_OPTION_LONG = + "add-area-way-linestrings"; +const static inline std::string ADD_AREA_WAY_LINESTRINGS_OPTION_HELP = + "Add linestrings for ways which form areas"; + const static inline std::string HASGEOMETRY_AS_WKT_INFO = "Letting geo:hasGeometry point directly to WKT serialization literal"; const static inline std::string HASGEOMETRY_AS_WKT_OPTION_SHORT = ""; diff --git a/include/osm2rdf/osm/Way.h b/include/osm2rdf/osm/Way.h index 0491be6e..ba38e232 100644 --- a/include/osm2rdf/osm/Way.h +++ b/include/osm2rdf/osm/Way.h @@ -45,6 +45,7 @@ class Way { explicit Way(const osmium::Way& way); [[nodiscard]] id_t id() const noexcept; [[nodiscard]] bool closed() const noexcept; + [[nodiscard]] bool isArea() const noexcept; [[nodiscard]] const osm2rdf::geometry::Box& envelope() const noexcept; [[nodiscard]] const osm2rdf::geometry::Way& geom() const noexcept; // Return the convex hull. diff --git a/src/config/Config.cpp b/src/config/Config.cpp index 67dcd89e..2d6bfc1f 100644 --- a/src/config/Config.cpp +++ b/src/config/Config.cpp @@ -17,13 +17,14 @@ // You should have received a copy of the GNU General Public License // along with osm2rdf. If not, see . +#include "osm2rdf/config/Config.h" + #include #include #include #include "boost/version.hpp" #include "omp.h" -#include "osm2rdf/config/Config.h" #include "osm2rdf/config/Constants.h" #include "osm2rdf/config/ExitCode.h" #include "popl.hpp" @@ -150,6 +151,11 @@ std::string osm2rdf::config::Config::getInfo(std::string_view prefix) const { << prefix << osm2rdf::config::constants::ADD_WAY_NODE_SPATIAL_METADATA_INFO; } + if (addAreaWayLinestrings) { + oss << "\n" + << prefix + << osm2rdf::config::constants::ADD_AREA_WAY_LINESTRINGS_INFO; + } } if (simplifyWKT > 0) { oss << "\n" << prefix << osm2rdf::config::constants::SIMPLIFY_WKT_INFO; @@ -335,6 +341,11 @@ void osm2rdf::config::Config::fromArgs(int argc, char** argv) { osm2rdf::config::constants::ADD_AREA_ENVELOPE_RATIO_OPTION_SHORT, osm2rdf::config::constants::ADD_AREA_ENVELOPE_RATIO_OPTION_LONG, osm2rdf::config::constants::ADD_AREA_ENVELOPE_RATIO_OPTION_HELP); + auto addAreaWayLinestringsOp = + parser.add( + osm2rdf::config::constants::ADD_AREA_WAY_LINESTRINGS_OPTION_SHORT, + osm2rdf::config::constants::ADD_AREA_WAY_LINESTRINGS_OPTION_LONG, + osm2rdf::config::constants::ADD_AREA_WAY_LINESTRINGS_OPTION_HELP); auto addRelationBorderMembersOp = parser.add( osm2rdf::config::constants::ADD_RELATION_BORDER_MEMBERS_OPTION_SHORT, osm2rdf::config::constants::ADD_RELATION_BORDER_MEMBERS_OPTION_LONG, @@ -571,6 +582,7 @@ void osm2rdf::config::Config::fromArgs(int argc, char** argv) { addAreaEnvelope = addAreaEnvelopeOp->is_set(); addAreaEnvelopeRatio = addAreaEnvelopeRatioOp->is_set(); addAreaOrientedBoundingBox = addAreaOrientedBoundingBoxOp->is_set(); + addAreaWayLinestrings = addAreaWayLinestringsOp->is_set(); addRelationBorderMembers = addRelationBorderMembersOp->is_set(); #if BOOST_VERSION >= 107800 addRelationConvexHull = addRelationConvexHullOp->is_set(); diff --git a/src/osm/FactHandler.cpp b/src/osm/FactHandler.cpp index 698e3e4a..96017ab6 100644 --- a/src/osm/FactHandler.cpp +++ b/src/osm/FactHandler.cpp @@ -17,6 +17,8 @@ // You should have received a copy of the GNU General Public License // along with osm2rdf. If not, see . +#include "osm2rdf/osm/FactHandler.h" + #include #include @@ -25,7 +27,6 @@ #include "osm2rdf/config/Config.h" #include "osm2rdf/osm/Area.h" #include "osm2rdf/osm/Constants.h" -#include "osm2rdf/osm/FactHandler.h" #include "osm2rdf/osm/Node.h" #include "osm2rdf/osm/Relation.h" #include "osm2rdf/osm/Way.h" @@ -36,10 +37,10 @@ using osm2rdf::osm::constants::BASE_SIMPLIFICATION_FACTOR; using osm2rdf::ttl::constants::IRI__GEOSPARQL__AS_WKT; using osm2rdf::ttl::constants::IRI__GEOSPARQL__HAS_GEOMETRY; using osm2rdf::ttl::constants::IRI__GEOSPARQL__WKT_LITERAL; +using osm2rdf::ttl::constants::IRI__OSM2RDF__POS; using osm2rdf::ttl::constants::IRI__OSM2RDF_GEOM__CONVEX_HULL; using osm2rdf::ttl::constants::IRI__OSM2RDF_GEOM__ENVELOPE; using osm2rdf::ttl::constants::IRI__OSM2RDF_GEOM__OBB; -using osm2rdf::ttl::constants::IRI__OSM2RDF__POS; using osm2rdf::ttl::constants::IRI__OSM_NODE; using osm2rdf::ttl::constants::IRI__OSM_RELATION; using osm2rdf::ttl::constants::IRI__OSM_TAG; @@ -81,7 +82,7 @@ void osm2rdf::osm::FactHandler::area(const osm2rdf::osm::Area& area) { if (!_config.hasGeometryAsWkt) { const std::string& geomObj = _writer->generateIRI( NAMESPACE__OSM2RDF_GEOM, (area.fromWay() ? "wayarea_" : "relarea_") + - std::to_string(area.objId())); + std::to_string(area.objId())); _writer->writeTriple(subj, IRI__GEOSPARQL__HAS_GEOMETRY, geomObj); writeBoostGeometry(geomObj, IRI__GEOSPARQL__AS_WKT, area.geom()); @@ -96,7 +97,8 @@ void osm2rdf::osm::FactHandler::area(const osm2rdf::osm::Area& area) { writeBox(subj, IRI__OSM2RDF_GEOM__ENVELOPE, area.envelope()); } if (_config.addAreaOrientedBoundingBox) { - writeBoostGeometry(subj, IRI__OSM2RDF_GEOM__OBB, area.orientedBoundingBox()); + writeBoostGeometry(subj, IRI__OSM2RDF_GEOM__OBB, + area.orientedBoundingBox()); } if (_config.addSortMetadata) { @@ -146,7 +148,8 @@ void osm2rdf::osm::FactHandler::node(const osm2rdf::osm::Node& node) { writeBox(subj, IRI__OSM2RDF_GEOM__ENVELOPE, node.envelope()); } if (_config.addNodeOrientedBoundingBox) { - writeBoostGeometry(subj, IRI__OSM2RDF_GEOM__OBB, node.orientedBoundingBox()); + writeBoostGeometry(subj, IRI__OSM2RDF_GEOM__OBB, + node.orientedBoundingBox()); } } @@ -305,14 +308,16 @@ void osm2rdf::osm::FactHandler::way(const osm2rdf::osm::Way& way) { osm2rdf::geometry::Linestring locations{way.geom()}; size_t numUniquePoints = locations.size(); - if (!_config.hasGeometryAsWkt) { - const std::string& geomObj = _writer->generateIRI( - NAMESPACE__OSM2RDF, "way_" + std::to_string(way.id())); + if (_config.addAreaWayLinestrings || !way.isArea()) { + if (!_config.hasGeometryAsWkt) { + const std::string& geomObj = _writer->generateIRI( + NAMESPACE__OSM2RDF, "way_" + std::to_string(way.id())); - _writer->writeTriple(subj, IRI__GEOSPARQL__HAS_GEOMETRY, geomObj); - writeBoostGeometry(geomObj, IRI__GEOSPARQL__AS_WKT, locations); - } else { - writeBoostGeometry(subj, IRI__GEOSPARQL__HAS_GEOMETRY, locations); + _writer->writeTriple(subj, IRI__GEOSPARQL__HAS_GEOMETRY, geomObj); + writeBoostGeometry(geomObj, IRI__GEOSPARQL__AS_WKT, locations); + } else { + writeBoostGeometry(subj, IRI__GEOSPARQL__HAS_GEOMETRY, locations); + } } if (_config.addWayConvexHull) { diff --git a/src/osm/Way.cpp b/src/osm/Way.cpp index 8086e75c..6ec85b93 100644 --- a/src/osm/Way.cpp +++ b/src/osm/Way.cpp @@ -107,6 +107,24 @@ bool osm2rdf::osm::Way::closed() const noexcept { return boost::geometry::equals(_nodes.front().geom(), _nodes.back().geom()); } +// ____________________________________________________________________________ +bool osm2rdf::osm::Way::isArea() const noexcept { + // See libosmium/include/osmium/area/multipolygon_manager.hpp:154 + if (_nodes.size() < 4) { + return false; + } + if (!closed()) { + return false; + } + const auto& areaTag = _tags.find("area"); + if (areaTag != _tags.end()) { + if (areaTag->second == "no") { + return false; + } + } + return true; +} + // ____________________________________________________________________________ bool osm2rdf::osm::Way::operator==( const osm2rdf::osm::Way& other) const noexcept { diff --git a/tests/E2E.cpp b/tests/E2E.cpp index 8e16b947..0aae0c07 100644 --- a/tests/E2E.cpp +++ b/tests/E2E.cpp @@ -437,6 +437,7 @@ TEST(E2E, building51NT) { config.output = ""; config.hasGeometryAsWkt = true; config.outputCompress = false; + config.addAreaWayLinestrings = true; config.mergeOutput = osm2rdf::util::OutputMergeMode::NONE; // Create empty input file @@ -606,6 +607,7 @@ TEST(E2E, building51TTL) { config.output = ""; config.hasGeometryAsWkt = true; config.outputCompress = false; + config.addAreaWayLinestrings = true; config.mergeOutput = osm2rdf::util::OutputMergeMode::NONE; // Create empty input file @@ -744,6 +746,7 @@ TEST(E2E, building51QLEVER) { config.output = ""; config.hasGeometryAsWkt = true; config.outputCompress = false; + config.addAreaWayLinestrings = true; config.mergeOutput = osm2rdf::util::OutputMergeMode::NONE; // Create empty input file @@ -882,6 +885,7 @@ TEST(E2E, tf) { config.output = ""; config.hasGeometryAsWkt = true; config.outputCompress = false; + config.addAreaWayLinestrings = true; config.mergeOutput = osm2rdf::util::OutputMergeMode::NONE; // Create empty input file @@ -977,6 +981,7 @@ TEST(E2E, building51inTF) { config.output = ""; config.hasGeometryAsWkt = true; config.outputCompress = false; + config.addAreaWayLinestrings = true; config.mergeOutput = osm2rdf::util::OutputMergeMode::NONE; // Create empty input file diff --git a/tests/config/Config.cpp b/tests/config/Config.cpp index 2747b73c..d035cf92 100644 --- a/tests/config/Config.cpp +++ b/tests/config/Config.cpp @@ -46,6 +46,7 @@ void assertDefaultConfig(const osm2rdf::config::Config& config) { ASSERT_FALSE(config.addAreaEnvelope); ASSERT_FALSE(config.addAreaEnvelopeRatio); ASSERT_FALSE(config.addAreaOrientedBoundingBox); + ASSERT_FALSE(config.addAreaWayLinestrings); ASSERT_FALSE(config.addNodeConvexHull); ASSERT_FALSE(config.addNodeEnvelope); ASSERT_FALSE(config.addNodeOrientedBoundingBox); @@ -645,6 +646,22 @@ TEST(CONFIG_Config, fromArgsAddAreaOrientedBoundingBoxLong) { ASSERT_TRUE(config.addAreaOrientedBoundingBox); } +// ____________________________________________________________________________ +TEST(CONFIG_Config, fromArgsAddAreaWayLinestringsLong) { + osm2rdf::config::Config config; + assertDefaultConfig(config); + osm2rdf::util::CacheFile cf("/tmp/dummyInput"); + + const auto arg = + "--" + osm2rdf::config::constants::ADD_AREA_WAY_LINESTRINGS_OPTION_LONG; + const int argc = 3; + char* argv[argc] = {const_cast(""), const_cast(arg.c_str()), + const_cast("/tmp/dummyInput")}; + config.fromArgs(argc, argv); + ASSERT_EQ("", config.output.string()); + ASSERT_TRUE(config.addAreaWayLinestrings); +} + // ____________________________________________________________________________ TEST(CONFIG_Config, fromArgsAddNodeConvexHullLong) { osm2rdf::config::Config config; @@ -719,8 +736,7 @@ TEST(CONFIG_Config, fromArgsAddRelationConvexHullLong) { osm2rdf::util::CacheFile cf("/tmp/dummyInput"); const auto arg = - "--" + - osm2rdf::config::constants::ADD_RELATION_CONVEX_HULL_OPTION_LONG; + "--" + osm2rdf::config::constants::ADD_RELATION_CONVEX_HULL_OPTION_LONG; const int argc = 3; char* argv[argc] = {const_cast(""), const_cast(arg.c_str()), const_cast("/tmp/dummyInput")}; @@ -736,8 +752,7 @@ TEST(CONFIG_Config, fromArgsAddRelationEnvelopeLong) { osm2rdf::util::CacheFile cf("/tmp/dummyInput"); const auto arg = - "--" + - osm2rdf::config::constants::ADD_RELATION_ENVELOPE_OPTION_LONG; + "--" + osm2rdf::config::constants::ADD_RELATION_ENVELOPE_OPTION_LONG; const int argc = 3; char* argv[argc] = {const_cast(""), const_cast(arg.c_str()), const_cast("/tmp/dummyInput")}; @@ -752,9 +767,8 @@ TEST(CONFIG_Config, fromArgsAddRelationOrientedBoundingBoxLong) { assertDefaultConfig(config); osm2rdf::util::CacheFile cf("/tmp/dummyInput"); - const auto arg = - "--" + - osm2rdf::config::constants::ADD_RELATION_ORIENTED_BOUNDING_BOX_OPTION_LONG; + const auto arg = "--" + osm2rdf::config::constants:: + ADD_RELATION_ORIENTED_BOUNDING_BOX_OPTION_LONG; const int argc = 3; char* argv[argc] = {const_cast(""), const_cast(arg.c_str()), const_cast("/tmp/dummyInput")}; @@ -803,7 +817,8 @@ TEST(CONFIG_Config, fromArgsAddWayOrientedBoundingBOxLong) { osm2rdf::util::CacheFile cf("/tmp/dummyInput"); const auto arg = - "--" + osm2rdf::config::constants::ADD_WAY_ORIENTED_BOUNDING_BOX_OPTION_LONG; + "--" + + osm2rdf::config::constants::ADD_WAY_ORIENTED_BOUNDING_BOX_OPTION_LONG; const int argc = 3; char* argv[argc] = {const_cast(""), const_cast(arg.c_str()), const_cast("/tmp/dummyInput")}; @@ -1168,6 +1183,18 @@ TEST(CONFIG_Config, getInfoAddAreaOrientedBoundingBox) { osm2rdf::config::constants::ADD_AREA_ORIENTED_BOUNDING_BOX_INFO)); } +// ____________________________________________________________________________ +TEST(CONFIG_Config, getInfoAddAreaWayLinestrings) { + osm2rdf::config::Config config; + assertDefaultConfig(config); + config.addAreaWayLinestrings = true; + + const std::string res = config.getInfo(""); + ASSERT_THAT(res, + ::testing::HasSubstr( + osm2rdf::config::constants::ADD_AREA_WAY_LINESTRINGS_INFO)); +} + // ____________________________________________________________________________ TEST(CONFIG_Config, getInfoAddAreaEnvelopeRatio) { osm2rdf::config::Config config; diff --git a/tests/osm/FactHandler.cpp b/tests/osm/FactHandler.cpp index fecb38ec..c2b47ac6 100644 --- a/tests/osm/FactHandler.cpp +++ b/tests/osm/FactHandler.cpp @@ -1730,6 +1730,7 @@ TEST(OSM_FactHandler, wayAddWayNodeSpatialMetadataLongerWay) { config.addSortMetadata = false; config.addWayNodeOrder = true; config.addWayNodeSpatialMetadata = true; + config.addAreaWayLinestrings = true; osm2rdf::util::Output output{config, config.output}; output.open(); diff --git a/tests/osm/Way.cpp b/tests/osm/Way.cpp index d5c8ff2e..6dd75a12 100644 --- a/tests/osm/Way.cpp +++ b/tests/osm/Way.cpp @@ -185,6 +185,90 @@ TEST(OSM_Way, FromClosedWayWithDuplicateNodes) { ASSERT_DOUBLE_EQ(7.61, w.envelope().max_corner().y()); } +// ____________________________________________________________________________ +TEST(OSM_Way, isAreaFalseForClosedWayWithoutArea) { + // Create osmium object + const size_t initial_buffer_size = 10000; + osmium::memory::Buffer buffer{initial_buffer_size, + osmium::memory::Buffer::auto_grow::yes}; + osmium::builder::add_way(buffer, osmium::builder::attr::_id(42), + osmium::builder::attr::_nodes({ + {1, {48.0, 7.51}}, + {2, {48.1, 7.61}}, + {1, {48.0, 7.51}}, + })); + + // Create osm2rdf object from osmium object + const osm2rdf::osm::Way w{buffer.get(0)}; + ASSERT_TRUE(w.closed()); + + ASSERT_FALSE(w.isArea()); +} + +// ____________________________________________________________________________ +TEST(OSM_Way, isAreaFalseForOpenWay) { + // Create osmium object + const size_t initial_buffer_size = 10000; + osmium::memory::Buffer buffer{initial_buffer_size, + osmium::memory::Buffer::auto_grow::yes}; + osmium::builder::add_way(buffer, osmium::builder::attr::_id(42), + osmium::builder::attr::_nodes({ + {1, {48.0, 7.51}}, + {2, {48.0, 7.61}}, + {1, {48.1, 7.61}}, + {1, {48.1, 7.51}}, + })); + + // Create osm2rdf object from osmium object + const osm2rdf::osm::Way w{buffer.get(0)}; + ASSERT_FALSE(w.closed()); + + ASSERT_FALSE(w.isArea()); +} + +// ____________________________________________________________________________ +TEST(OSM_Way, isAreaTrueForTriangle) { + // Create osmium object + const size_t initial_buffer_size = 10000; + osmium::memory::Buffer buffer{initial_buffer_size, + osmium::memory::Buffer::auto_grow::yes}; + osmium::builder::add_way(buffer, osmium::builder::attr::_id(42), + osmium::builder::attr::_nodes({ + {1, {48.0, 7.51}}, + {2, {48.0, 7.61}}, + {1, {48.1, 7.61}}, + {1, {48.0, 7.51}}, + })); + + // Create osm2rdf object from osmium object + const osm2rdf::osm::Way w{buffer.get(0)}; + ASSERT_TRUE(w.closed()); + + ASSERT_TRUE(w.isArea()); +} + +// ____________________________________________________________________________ +TEST(OSM_Way, isAreaFalseForTriangleMarkedAsNoArea) { + // Create osmium object + const size_t initial_buffer_size = 10000; + osmium::memory::Buffer buffer{initial_buffer_size, + osmium::memory::Buffer::auto_grow::yes}; + osmium::builder::add_way(buffer, osmium::builder::attr::_id(42), + osmium::builder::attr::_nodes({ + {1, {48.0, 7.51}}, + {2, {48.0, 7.61}}, + {1, {48.1, 7.61}}, + {1, {48.0, 7.51}}, + }), + osmium::builder::attr::_tag("area", "no")); + + // Create osm2rdf object from osmium object + const osm2rdf::osm::Way w{buffer.get(0)}; + ASSERT_TRUE(w.closed()); + + ASSERT_FALSE(w.isArea()); +} + // ____________________________________________________________________________ TEST(OSM_Way, equalsOperator) { // Create osmium object From 881c4d76e282e9c84cbf60e77e32c5c7a0c1e8f2 Mon Sep 17 00:00:00 2001 From: Axel Lehmann Date: Fri, 10 Nov 2023 23:48:01 +0100 Subject: [PATCH 4/6] Fix master tests (#61) * Fix E2E tests * Update tests to use 'ogc:xxx' relations as default --- tests/E2E.cpp | 52 ++--- tests/osm/GeometryHandler.cpp | 405 ++++++---------------------------- 2 files changed, 93 insertions(+), 364 deletions(-) diff --git a/tests/E2E.cpp b/tests/E2E.cpp index 0aae0c07..0e826649 100644 --- a/tests/E2E.cpp +++ b/tests/E2E.cpp @@ -559,32 +559,32 @@ TEST(E2E, building51NT) { ASSERT_THAT(printedData, ::testing::HasSubstr( " " - " " + " " " .\n")); ASSERT_THAT(printedData, ::testing::HasSubstr( " " - " " + " " " .\n")); ASSERT_THAT(printedData, ::testing::HasSubstr( " " - " " + " " " .\n")); ASSERT_THAT(printedData, ::testing::HasSubstr( " " - " " + " " " .\n")); ASSERT_THAT(printedData, ::testing::HasSubstr( " " - " " + " " " .\n")); ASSERT_THAT(printedData, ::testing::HasSubstr( " " - " " + " " " .\n")); // Reset std::cerr and std::cout @@ -704,27 +704,27 @@ TEST(E2E, building51TTL) { ASSERT_THAT( printedData, ::testing::HasSubstr( - "osmway:98284318 osm2rdf:intersects_nonarea osmnode:2110601105 .\n")); + "osmway:98284318 ogc:sfIntersects osmnode:2110601105 .\n")); ASSERT_THAT( printedData, ::testing::HasSubstr( - "osmway:98284318 osm2rdf:contains_nonarea osmnode:2110601105 .\n")); + "osmway:98284318 ogc:sfContains osmnode:2110601105 .\n")); ASSERT_THAT( printedData, ::testing::HasSubstr( - "osmway:98284318 osm2rdf:intersects_nonarea osmnode:2110601134 .\n")); + "osmway:98284318 ogc:sfIntersects osmnode:2110601134 .\n")); ASSERT_THAT( printedData, ::testing::HasSubstr( - "osmway:98284318 osm2rdf:contains_nonarea osmnode:2110601134 .\n")); + "osmway:98284318 ogc:sfContains osmnode:2110601134 .\n")); ASSERT_THAT( printedData, ::testing::HasSubstr( - "osmway:98284318 osm2rdf:intersects_nonarea osmnode:5190342871 .\n")); + "osmway:98284318 ogc:sfIntersects osmnode:5190342871 .\n")); ASSERT_THAT( printedData, ::testing::HasSubstr( - "osmway:98284318 osm2rdf:contains_nonarea osmnode:5190342871 .\n")); + "osmway:98284318 ogc:sfContains osmnode:5190342871 .\n")); // Reset std::cerr and std::cout std::cerr.rdbuf(cerrBufferOrig); @@ -843,27 +843,27 @@ TEST(E2E, building51QLEVER) { ASSERT_THAT( printedData, ::testing::HasSubstr( - "osmway:98284318 osm2rdf:intersects_nonarea osmnode:2110601105 .\n")); + "osmway:98284318 ogc:sfIntersects osmnode:2110601105 .\n")); ASSERT_THAT( printedData, ::testing::HasSubstr( - "osmway:98284318 osm2rdf:contains_nonarea osmnode:2110601105 .\n")); + "osmway:98284318 ogc:sfContains osmnode:2110601105 .\n")); ASSERT_THAT( printedData, ::testing::HasSubstr( - "osmway:98284318 osm2rdf:intersects_nonarea osmnode:2110601134 .\n")); + "osmway:98284318 ogc:sfIntersects osmnode:2110601134 .\n")); ASSERT_THAT( printedData, ::testing::HasSubstr( - "osmway:98284318 osm2rdf:contains_nonarea osmnode:2110601134 .\n")); + "osmway:98284318 ogc:sfContains osmnode:2110601134 .\n")); ASSERT_THAT( printedData, ::testing::HasSubstr( - "osmway:98284318 osm2rdf:intersects_nonarea osmnode:5190342871 .\n")); + "osmway:98284318 ogc:sfIntersects osmnode:5190342871 .\n")); ASSERT_THAT( printedData, ::testing::HasSubstr( - "osmway:98284318 osm2rdf:contains_nonarea osmnode:5190342871 .\n")); + "osmway:98284318 ogc:sfContains osmnode:5190342871 .\n")); // Reset std::cerr and std::cout std::cerr.rdbuf(cerrBufferOrig); @@ -1102,35 +1102,35 @@ TEST(E2E, building51inTF) { "osmway:4498466 geo:hasGeometry \"MULTIPOLYGON(((7")); ASSERT_THAT(printedData, ::testing::HasSubstr( - "osmway:4498466 osm2rdf:contains_area osmway:98284318 .\n")); + "osmway:4498466 ogc:sfContains osmway:98284318 .\n")); ASSERT_THAT( printedData, ::testing::HasSubstr( - "osmway:4498466 osm2rdf:intersects_area osmway:98284318 .\n")); + "osmway:4498466 ogc:sfIntersects osmway:98284318 .\n")); ASSERT_THAT( printedData, ::testing::HasSubstr( - "osmway:98284318 osm2rdf:intersects_nonarea osmnode:2110601105 .\n")); + "osmway:98284318 ogc:sfIntersects osmnode:2110601105 .\n")); ASSERT_THAT( printedData, ::testing::HasSubstr( - "osmway:98284318 osm2rdf:contains_nonarea osmnode:2110601105 .\n")); + "osmway:98284318 ogc:sfContains osmnode:2110601105 .\n")); ASSERT_THAT( printedData, ::testing::HasSubstr( - "osmway:98284318 osm2rdf:intersects_nonarea osmnode:2110601134 .\n")); + "osmway:98284318 ogc:sfIntersects osmnode:2110601134 .\n")); ASSERT_THAT( printedData, ::testing::HasSubstr( - "osmway:98284318 osm2rdf:contains_nonarea osmnode:2110601134 .\n")); + "osmway:98284318 ogc:sfContains osmnode:2110601134 .\n")); ASSERT_THAT( printedData, ::testing::HasSubstr( - "osmway:98284318 osm2rdf:intersects_nonarea osmnode:5190342871 .\n")); + "osmway:98284318 ogc:sfIntersects osmnode:5190342871 .\n")); ASSERT_THAT( printedData, ::testing::HasSubstr( - "osmway:98284318 osm2rdf:contains_nonarea osmnode:5190342871 .\n")); + "osmway:98284318 ogc:sfContains osmnode:5190342871 .\n")); // Reset std::cerr and std::cout std::cerr.rdbuf(cerrBufferOrig); diff --git a/tests/osm/GeometryHandler.cpp b/tests/osm/GeometryHandler.cpp index 68cd1f4b..87de37ff 100644 --- a/tests/osm/GeometryHandler.cpp +++ b/tests/osm/GeometryHandler.cpp @@ -727,6 +727,7 @@ TEST(OSM_GeometryHandler, dumpNamedAreaRelationsSimple) { osm2rdf::config::Config config; config.output = ""; config.outputCompress = false; + config.ogcGeoTriplesMode = config::reduced; config.mergeOutput = osm2rdf::util::OutputMergeMode::NONE; osm2rdf::util::Output output{config, config.output}; output.open(); @@ -843,8 +844,7 @@ TEST(OSM_GeometryHandler, dumpNamedAreaRelationsSimple) { ::testing::HasSubstr( writer.generateIRI(osm2rdf::ttl::constants::NAMESPACE__OSM_WAY, 14) + " " + - writer.generateIRI(osm2rdf::ttl::constants::NAMESPACE__OSM2RDF, - "contains_area") + + osm2rdf::ttl::constants::IRI__OPENGIS_CONTAINS + " " + writer.generateIRI(osm2rdf::ttl::constants::NAMESPACE__OSM_WAY, 12))); ASSERT_THAT( @@ -852,8 +852,7 @@ TEST(OSM_GeometryHandler, dumpNamedAreaRelationsSimple) { ::testing::HasSubstr( writer.generateIRI(osm2rdf::ttl::constants::NAMESPACE__OSM_WAY, 14) + " " + - writer.generateIRI(osm2rdf::ttl::constants::NAMESPACE__OSM2RDF, - "intersects_area") + + osm2rdf::ttl::constants::IRI__OPENGIS_INTERSECTS + " " + writer.generateIRI(osm2rdf::ttl::constants::NAMESPACE__OSM_WAY, 12))); ASSERT_THAT( @@ -861,8 +860,7 @@ TEST(OSM_GeometryHandler, dumpNamedAreaRelationsSimple) { ::testing::HasSubstr( writer.generateIRI(osm2rdf::ttl::constants::NAMESPACE__OSM_WAY, 12) + " " + - writer.generateIRI(osm2rdf::ttl::constants::NAMESPACE__OSM2RDF, - "contains_area") + + osm2rdf::ttl::constants::IRI__OPENGIS_CONTAINS + " " + writer.generateIRI(osm2rdf::ttl::constants::NAMESPACE__OSM_WAY, 13))); ASSERT_THAT( @@ -870,8 +868,7 @@ TEST(OSM_GeometryHandler, dumpNamedAreaRelationsSimple) { ::testing::HasSubstr( writer.generateIRI(osm2rdf::ttl::constants::NAMESPACE__OSM_WAY, 12) + " " + - writer.generateIRI(osm2rdf::ttl::constants::NAMESPACE__OSM2RDF, - "intersects_area") + + osm2rdf::ttl::constants::IRI__OPENGIS_INTERSECTS + " " + writer.generateIRI(osm2rdf::ttl::constants::NAMESPACE__OSM_WAY, 13))); ASSERT_THAT( @@ -879,8 +876,7 @@ TEST(OSM_GeometryHandler, dumpNamedAreaRelationsSimple) { ::testing::HasSubstr( writer.generateIRI(osm2rdf::ttl::constants::NAMESPACE__OSM_WAY, 12) + " " + - writer.generateIRI(osm2rdf::ttl::constants::NAMESPACE__OSM2RDF, - "contains_area") + + osm2rdf::ttl::constants::IRI__OPENGIS_CONTAINS + " " + writer.generateIRI(osm2rdf::ttl::constants::NAMESPACE__OSM_WAY, 11))); ASSERT_THAT( @@ -888,8 +884,7 @@ TEST(OSM_GeometryHandler, dumpNamedAreaRelationsSimple) { ::testing::HasSubstr( writer.generateIRI(osm2rdf::ttl::constants::NAMESPACE__OSM_WAY, 12) + " " + - writer.generateIRI(osm2rdf::ttl::constants::NAMESPACE__OSM2RDF, - "intersects_area") + + osm2rdf::ttl::constants::IRI__OPENGIS_INTERSECTS + " " + writer.generateIRI(osm2rdf::ttl::constants::NAMESPACE__OSM_WAY, 11))); ASSERT_THAT( @@ -897,8 +892,7 @@ TEST(OSM_GeometryHandler, dumpNamedAreaRelationsSimple) { Not(::testing::HasSubstr( writer.generateIRI(osm2rdf::ttl::constants::NAMESPACE__OSM_WAY, 14) + " " + - writer.generateIRI(osm2rdf::ttl::constants::NAMESPACE__OSM2RDF, - "contains_area") + + osm2rdf::ttl::constants::IRI__OPENGIS_CONTAINS + " " + writer.generateIRI(osm2rdf::ttl::constants::NAMESPACE__OSM_WAY, 15)))); ASSERT_THAT( @@ -906,8 +900,7 @@ TEST(OSM_GeometryHandler, dumpNamedAreaRelationsSimple) { ::testing::HasSubstr( writer.generateIRI(osm2rdf::ttl::constants::NAMESPACE__OSM_WAY, 14) + " " + - writer.generateIRI(osm2rdf::ttl::constants::NAMESPACE__OSM2RDF, - "intersects_area") + + osm2rdf::ttl::constants::IRI__OPENGIS_INTERSECTS + " " + writer.generateIRI(osm2rdf::ttl::constants::NAMESPACE__OSM_WAY, 15))); @@ -1030,8 +1023,7 @@ TEST(OSM_GeometryHandler, dumpNamedAreaRelationsSimpleOpenMP) { ::testing::HasSubstr( writer.generateIRI(osm2rdf::ttl::constants::NAMESPACE__OSM_WAY, 14) + " " + - writer.generateIRI(osm2rdf::ttl::constants::NAMESPACE__OSM2RDF, - "contains_area") + + osm2rdf::ttl::constants::IRI__OPENGIS_CONTAINS + " " + writer.generateIRI(osm2rdf::ttl::constants::NAMESPACE__OSM_WAY, 12))); ASSERT_THAT( @@ -1039,8 +1031,7 @@ TEST(OSM_GeometryHandler, dumpNamedAreaRelationsSimpleOpenMP) { ::testing::HasSubstr( writer.generateIRI(osm2rdf::ttl::constants::NAMESPACE__OSM_WAY, 14) + " " + - writer.generateIRI(osm2rdf::ttl::constants::NAMESPACE__OSM2RDF, - "intersects_area") + + osm2rdf::ttl::constants::IRI__OPENGIS_INTERSECTS + " " + writer.generateIRI(osm2rdf::ttl::constants::NAMESPACE__OSM_WAY, 12))); ASSERT_THAT( @@ -1048,8 +1039,7 @@ TEST(OSM_GeometryHandler, dumpNamedAreaRelationsSimpleOpenMP) { ::testing::HasSubstr( writer.generateIRI(osm2rdf::ttl::constants::NAMESPACE__OSM_WAY, 12) + " " + - writer.generateIRI(osm2rdf::ttl::constants::NAMESPACE__OSM2RDF, - "contains_area") + + osm2rdf::ttl::constants::IRI__OPENGIS_CONTAINS + " " + writer.generateIRI(osm2rdf::ttl::constants::NAMESPACE__OSM_WAY, 13))); ASSERT_THAT( @@ -1057,8 +1047,7 @@ TEST(OSM_GeometryHandler, dumpNamedAreaRelationsSimpleOpenMP) { ::testing::HasSubstr( writer.generateIRI(osm2rdf::ttl::constants::NAMESPACE__OSM_WAY, 12) + " " + - writer.generateIRI(osm2rdf::ttl::constants::NAMESPACE__OSM2RDF, - "intersects_area") + + osm2rdf::ttl::constants::IRI__OPENGIS_INTERSECTS + " " + writer.generateIRI(osm2rdf::ttl::constants::NAMESPACE__OSM_WAY, 13))); ASSERT_THAT( @@ -1066,8 +1055,7 @@ TEST(OSM_GeometryHandler, dumpNamedAreaRelationsSimpleOpenMP) { ::testing::HasSubstr( writer.generateIRI(osm2rdf::ttl::constants::NAMESPACE__OSM_WAY, 12) + " " + - writer.generateIRI(osm2rdf::ttl::constants::NAMESPACE__OSM2RDF, - "contains_area") + + osm2rdf::ttl::constants::IRI__OPENGIS_CONTAINS + " " + writer.generateIRI(osm2rdf::ttl::constants::NAMESPACE__OSM_WAY, 11))); ASSERT_THAT( @@ -1075,8 +1063,7 @@ TEST(OSM_GeometryHandler, dumpNamedAreaRelationsSimpleOpenMP) { ::testing::HasSubstr( writer.generateIRI(osm2rdf::ttl::constants::NAMESPACE__OSM_WAY, 12) + " " + - writer.generateIRI(osm2rdf::ttl::constants::NAMESPACE__OSM2RDF, - "intersects_area") + + osm2rdf::ttl::constants::IRI__OPENGIS_INTERSECTS + " " + writer.generateIRI(osm2rdf::ttl::constants::NAMESPACE__OSM_WAY, 11))); @@ -1383,13 +1370,17 @@ TEST(OSM_GeometryHandler, dumpUnnamedAreaRelationsSimpleIntersects) { output.close(); const std::string printedData = coutBuffer.str(); - ASSERT_EQ( - "osmway:11 osm2rdf:intersects_nonarea osmrel:15 .\n" - "osmrel:15 osm2rdf:intersects_nonarea osmway:11 .\n" - "osmway:13 osm2rdf:intersects_nonarea osmrel:15 .\n" - "osmrel:15 osm2rdf:intersects_nonarea osmway:13 .\n" - "osmway:12 osm2rdf:contains_nonarea osmrel:15 .\n", - printedData); + ASSERT_THAT( + printedData, + ::testing::HasSubstr("osmway:11 ogc:sfIntersects osmrel:15 .\n" + "osmrel:15 ogc:sfIntersects osmway:11 .\n")); + ASSERT_THAT( + printedData, + ::testing::HasSubstr("osmway:13 ogc:sfIntersects osmrel:15 .\n" + "osmrel:15 ogc:sfIntersects osmway:13 .\n")); + ASSERT_THAT( + printedData, + ::testing::HasSubstr("osmway:12 ogc:sfContains osmrel:15 .\n")); // Reset std::cerr and std::cout std::cerr.rdbuf(cerrBufferOrig); @@ -1511,11 +1502,13 @@ TEST(OSM_GeometryHandler, dumpUnnamedAreaRelationsSimpleContainsOnly) { output.close(); const std::string printedData = coutBuffer.str(); - ASSERT_EQ( - "osmway:11 osm2rdf:intersects_nonarea osmrel:15 .\n" - "osmrel:15 osm2rdf:intersects_nonarea osmway:11 .\n" - "osmway:11 osm2rdf:contains_nonarea osmrel:15 .\n", - printedData); + ASSERT_THAT( + printedData, + ::testing::HasSubstr("osmway:11 ogc:sfIntersects osmrel:15 .\n" + "osmrel:15 ogc:sfIntersects osmway:11 .\n")); + ASSERT_THAT( + printedData, + ::testing::HasSubstr("osmway:11 ogc:sfContains osmrel:15 .\n")); // Reset std::cerr and std::cout std::cerr.rdbuf(cerrBufferOrig); @@ -1800,11 +1793,13 @@ TEST(OSM_GeometryHandler, dumpNodeRelationsSimpleIntersects) { output.close(); const std::string printedData = coutBuffer.str(); - ASSERT_EQ( - "osmway:13 osm2rdf:intersects_nonarea osmnode:42 .\n" - "osmnode:42 osm2rdf:intersects_area osmway:13 .\n" - "osmway:13 osm2rdf:contains_nonarea osmnode:42 .\n", - printedData); + ASSERT_THAT( + printedData, + ::testing::HasSubstr("osmway:12 ogc:sfIntersects osmnode:42 .\n" + "osmnode:42 ogc:sfIntersects osmway:12 .\n")); + ASSERT_THAT( + printedData, + ::testing::HasSubstr("osmway:13 ogc:sfContains osmnode:42 .\n")); // Reset std::cerr and std::cout std::cerr.rdbuf(cerrBufferOrig); @@ -1920,11 +1915,13 @@ TEST(OSM_GeometryHandler, dumpNodeRelationsSimpleContains) { output.close(); const std::string printedData = coutBuffer.str(); - ASSERT_EQ( - "osmway:11 osm2rdf:intersects_nonarea osmnode:42 .\n" - "osmnode:42 osm2rdf:intersects_area osmway:11 .\n" - "osmway:11 osm2rdf:contains_nonarea osmnode:42 .\n", - printedData); + ASSERT_THAT( + printedData, + ::testing::HasSubstr("osmway:12 ogc:sfIntersects osmnode:42 .\n" + "osmnode:42 ogc:sfIntersects osmway:12 .\n")); + ASSERT_THAT( + printedData, + ::testing::HasSubstr("osmway:11 ogc:sfContains osmnode:42 .\n")); // Reset std::cerr and std::cout std::cerr.rdbuf(cerrBufferOrig); @@ -2211,13 +2208,17 @@ TEST(OSM_GeometryHandler, dumpWayRelationsSimpleIntersects) { output.close(); const std::string printedData = coutBuffer.str(); - ASSERT_EQ( - "osmway:11 osm2rdf:intersects_nonarea osmway:42 .\n" - "osmway:42 osm2rdf:intersects_area osmway:11 .\n" - "osmway:13 osm2rdf:intersects_nonarea osmway:42 .\n" - "osmway:42 osm2rdf:intersects_area osmway:13 .\n" - "osmway:12 osm2rdf:contains_nonarea osmway:42 .\n", - printedData); + ASSERT_THAT( + printedData, + ::testing::HasSubstr("osmway:11 ogc:sfIntersects osmway:42 .\n" + "osmway:42 ogc:sfIntersects osmway:11 .\n")); + ASSERT_THAT( + printedData, + ::testing::HasSubstr("osmway:13 ogc:sfIntersects osmway:42 .\n" + "osmway:42 ogc:sfIntersects osmway:13 .\n")); + ASSERT_THAT( + printedData, + ::testing::HasSubstr("osmway:12 ogc:sfContains osmway:42 .\n")); // Reset std::cerr and std::cout std::cerr.rdbuf(cerrBufferOrig); @@ -2334,300 +2335,28 @@ TEST(OSM_GeometryHandler, dumpWayRelationsSimpleContains) { output.flush(); output.close(); - const std::string printedData = coutBuffer.str(); - ASSERT_EQ( - "osmway:11 osm2rdf:intersects_nonarea osmway:42 .\n" - "osmway:42 osm2rdf:intersects_area osmway:11 .\n" - "osmway:11 osm2rdf:contains_nonarea osmway:42 .\n", - printedData); - - // Reset std::cerr and std::cout - std::cerr.rdbuf(cerrBufferOrig); - std::cout.rdbuf(coutBufferOrig); -} - -// ____________________________________________________________________________ -TEST(OSM_GeometryHandler, dumpWayRelationsSimpleIntersectsWithNodeInfo) { - // Capture std::cerr and std::cout - std::stringstream cerrBuffer; - std::stringstream coutBuffer; - std::streambuf* cerrBufferOrig = std::cerr.rdbuf(); - std::streambuf* coutBufferOrig = std::cout.rdbuf(); - std::cerr.rdbuf(cerrBuffer.rdbuf()); - std::cout.rdbuf(coutBuffer.rdbuf()); - - osm2rdf::config::Config config; - config.output = ""; - config.outputCompress = false; - config.mergeOutput = osm2rdf::util::OutputMergeMode::NONE; - osm2rdf::util::Output output{config, config.output}; - output.open(); - osm2rdf::ttl::Writer writer{config, &output}; - osm2rdf::osm::GeometryHandler gh{config, &writer}; - - // Create osmium objects - /* - 28 (14) - | - 24 (12) - / \ - 22 (11) 26 (13) - */ - const size_t initial_buffer_size = 10000; - osmium::memory::Buffer osmiumBuffer1{initial_buffer_size, - osmium::memory::Buffer::auto_grow::yes}; - osmium::memory::Buffer osmiumBuffer2{initial_buffer_size, - osmium::memory::Buffer::auto_grow::yes}; - osmium::memory::Buffer osmiumBuffer3{initial_buffer_size, - osmium::memory::Buffer::auto_grow::yes}; - osmium::memory::Buffer osmiumBuffer4{initial_buffer_size, - osmium::memory::Buffer::auto_grow::yes}; - osmium::memory::Buffer osmiumBuffer5{initial_buffer_size, - osmium::memory::Buffer::auto_grow::yes}; - osmium::memory::Buffer osmiumBuffer6{initial_buffer_size, - osmium::memory::Buffer::auto_grow::yes}; - osmium::memory::Buffer osmiumBuffer7{initial_buffer_size, - osmium::memory::Buffer::auto_grow::yes}; - osmium::builder::add_area(osmiumBuffer1, osmium::builder::attr::_id(22), - osmium::builder::attr::_tag("name", "22"), - osmium::builder::attr::_outer_ring({ - {1, {48.0, 7.51}}, - {2, {48.0, 7.61}}, - {3, {48.1, 7.61}}, - {4, {48.1, 7.51}}, - {1, {48.0, 7.51}}, - })); - osmium::builder::add_area(osmiumBuffer2, osmium::builder::attr::_id(24), - osmium::builder::attr::_tag("name", "24"), - osmium::builder::attr::_outer_ring({ - {1, {40.0, 7.00}}, - {2, {40.0, 8.00}}, - {3, {50.0, 8.00}}, - {4, {50.0, 7.00}}, - {1, {40.0, 7.00}}, - })); - osmium::builder::add_area(osmiumBuffer3, osmium::builder::attr::_id(26), - osmium::builder::attr::_tag("name", "26"), - osmium::builder::attr::_outer_ring({ - {1, {40.0, 7.51}}, - {2, {40.0, 7.61}}, - {3, {40.1, 7.61}}, - {4, {40.1, 7.51}}, - {1, {40.0, 7.51}}, - })); - osmium::builder::add_area(osmiumBuffer4, osmium::builder::attr::_id(28), - osmium::builder::attr::_tag("name", "28"), - osmium::builder::attr::_outer_ring({ - {1, {20.0, 0.51}}, - {2, {20.0, 10.61}}, - {3, {50.1, 10.61}}, - {4, {50.1, 0.51}}, - {1, {20.0, 0.51}}, - })); - osmium::builder::add_way(osmiumBuffer5, osmium::builder::attr::_id(42), - osmium::builder::attr::_nodes({ - {1, {40.1, 7.51}}, - {2, {48.1, 7.61}}, - {3, {48.2, 7.61}}, - {4, {48.2, 7.71}}, - })); - osmium::builder::add_node( - osmiumBuffer6, osmium::builder::attr::_id(1), - osmium::builder::attr::_location(osmium::Location(40.1, 7.51)), - osmium::builder::attr::_tag("foo", "bar")); - osmium::builder::add_node( - osmiumBuffer7, osmium::builder::attr::_id(2), - osmium::builder::attr::_location(osmium::Location(48.1, 7.61)), - osmium::builder::attr::_tag("foo", "bar")); - - // Create osm2rdf object from osmium object - auto area1 = osm2rdf::osm::Area(osmiumBuffer1.get(0)); - auto area2 = osm2rdf::osm::Area(osmiumBuffer2.get(0)); - auto area3 = osm2rdf::osm::Area(osmiumBuffer3.get(0)); - auto area4 = osm2rdf::osm::Area(osmiumBuffer4.get(0)); - - area1.finalize(); - area2.finalize(); - area3.finalize(); - area4.finalize(); - - gh.area(area1); - gh.area(area2); - gh.area(area3); - gh.area(area4); - - gh.way(osm2rdf::osm::Way(osmiumBuffer5.get(0))); - gh.node(osm2rdf::osm::Node(osmiumBuffer6.get(0))); - gh.node(osm2rdf::osm::Node(osmiumBuffer7.get(0))); - gh.flushExternalStorage(); - gh.prepareRTree(); - gh.prepareDAG(); - - gh.dumpNodeRelations(); - gh.dumpWayRelations(); - - output.flush(); - output.close(); - const std::string printedData = coutBuffer.str(); ASSERT_THAT( printedData, - ::testing::HasSubstr("osmway:13 osm2rdf:intersects_nonarea osmnode:1 .\n")); + ::testing::HasSubstr("osmway:11 ogc:sfIntersects osmway:42 .\n" + "osmway:42 ogc:sfIntersects osmway:11 .\n")); ASSERT_THAT( printedData, - ::testing::HasSubstr("osmway:13 osm2rdf:contains_nonarea osmnode:1 .\n")); + ::testing::HasSubstr("osmway:11 ogc:sfContains osmway:42 .\n")); ASSERT_THAT( printedData, - ::testing::HasSubstr( - "osmway:11 osm2rdf:contains_nonarea osmnode:2 .\n")); - ASSERT_THAT( - printedData, - ::testing::HasSubstr("osmway:11 osm2rdf:intersects_nonarea osmnode:2 .\n" - )); - ASSERT_THAT( - printedData, - ::testing::HasSubstr("osmway:11 osm2rdf:intersects_nonarea osmway:42 .\n")); - ASSERT_THAT( - printedData, - ::testing::HasSubstr("osmway:13 osm2rdf:intersects_nonarea osmway:42 .\n")); + ::testing::HasSubstr("osmway:12 ogc:sfIntersects osmway:42 .\n" + "osmway:42 ogc:sfIntersects osmway:12 .\n")); ASSERT_THAT( printedData, - ::testing::HasSubstr("osmway:12 osm2rdf:contains_nonarea osmway:42 .\n")); - - // Reset std::cerr and std::cout - std::cerr.rdbuf(cerrBufferOrig); - std::cout.rdbuf(coutBufferOrig); -} - -// ____________________________________________________________________________ -TEST(OSM_GeometryHandler, dumpWayRelationsSimpleContainsWithNodeInfo) { - // Capture std::cerr and std::cout - std::stringstream cerrBuffer; - std::stringstream coutBuffer; - std::streambuf* cerrBufferOrig = std::cerr.rdbuf(); - std::streambuf* coutBufferOrig = std::cout.rdbuf(); - std::cerr.rdbuf(cerrBuffer.rdbuf()); - std::cout.rdbuf(coutBuffer.rdbuf()); - - osm2rdf::config::Config config; - config.output = ""; - config.outputCompress = false; - config.mergeOutput = osm2rdf::util::OutputMergeMode::NONE; - osm2rdf::util::Output output{config, config.output}; - output.open(); - osm2rdf::ttl::Writer writer{config, &output}; - osm2rdf::osm::GeometryHandler gh{config, &writer}; - - // Create osmium objects - /* - 28 (14) - | - 24 (12) - / \ - 22 (11) 26 (13) - */ - const size_t initial_buffer_size = 10000; - osmium::memory::Buffer osmiumBuffer1{initial_buffer_size, - osmium::memory::Buffer::auto_grow::yes}; - osmium::memory::Buffer osmiumBuffer2{initial_buffer_size, - osmium::memory::Buffer::auto_grow::yes}; - osmium::memory::Buffer osmiumBuffer3{initial_buffer_size, - osmium::memory::Buffer::auto_grow::yes}; - osmium::memory::Buffer osmiumBuffer4{initial_buffer_size, - osmium::memory::Buffer::auto_grow::yes}; - osmium::memory::Buffer osmiumBuffer5{initial_buffer_size, - osmium::memory::Buffer::auto_grow::yes}; - osmium::memory::Buffer osmiumBuffer6{initial_buffer_size, - osmium::memory::Buffer::auto_grow::yes}; - osmium::builder::add_area(osmiumBuffer1, osmium::builder::attr::_id(22), - osmium::builder::attr::_tag("name", "22"), - osmium::builder::attr::_outer_ring({ - {1, {48.0, 7.51}}, - {2, {48.0, 7.61}}, - {3, {48.1, 7.61}}, - {4, {48.1, 7.51}}, - {1, {48.0, 7.51}}, - })); - osmium::builder::add_area(osmiumBuffer2, osmium::builder::attr::_id(24), - osmium::builder::attr::_tag("name", "24"), - osmium::builder::attr::_outer_ring({ - {1, {40.0, 7.00}}, - {2, {40.0, 8.00}}, - {3, {50.0, 8.00}}, - {4, {50.0, 7.00}}, - {1, {40.0, 7.00}}, - })); - osmium::builder::add_area(osmiumBuffer3, osmium::builder::attr::_id(26), - osmium::builder::attr::_tag("name", "26"), - osmium::builder::attr::_outer_ring({ - {1, {40.0, 7.51}}, - {2, {40.0, 7.61}}, - {3, {40.1, 7.61}}, - {4, {40.1, 7.51}}, - {1, {40.0, 7.51}}, - })); - osmium::builder::add_area(osmiumBuffer4, osmium::builder::attr::_id(28), - osmium::builder::attr::_tag("name", "28"), - osmium::builder::attr::_outer_ring({ - {1, {20.0, 0.51}}, - {2, {20.0, 10.61}}, - {3, {50.1, 10.61}}, - {4, {50.1, 0.51}}, - {1, {20.0, 0.51}}, - })); - osmium::builder::add_way(osmiumBuffer5, osmium::builder::attr::_id(42), - osmium::builder::attr::_nodes({ - {1, {48.02, 7.52}}, - {2, {48.04, 7.53}}, - {3, {48.06, 7.59}}, - {4, {48.08, 7.55}}, - })); - osmium::builder::add_node( - osmiumBuffer6, osmium::builder::attr::_id(2), - osmium::builder::attr::_location(osmium::Location(48.04, 7.53)), - osmium::builder::attr::_tag("foo", "bar")); - - // Create osm2rdf object from osmium object - auto area1 = osm2rdf::osm::Area(osmiumBuffer1.get(0)); - auto area2 = osm2rdf::osm::Area(osmiumBuffer2.get(0)); - auto area3 = osm2rdf::osm::Area(osmiumBuffer3.get(0)); - auto area4 = osm2rdf::osm::Area(osmiumBuffer4.get(0)); - - area1.finalize(); - area2.finalize(); - area3.finalize(); - area4.finalize(); - - gh.area(area1); - gh.area(area2); - gh.area(area3); - gh.area(area4); - - ASSERT_EQ(0, gh._numWays); - gh.way(osm2rdf::osm::Way(osmiumBuffer5.get(0))); - ASSERT_EQ(1, gh._numWays); - gh.node(osm2rdf::osm::Node(osmiumBuffer6.get(0))); - gh.flushExternalStorage(); - gh.prepareRTree(); - gh.prepareDAG(); - - gh.dumpNodeRelations(); - gh.dumpWayRelations(); - - output.flush(); - output.close(); - - const std::string printedData = coutBuffer.str(); + ::testing::HasSubstr("osmway:12 ogc:sfContains osmway:42 .\n")); ASSERT_THAT( printedData, - ::testing::HasSubstr("osmway:11 osm2rdf:intersects_nonarea osmnode:2 .\n" - "osmnode:2 osm2rdf:intersects_area osmway:11 .\n" - "osmway:11 osm2rdf:contains_nonarea osmnode:2 .\n")); + ::testing::HasSubstr("osmway:14 ogc:sfIntersects osmway:42 .\n" + "osmway:42 ogc:sfIntersects osmway:14 .\n")); ASSERT_THAT( printedData, - ::testing::HasSubstr("osmway:11 osm2rdf:intersects_nonarea osmway:42 .\n" - "osmway:42 osm2rdf:intersects_area osmway:11 .\n" - "osmway:11 osm2rdf:contains_nonarea osmway:42 .\n")); + ::testing::HasSubstr("osmway:14 ogc:sfContains osmway:42 .\n")); // Reset std::cerr and std::cout std::cerr.rdbuf(cerrBufferOrig); From 13599c660067f5359f1dae78f1ca01228f631c9c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Lorenz=20B=C3=BChmann?= Date: Tue, 21 Nov 2023 16:33:01 +0100 Subject: [PATCH 5/6] Update README.md (#63) * added namespace declarations * fixed used prefixes * updated the produced triples part to the new version --- README.md | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index d0ce94a7..db7f7564 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,23 @@ # osm2rdf -`osm2rdf` is a tool for converting the complete [OpenStreetMap](https://www.openstreetmap.org) (OSM) data to [RDF Turtle](https://www.w3.org/TR/turtle) (TTL). The produced triples include: +`osm2rdf` is a tool for converting the complete [OpenStreetMap](https://www.openstreetmap.org) (OSM) data to [RDF Turtle](https://www.w3.org/TR/turtle) (TTL). -1. One triple ` ` for each key-value pair (called "tag" in OSM) of each object. -2. One triple ` geo:hasGeometry ` for the shape of each object (using [WKT](https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry) to represent the shape). -3. One triple ` geo:sfContains ` for each pair of objects, where `` geometrically contains ``. -4. One triple ` geo:sfContains ` for each pair of objects, where `` geometrically intersects ``. -5. Triples for various other kinds of information (see `osm2rdf --help` for the many options of the tool). +We consider the following prefixes being used in our code and documentation: + +``` +PREFIX ogc: +PREFIX geo: +PREFIX osm2rdf: +``` + +The produced triples include: + +1. One triple ` .` for each key-value pair (called "tag" in OSM) of each object. +2. Two triples ` geo:hasGeometry . geo:asWKT .` for the shape of each object (using [WKT](https://en.wikipedia.org/wiki/Well-known_text_representation_of_geometry) to represent the shape). + > Note: using the option `--hasgeometry-as-wkt` will attach the WKT literal directly to the object, i.e. ` geo:hasGeometry .` +4. One triple ` ogc:sfContains .` for each pair of objects, where `` geometrically contains ``. +5. One triple ` ogc:sfIntersects .` for each pair of objects, where `` geometrically intersects ``. +6. Triples for various other kinds of information (see `osm2rdf --help` for the many options of the tool). For the complete OSM data, the tool takes around 15 hours on standard hardware and produces around 40 billion triples with a size of around 200 GB for the compressed TTL file. From 42eb3f40ebac2636f3436062028252dfa655db1b Mon Sep 17 00:00:00 2001 From: Patrick Brosi Date: Fri, 12 Jan 2024 13:08:48 +0100 Subject: [PATCH 6/6] do not output GEOMETRYCOLLECTION geometry for relations which are areas (#65) --- include/osm2rdf/osm/Relation.h | 1 + src/osm/FactHandler.cpp | 2 +- src/osm/Relation.cpp | 9 +++++++++ 3 files changed, 11 insertions(+), 1 deletion(-) diff --git a/include/osm2rdf/osm/Relation.h b/include/osm2rdf/osm/Relation.h index f97ab83c..a86f9e59 100644 --- a/include/osm2rdf/osm/Relation.h +++ b/include/osm2rdf/osm/Relation.h @@ -45,6 +45,7 @@ class Relation { const noexcept; [[nodiscard]] const osm2rdf::osm::TagList& tags() const noexcept; [[nodiscard]] bool hasCompleteGeometry() const noexcept; + [[nodiscard]] bool isArea() const noexcept; #if BOOST_VERSION >= 107800 [[nodiscard]] bool hasGeometry() const noexcept; [[nodiscard]] const osm2rdf::geometry::Box& envelope() const noexcept; diff --git a/src/osm/FactHandler.cpp b/src/osm/FactHandler.cpp index 96017ab6..5c8f778d 100644 --- a/src/osm/FactHandler.cpp +++ b/src/osm/FactHandler.cpp @@ -203,7 +203,7 @@ void osm2rdf::osm::FactHandler::relation( } #if BOOST_VERSION >= 107800 - if (relation.hasGeometry()) { + if (relation.hasGeometry() && !relation.isArea()) { if (!_config.hasGeometryAsWkt) { const std::string& geomObj = _writer->generateIRI( NAMESPACE__OSM2RDF_GEOM, "relation_" + std::to_string(relation.id())); diff --git a/src/osm/Relation.cpp b/src/osm/Relation.cpp index b3f25408..afc7d0e7 100644 --- a/src/osm/Relation.cpp +++ b/src/osm/Relation.cpp @@ -56,6 +56,15 @@ const osm2rdf::osm::TagList& osm2rdf::osm::Relation::tags() const noexcept { return _tags; } +// ____________________________________________________________________________ +bool osm2rdf::osm::Relation::isArea() const noexcept { + const auto& typeTag = _tags.find("type"); + if (typeTag != _tags.end()) { + return typeTag->second == "multipolygon" || typeTag->second == "boundary"; + } + return false; +} + // ____________________________________________________________________________ const std::vector& osm2rdf::osm::Relation::members() const noexcept {