Skip to content

Commit 4f89cbe

Browse files
Add first AreaMetadata with config option and tests.
1 parent 31bed36 commit 4f89cbe

8 files changed

Lines changed: 115 additions & 0 deletions

File tree

include/osm2rdf/config/Config.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ struct Config {
5858

5959
// Select amount to dump
6060
bool addAreaEnvelope = false;
61+
bool addAreaMetadata = false;
6162
bool addNodeEnvelope = false;
6263
bool addRelationBorderMembers = false;
6364
bool addRelationEnvelope = false;

include/osm2rdf/config/Constants.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,6 +185,13 @@ const static inline std::string ADD_AREA_ENVELOPE_RATIO_OPTION_LONG =
185185
const static inline std::string ADD_AREA_ENVELOPE_RATIO_OPTION_HELP =
186186
"Add area/envelope ratio to areas";
187187

188+
const static inline std::string ADD_AREA_METADATA_INFO = "Adding area metadata";
189+
const static inline std::string ADD_AREA_METADATA_OPTION_SHORT = "";
190+
const static inline std::string ADD_AREA_METADATA_OPTION_LONG =
191+
"add-area-metadata";
192+
const static inline std::string ADD_AREA_METADATA_OPTION_HELP =
193+
"Add information about the area structure";
194+
188195
const static inline std::string ADD_NODE_ENVELOPE_INFO =
189196
"Adding node envelopes";
190197
const static inline std::string ADD_NODE_ENVELOPE_OPTION_SHORT = "";

include/osm2rdf/osm/Area.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,8 @@ struct Area {
5656
[[nodiscard]] bool fromWay() const noexcept;
5757
// Return if this area has a name.
5858
[[nodiscard]] bool hasName() const noexcept;
59+
// Return number of polygons.
60+
[[nodiscard]] size_t numOuterPolygons() const noexcept;
5961
// finalize geometries
6062
void finalize() noexcept;
6163

@@ -72,6 +74,7 @@ struct Area {
7274
osm2rdf::geometry::area_result_t _envelopeArea;
7375
osm2rdf::geometry::Area _geom;
7476
osm2rdf::geometry::Box _envelope;
77+
size_t _numPolygons;
7578

7679
friend class boost::serialization::access;
7780
template <class Archive>

src/config/Config.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@ std::string osm2rdf::config::Config::getInfo(std::string_view prefix) const {
6565
<< prefix
6666
<< osm2rdf::config::constants::ADD_AREA_ENVELOPE_RATIO_INFO;
6767
}
68+
if (addAreaMetadata) {
69+
oss << "\n"
70+
<< prefix << osm2rdf::config::constants::ADD_AREA_METADATA_INFO;
71+
}
6872
}
6973
if (noNodeFacts) {
7074
oss << "\n" << prefix << osm2rdf::config::constants::NO_NODE_FACTS_INFO;
@@ -285,6 +289,10 @@ void osm2rdf::config::Config::fromArgs(int argc, char** argv) {
285289
osm2rdf::config::constants::ADD_AREA_ENVELOPE_RATIO_OPTION_SHORT,
286290
osm2rdf::config::constants::ADD_AREA_ENVELOPE_RATIO_OPTION_LONG,
287291
osm2rdf::config::constants::ADD_AREA_ENVELOPE_RATIO_OPTION_HELP);
292+
auto addAreaMetadataOp = parser.add<popl::Switch>(
293+
osm2rdf::config::constants::ADD_AREA_METADATA_OPTION_SHORT,
294+
osm2rdf::config::constants::ADD_AREA_METADATA_OPTION_LONG,
295+
osm2rdf::config::constants::ADD_AREA_METADATA_OPTION_HELP);
288296
auto addRelationBorderMembersOp = parser.add<popl::Switch>(
289297
osm2rdf::config::constants::ADD_RELATION_BORDER_MEMBERS_OPTION_SHORT,
290298
osm2rdf::config::constants::ADD_RELATION_BORDER_MEMBERS_OPTION_LONG,
@@ -459,6 +467,7 @@ void osm2rdf::config::Config::fromArgs(int argc, char** argv) {
459467
// Select amount to dump
460468
addAreaEnvelope = addAreaEnvelopeOp->is_set();
461469
addAreaEnvelopeRatio = addAreaEnvelopeRatioOp->is_set();
470+
addAreaMetadata = addAreaMetadataOp->is_set();
462471
addRelationBorderMembers = addRelationBorderMembersOp->is_set();
463472
#if BOOST_VERSION >= 107800
464473
addRelationEnvelope = addRelationEnvelopeOp->is_set();

src/osm/Area.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ osm2rdf::osm::Area::Area(const osmium::Area& area) : Area() {
100100
}
101101
oCount++;
102102
}
103+
_numPolygons = oCount;
103104

104105
_envelope = osm2rdf::geometry::Box({lonMin, latMin}, {lonMax, latMax});
105106
}
@@ -157,3 +158,8 @@ bool osm2rdf::osm::Area::fromWay() const noexcept {
157158
// https://github.com/osmcode/libosmium/blob/master/include/osmium/osm/area.hpp#L145-L153
158159
return (_id & 0x1U) == 0;
159160
}
161+
162+
// ____________________________________________________________________________
163+
size_t osm2rdf::osm::Area::numOuterPolygons() const noexcept {
164+
return _numPolygons;
165+
}

src/osm/FactHandler.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,15 @@ void osm2rdf::osm::FactHandler<W>::area(const osm2rdf::osm::Area& area) {
9898
_writer->generateIRIUnsafe(NAMESPACE__OSM_META, "area_envelope_ratio"),
9999
_writer->generateLiteralUnsafe(tmp.str(), "^^" + IRI__XSD_DOUBLE));
100100
}
101+
102+
if (_config.addAreaMetadata) {
103+
_writer->writeTriple(
104+
subj,
105+
_writer->generateIRIUnsafe(NAMESPACE__OSM_META,
106+
"multipolygon_outer_polygon_count"),
107+
_writer->generateLiteralUnsafe(std::to_string(area.numOuterPolygons()),
108+
"^^" + IRI__XSD_INTEGER));
109+
}
101110
}
102111

103112
// ____________________________________________________________________________

tests/config/Config.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ void assertDefaultConfig(const osm2rdf::config::Config& config) {
4242

4343
ASSERT_FALSE(config.addAreaEnvelope);
4444
ASSERT_FALSE(config.addAreaEnvelopeRatio);
45+
ASSERT_FALSE(config.addAreaMetadata);
4546
ASSERT_FALSE(config.addNodeEnvelope);
4647
ASSERT_FALSE(config.addRelationBorderMembers);
4748
ASSERT_TRUE(config.addSortMetadata);
@@ -662,6 +663,22 @@ TEST(CONFIG_Config, fromArgsAddAreaEnvelopeRatioLong) {
662663
ASSERT_TRUE(config.addAreaEnvelopeRatio);
663664
}
664665

666+
// ____________________________________________________________________________
667+
TEST(CONFIG_Config, fromArgsAddAreaMetadataLong) {
668+
osm2rdf::config::Config config;
669+
assertDefaultConfig(config);
670+
osm2rdf::util::CacheFile cf("/tmp/dummyInput");
671+
672+
const auto arg =
673+
"--" + osm2rdf::config::constants::ADD_AREA_METADATA_OPTION_LONG;
674+
const int argc = 3;
675+
char* argv[argc] = {const_cast<char*>(""), const_cast<char*>(arg.c_str()),
676+
const_cast<char*>("/tmp/dummyInput")};
677+
config.fromArgs(argc, argv);
678+
ASSERT_EQ("", config.output.string());
679+
ASSERT_TRUE(config.addAreaMetadata);
680+
}
681+
665682
// ____________________________________________________________________________
666683
TEST(CONFIG_Config, fromArgsAddNodeEnvelopeLong) {
667684
osm2rdf::config::Config config;
@@ -1043,6 +1060,18 @@ TEST(CONFIG_Config, getInfoAddAreaEnvelope) {
10431060
osm2rdf::config::constants::ADD_AREA_ENVELOPE_INFO));
10441061
}
10451062

1063+
// ____________________________________________________________________________
1064+
TEST(CONFIG_Config, getInfoAddAreaMetadata) {
1065+
osm2rdf::config::Config config;
1066+
assertDefaultConfig(config);
1067+
config.addAreaMetadata= true;
1068+
1069+
const std::string res = config.getInfo("");
1070+
ASSERT_THAT(res,
1071+
::testing::HasSubstr(
1072+
osm2rdf::config::constants::ADD_AREA_METADATA_INFO));
1073+
}
1074+
10461075
// ____________________________________________________________________________
10471076
TEST(CONFIG_Config, getInfoAddAreaEnvelopeRatio) {
10481077
osm2rdf::config::Config config;

tests/osm/FactHandler.cpp

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,57 @@ TEST(OSM_FactHandler, areaAddEnvelope) {
195195
std::cout.rdbuf(sbuf);
196196
}
197197

198+
// ____________________________________________________________________________
199+
TEST(OSM_FactHandler, areaAddMetadata) {
200+
// Capture std::cout
201+
std::stringstream buffer;
202+
std::streambuf* sbuf = std::cout.rdbuf();
203+
std::cout.rdbuf(buffer.rdbuf());
204+
205+
osm2rdf::config::Config config;
206+
config.output = "";
207+
config.outputCompress = false;
208+
config.mergeOutput = osm2rdf::util::OutputMergeMode::NONE;
209+
config.wktPrecision = 1;
210+
config.addAreaMetadata = true;
211+
config.addSortMetadata = false;
212+
213+
osm2rdf::util::Output output{config, config.output};
214+
output.open();
215+
osm2rdf::ttl::Writer<osm2rdf::ttl::format::TTL> writer{config, &output};
216+
osm2rdf::osm::FactHandler dh{config, &writer};
217+
218+
// Create osmium object
219+
const size_t initial_buffer_size = 10000;
220+
osmium::memory::Buffer osmiumBuffer{initial_buffer_size,
221+
osmium::memory::Buffer::auto_grow::yes};
222+
osmium::builder::add_area(osmiumBuffer, osmium::builder::attr::_id(42),
223+
osmium::builder::attr::_outer_ring({
224+
{1, {48.0, 7.51}},
225+
{2, {48.0, 7.61}},
226+
{3, {48.1, 7.61}},
227+
{4, {48.1, 7.51}},
228+
{1, {48.0, 7.51}},
229+
}),
230+
osmium::builder::attr::_tag("city", "Freiburg"));
231+
232+
// Create osm2rdf object from osmium object
233+
const osm2rdf::osm::Area a{osmiumBuffer.get<osmium::Area>(0)};
234+
235+
dh.area(a);
236+
output.flush();
237+
output.close();
238+
239+
ASSERT_EQ(
240+
"osmway:21 geo:hasGeometry \"MULTIPOLYGON(((48.0 7.5,48.0 7.6,48.1 "
241+
"7.6,48.1 7.5,48.0 7.5)))\"^^geo:wktLiteral .\n"
242+
"osmway:21 osmmeta:multipolygon_outer_polygon_count \"1\"^^xsd:integer .\n",
243+
buffer.str());
244+
245+
// Cleanup
246+
std::cout.rdbuf(sbuf);
247+
}
248+
198249
// ____________________________________________________________________________
199250
TEST(OSM_FactHandler, areaAddSortMetadata) {
200251
// Capture std::cout

0 commit comments

Comments
 (0)