Skip to content

Commit 07a9f65

Browse files
authored
Don't consider untagged nodes for geometric relations by default (ad-freiburg#107)
Since ad-freiburg#101, the geometries of untagged nodes are written by default. This adds around 10 billion triples for OSM Planet, which is fine. However, considering these nodes for the geometric relations (`contains`, `intersects`, ...) adds an enormous number of triples. It is also not necessary since the information which node is a member of which way can be obtained via ad-freiburg#111. Therefore, the default is now to *not* consider untagged nodes for the geometric relations, but to output the triples that express which node is a member of which way. The triples that express which way is a member of which relation were already output by default before. To change the new default behavior, there are now the options `--add-untagged-nodes-geometric-relations` (to consider untagged nodes for the geometric relations, despite the enormous number of triples this incurs) and `--no-member-triples` (to *not* output the triples that express which node is a member of which way and which way is a member of which relation).
1 parent d25298f commit 07a9f65

File tree

9 files changed

+102
-76
lines changed

9 files changed

+102
-76
lines changed

include/osm2rdf/config/Config.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ struct Config {
7171
bool addAreaWayLinestrings = false;
7272
bool addCentroids = true;
7373
bool addWayMetadata = false;
74-
bool addWayNodeOrder = false;
74+
bool addMemberTriples = true;
7575
bool addWayNodeSpatialMetadata = false;
7676
bool skipWikiLinks = false;
7777
bool addOsmMetadata = true;
@@ -81,6 +81,8 @@ struct Config {
8181
bool addUntaggedRelations = true;
8282
bool addUntaggedAreas = true;
8383

84+
bool addSpatialRelsForUntaggedNodes = true;
85+
8486
int numThreads = std::thread::hardware_concurrency();
8587

8688
// Default settings for data

include/osm2rdf/config/Constants.h

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -183,6 +183,14 @@ const static inline std::string NO_WAY_GEOM_RELATIONS_OPTION_LONG =
183183
const static inline std::string NO_WAY_GEOM_RELATIONS_OPTION_HELP =
184184
"Do not dump way geometric relations";
185185

186+
const static inline std::string UNTAGGED_NODES_SPATIAL_RELS_INFO =
187+
"Compute spatial relations involving untagged nodes";
188+
const static inline std::string UNTAGGED_NODES_SPATIAL_RELS_OPTION_SHORT = "";
189+
const static inline std::string UNTAGGED_NODES_SPATIAL_RELS_OPTION_LONG =
190+
"add-untagged-nodes-geometric-relations";
191+
const static inline std::string UNTAGGED_NODES_SPATIAL_RELS_OPTION_HELP =
192+
"Compute spatial relations involving untagged nodes";
193+
186194
const static inline std::string NO_UNTAGGED_NODES_INFO =
187195
"Do not output untagged nodes";
188196
const static inline std::string NO_UNTAGGED_NODES_OPTION_SHORT = "";
@@ -237,13 +245,13 @@ const static inline std::string ADD_WAY_METADATA_OPTION_LONG =
237245
const static inline std::string ADD_WAY_METADATA_OPTION_HELP =
238246
"Add information about the way structure";
239247

240-
const static inline std::string ADD_WAY_NODE_ORDER_INFO =
241-
"Adding way node order";
242-
const static inline std::string ADD_WAY_NODE_ORDER_OPTION_SHORT = "";
243-
const static inline std::string ADD_WAY_NODE_ORDER_OPTION_LONG =
244-
"add-way-node-order";
245-
const static inline std::string ADD_WAY_NODE_ORDER_OPTION_HELP =
246-
"Add information about the node members in ways";
248+
const static inline std::string NO_MEMBER_TRIPLES_INFO =
249+
"Do not write member triples for relations and ways";
250+
const static inline std::string NO_MEMBER_TRIPLES_OPTION_SHORT = "";
251+
const static inline std::string NO_MEMBER_TRIPLES_OPTION_LONG =
252+
"no-member-triples";
253+
const static inline std::string NO_MEMBER_TRIPLES_OPTION_HELP =
254+
"Do not write member triples for relations and ways";
247255

248256
const static inline std::string ADD_WAY_NODE_SPATIAL_METADATA_INFO =
249257
"Adding way metadata";

src/config/Config.cpp

Lines changed: 36 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,9 @@ std::string osm2rdf::config::Config::getInfo(std::string_view prefix) const {
7272
oss << "\n"
7373
<< prefix << osm2rdf::config::constants::ADD_WAY_METADATA_INFO;
7474
}
75-
if (addWayNodeOrder) {
75+
if (!addMemberTriples) {
7676
oss << "\n"
77-
<< prefix << osm2rdf::config::constants::ADD_WAY_NODE_ORDER_INFO;
77+
<< prefix << osm2rdf::config::constants::NO_MEMBER_TRIPLES_INFO;
7878
}
7979
if (addWayNodeSpatialMetadata) {
8080
oss << "\n"
@@ -103,6 +103,11 @@ std::string osm2rdf::config::Config::getInfo(std::string_view prefix) const {
103103
oss << "\n"
104104
<< prefix << osm2rdf::config::constants::NO_UNTAGGED_AREAS_INFO;
105105
}
106+
if (addSpatialRelsForUntaggedNodes) {
107+
oss << "\n"
108+
<< prefix
109+
<< osm2rdf::config::constants::UNTAGGED_NODES_SPATIAL_RELS_INFO;
110+
}
106111
if (simplifyWKT > 0) {
107112
oss << "\n" << prefix << osm2rdf::config::constants::SIMPLIFY_WKT_INFO;
108113
oss << "\n"
@@ -280,29 +285,32 @@ void osm2rdf::config::Config::fromArgs(int argc, char** argv) {
280285
osm2rdf::config::constants::ADD_AREA_WAY_LINESTRINGS_OPTION_LONG,
281286
osm2rdf::config::constants::ADD_AREA_WAY_LINESTRINGS_OPTION_HELP);
282287

283-
auto noUntaggedNodesOp =
284-
parser.add<popl::Switch, popl::Attribute::expert>(
285-
osm2rdf::config::constants::NO_UNTAGGED_NODES_OPTION_SHORT,
286-
osm2rdf::config::constants::NO_UNTAGGED_NODES_OPTION_LONG,
287-
osm2rdf::config::constants::NO_UNTAGGED_NODES_OPTION_HELP);
288+
auto untaggedNodesSpatialRelsOp = parser.add<popl::Switch,
289+
popl::Attribute::expert>(
290+
osm2rdf::config::constants::UNTAGGED_NODES_SPATIAL_RELS_OPTION_SHORT,
291+
osm2rdf::config::constants::UNTAGGED_NODES_SPATIAL_RELS_OPTION_LONG,
292+
osm2rdf::config::constants::UNTAGGED_NODES_SPATIAL_RELS_OPTION_HELP);
288293

289-
auto noUntaggedWaysOp =
290-
parser.add<popl::Switch, popl::Attribute::expert>(
291-
osm2rdf::config::constants::NO_UNTAGGED_WAYS_OPTION_SHORT,
292-
osm2rdf::config::constants::NO_UNTAGGED_WAYS_OPTION_LONG,
293-
osm2rdf::config::constants::NO_UNTAGGED_WAYS_OPTION_HELP);
294+
auto noUntaggedNodesOp = parser.add<popl::Switch, popl::Attribute::expert>(
295+
osm2rdf::config::constants::NO_UNTAGGED_NODES_OPTION_SHORT,
296+
osm2rdf::config::constants::NO_UNTAGGED_NODES_OPTION_LONG,
297+
osm2rdf::config::constants::NO_UNTAGGED_NODES_OPTION_HELP);
298+
299+
auto noUntaggedWaysOp = parser.add<popl::Switch, popl::Attribute::expert>(
300+
osm2rdf::config::constants::NO_UNTAGGED_WAYS_OPTION_SHORT,
301+
osm2rdf::config::constants::NO_UNTAGGED_WAYS_OPTION_LONG,
302+
osm2rdf::config::constants::NO_UNTAGGED_WAYS_OPTION_HELP);
294303

295304
auto noUntaggedRelationsOp =
296305
parser.add<popl::Switch, popl::Attribute::expert>(
297306
osm2rdf::config::constants::NO_UNTAGGED_RELATIONS_OPTION_SHORT,
298307
osm2rdf::config::constants::NO_UNTAGGED_RELATIONS_OPTION_LONG,
299308
osm2rdf::config::constants::NO_UNTAGGED_RELATIONS_OPTION_HELP);
300309

301-
auto noUntaggedAreasOp =
302-
parser.add<popl::Switch, popl::Attribute::expert>(
303-
osm2rdf::config::constants::NO_UNTAGGED_AREAS_OPTION_SHORT,
304-
osm2rdf::config::constants::NO_UNTAGGED_AREAS_OPTION_LONG,
305-
osm2rdf::config::constants::NO_UNTAGGED_AREAS_OPTION_HELP);
310+
auto noUntaggedAreasOp = parser.add<popl::Switch, popl::Attribute::expert>(
311+
osm2rdf::config::constants::NO_UNTAGGED_AREAS_OPTION_SHORT,
312+
osm2rdf::config::constants::NO_UNTAGGED_AREAS_OPTION_LONG,
313+
osm2rdf::config::constants::NO_UNTAGGED_AREAS_OPTION_HELP);
306314

307315
auto noOsmMetadataOp = parser.add<popl::Switch>(
308316
osm2rdf::config::constants::NO_OSM_METADATA_OPTION_SHORT,
@@ -312,10 +320,10 @@ void osm2rdf::config::Config::fromArgs(int argc, char** argv) {
312320
osm2rdf::config::constants::ADD_WAY_METADATA_OPTION_SHORT,
313321
osm2rdf::config::constants::ADD_WAY_METADATA_OPTION_LONG,
314322
osm2rdf::config::constants::ADD_WAY_METADATA_OPTION_HELP);
315-
auto addWayNodeOrderOp = parser.add<popl::Switch>(
316-
osm2rdf::config::constants::ADD_WAY_NODE_ORDER_OPTION_SHORT,
317-
osm2rdf::config::constants::ADD_WAY_NODE_ORDER_OPTION_LONG,
318-
osm2rdf::config::constants::ADD_WAY_NODE_ORDER_OPTION_HELP);
323+
auto noMemberTriplesOp = parser.add<popl::Switch>(
324+
osm2rdf::config::constants::NO_MEMBER_TRIPLES_OPTION_SHORT,
325+
osm2rdf::config::constants::NO_MEMBER_TRIPLES_OPTION_LONG,
326+
osm2rdf::config::constants::NO_MEMBER_TRIPLES_OPTION_HELP);
319327
auto addWayNodeSpatialMetadataOp = parser.add<popl::Switch>(
320328
osm2rdf::config::constants::ADD_WAY_NODE_SPATIAL_METADATA_OPTION_SHORT,
321329
osm2rdf::config::constants::ADD_WAY_NODE_SPATIAL_METADATA_OPTION_LONG,
@@ -479,20 +487,22 @@ void osm2rdf::config::Config::fromArgs(int argc, char** argv) {
479487
addCentroids = !noAddCentroidsOp->is_set();
480488
addWayMetadata = addWayMetadataOp->is_set();
481489
addOsmMetadata = !noOsmMetadataOp->is_set();
482-
addWayNodeOrder = addWayNodeOrderOp->is_set();
490+
addMemberTriples = !noMemberTriplesOp->is_set();
483491
addWayNodeSpatialMetadata = addWayNodeSpatialMetadataOp->is_set();
484492
skipWikiLinks = skipWikiLinksOp->is_set();
485493
simplifyGeometries = simplifyGeometriesOp->value();
486494
simplifyWKT = simplifyWKTOp->value();
487495
wktDeviation = wktDeviationOp->value();
488496
wktPrecision = wktPrecisionOp->value();
489497

498+
addSpatialRelsForUntaggedNodes = untaggedNodesSpatialRelsOp->is_set();
499+
490500
addUntaggedNodes = !noUntaggedNodesOp->is_set();
491501
addUntaggedWays = !noUntaggedWaysOp->is_set();
492502
addUntaggedRelations = !noUntaggedRelationsOp->is_set();
493503
addUntaggedAreas = !noUntaggedAreasOp->is_set();
494504

495-
addWayNodeOrder |= addWayNodeSpatialMetadata;
505+
addMemberTriples |= addWayNodeSpatialMetadata;
496506

497507
if (semicolonTagKeysOp->is_set()) {
498508
for (size_t i = 0; i < semicolonTagKeysOp->count(); ++i) {
@@ -519,10 +529,9 @@ void osm2rdf::config::Config::fromArgs(int argc, char** argv) {
519529
} else if (outputCompressOp->value() == "bz2") {
520530
outputCompress = BZ2;
521531
} else {
522-
throw popl::invalid_option(
523-
outputCompressOp.get(),
524-
popl::invalid_option::Error::invalid_argument,
525-
popl::OptionName::long_name, outputCompressOp->value(), "");
532+
throw popl::invalid_option(
533+
outputCompressOp.get(), popl::invalid_option::Error::invalid_argument,
534+
popl::OptionName::long_name, outputCompressOp->value(), "");
526535
}
527536

528537
outputKeepFiles = outputKeepFilesOp->is_set();

src/osm/FactHandler.cpp

Lines changed: 32 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -189,36 +189,38 @@ void osm2rdf::osm::FactHandler<W>::relation(
189189
// Tags
190190
writeTagList(subj, relation.tags());
191191

192-
size_t inRelPos = 0;
193-
for (const auto& member : relation.members()) {
194-
std::string type;
195-
switch (member.type()) {
196-
case osm2rdf::osm::RelationMemberType::NODE:
197-
type = NODE_NAMESPACE[_config.sourceDataset];
198-
break;
199-
case osm2rdf::osm::RelationMemberType::RELATION:
200-
type = RELATION_NAMESPACE[_config.sourceDataset];
201-
break;
202-
case osm2rdf::osm::RelationMemberType::WAY:
203-
type = WAY_NAMESPACE[_config.sourceDataset];
204-
break;
205-
default:
206-
continue;
207-
}
192+
if (_config.addMemberTriples && relation.members().size()) {
193+
size_t inRelPos = 0;
194+
for (const auto& member : relation.members()) {
195+
std::string type;
196+
switch (member.type()) {
197+
case osm2rdf::osm::RelationMemberType::NODE:
198+
type = NODE_NAMESPACE[_config.sourceDataset];
199+
break;
200+
case osm2rdf::osm::RelationMemberType::RELATION:
201+
type = RELATION_NAMESPACE[_config.sourceDataset];
202+
break;
203+
case osm2rdf::osm::RelationMemberType::WAY:
204+
type = WAY_NAMESPACE[_config.sourceDataset];
205+
break;
206+
default:
207+
continue;
208+
}
208209

209-
const std::string& role = member.role();
210-
const std::string& blankNode = _writer->generateBlankNode();
211-
_writer->writeTriple(
212-
subj, _writer->generateIRIUnsafe(NAMESPACE__OSM_RELATION, "member"),
213-
blankNode);
214-
215-
_writer->writeTriple(blankNode, IRI__OSMREL__MEMBER_ID,
216-
_writer->generateIRI(type, member.id()));
217-
_writer->writeTriple(blankNode, IRI__OSMREL__MEMBER_ROLE,
218-
_writer->generateLiteral(role));
219-
_writer->writeLiteralTripleUnsafe(blankNode, IRI__OSMREL__MEMBER_POS,
220-
std::to_string(inRelPos++),
221-
"^^" + IRI__XSD__INTEGER);
210+
const std::string& role = member.role();
211+
const std::string& blankNode = _writer->generateBlankNode();
212+
_writer->writeTriple(
213+
subj, _writer->generateIRIUnsafe(NAMESPACE__OSM_RELATION, "member"),
214+
blankNode);
215+
216+
_writer->writeTriple(blankNode, IRI__OSMREL__MEMBER_ID,
217+
_writer->generateIRI(type, member.id()));
218+
_writer->writeTriple(blankNode, IRI__OSMREL__MEMBER_ROLE,
219+
_writer->generateLiteral(role));
220+
_writer->writeLiteralTripleUnsafe(blankNode, IRI__OSMREL__MEMBER_POS,
221+
std::to_string(inRelPos++),
222+
"^^" + IRI__XSD__INTEGER);
223+
}
222224
}
223225

224226
if (relation.hasGeometry()) {
@@ -264,7 +266,7 @@ void osm2rdf::osm::FactHandler<W>::way(const osm2rdf::osm::Way& way) {
264266
// Tags
265267
writeTagList(subj, way.tags());
266268

267-
if (_config.addWayNodeOrder && way.nodes().size()) {
269+
if (_config.addMemberTriples && way.nodes().size()) {
268270
size_t wayOrder = 0;
269271
std::string lastBlankNode;
270272
auto lastNode = way.nodes().front();

src/osm/OsmiumHandler.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,8 @@ void osm2rdf::osm::OsmiumHandler<W>::node(const osmium::Node& node) {
208208
_progressBar.update(_numTasksDone++);
209209
}
210210
}
211-
if (!_config.noGeometricRelations && !_config.noNodeGeometricRelations) {
211+
if (!_config.noGeometricRelations && !_config.noNodeGeometricRelations &&
212+
(!osmNode.tags().empty() || _config.addSpatialRelsForUntaggedNodes)) {
212213
_geometryHandler->node(osmNode);
213214
#pragma omp critical(progress)
214215
{

tests/E2E.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -357,6 +357,7 @@ TEST(E2E, osmWikiExample) {
357357
// stringstream read buffer
358358
config.outputCompress = osm2rdf::config::NONE;
359359
config.mergeOutput = osm2rdf::util::OutputMergeMode::NONE;
360+
config.addMemberTriples = true;
360361

361362
// Create empty input file
362363
config.input = config.getTempPath("E2E", "osmWikiExample.osm");
@@ -432,7 +433,7 @@ TEST(E2E, osmWikiExample) {
432433
ASSERT_THAT(printedData,
433434
::testing::HasSubstr("osmrel:56688 rdf:type osm:relation .\n"));
434435
ASSERT_THAT(printedData,
435-
::testing::HasSubstr("_2 osmrel:member_id osmway:26659127 .\n"));
436+
::testing::HasSubstr(" osmrel:member_id osmway:26659127 .\n"));
436437

437438
// Reset std::cerr and std::cout
438439
std::cerr.rdbuf(cerrBufferOrig);

tests/config/Config.cpp

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

4444
ASSERT_FALSE(config.addAreaWayLinestrings);
45-
ASSERT_FALSE(config.addWayNodeOrder);
45+
ASSERT_TRUE(config.addMemberTriples);
4646
ASSERT_FALSE(config.addWayNodeSpatialMetadata);
4747
ASSERT_FALSE(config.addWayMetadata);
4848
ASSERT_FALSE(config.skipWikiLinks);
@@ -584,13 +584,13 @@ TEST(CONFIG_Config, fromArgsAddWayNodeOrderLong) {
584584
osm2rdf::util::CacheFile cf("/tmp/dummyInput");
585585

586586
const auto arg =
587-
"--" + osm2rdf::config::constants::ADD_WAY_NODE_ORDER_OPTION_LONG;
587+
"--" + osm2rdf::config::constants::NO_MEMBER_TRIPLES_OPTION_LONG;
588588
const int argc = 3;
589589
char* argv[argc] = {const_cast<char*>(""), const_cast<char*>(arg.c_str()),
590590
const_cast<char*>("/tmp/dummyInput")};
591591
config.fromArgs(argc, argv);
592592
ASSERT_EQ("", config.output.string());
593-
ASSERT_TRUE(config.addWayNodeOrder);
593+
ASSERT_TRUE(!config.addMemberTriples);
594594
}
595595

596596
// ____________________________________________________________________________
@@ -608,7 +608,7 @@ TEST(CONFIG_Config, fromArgsAddWayNodeSpatialMetadataLong) {
608608
config.fromArgs(argc, argv);
609609
ASSERT_EQ("", config.output.string());
610610
ASSERT_TRUE(config.addWayNodeSpatialMetadata);
611-
ASSERT_TRUE(config.addWayNodeOrder);
611+
ASSERT_TRUE(config.addMemberTriples);
612612
}
613613

614614
// ____________________________________________________________________________
@@ -877,11 +877,11 @@ TEST(CONFIG_Config, getInfoAddWayMetadata) {
877877
TEST(CONFIG_Config, getInfoAddWayNodeOrder) {
878878
osm2rdf::config::Config config;
879879
assertDefaultConfig(config);
880-
config.addWayNodeOrder = true;
880+
config.addMemberTriples = false;
881881

882882
const std::string res = config.getInfo("");
883883
ASSERT_THAT(res, ::testing::HasSubstr(
884-
osm2rdf::config::constants::ADD_WAY_NODE_ORDER_INFO));
884+
osm2rdf::config::constants::NO_MEMBER_TRIPLES_INFO));
885885
}
886886

887887
// ____________________________________________________________________________

tests/issues/Issue24.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,6 +305,7 @@ TEST(Issue24, wayHasGeometryAsGeoSPARQL) {
305305
config.addCentroids = false;
306306
config.mergeOutput = osm2rdf::util::OutputMergeMode::NONE;
307307
config.wktPrecision = 1;
308+
config.addMemberTriples = false;
308309

309310
osm2rdf::util::Output output{config, config.output};
310311
output.open();

tests/osm/FactHandler.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -480,6 +480,7 @@ TEST(OSM_FactHandler, way) {
480480
config.addCentroids = false;
481481
config.mergeOutput = osm2rdf::util::OutputMergeMode::NONE;
482482
config.wktPrecision = 1;
483+
config.addMemberTriples = false;
483484

484485
osm2rdf::util::Output output{config, config.output};
485486
output.open();
@@ -542,7 +543,7 @@ TEST(OSM_FactHandler, wayAddWayNodeOrder) {
542543
config.addCentroids = false;
543544
config.mergeOutput = osm2rdf::util::OutputMergeMode::NONE;
544545
config.wktPrecision = 1;
545-
config.addWayNodeOrder = true;
546+
config.addMemberTriples = true;
546547

547548
osm2rdf::util::Output output{config, config.output};
548549
output.open();
@@ -606,7 +607,7 @@ TEST(OSM_FactHandler, wayAddWayNodeSpatialMetadataShortWay) {
606607
config.addCentroids = false;
607608
config.mergeOutput = osm2rdf::util::OutputMergeMode::NONE;
608609
config.wktPrecision = 1;
609-
config.addWayNodeOrder = true;
610+
config.addMemberTriples = true;
610611
config.addWayNodeSpatialMetadata = true;
611612

612613
osm2rdf::util::Output output{config, config.output};
@@ -673,7 +674,7 @@ TEST(OSM_FactHandler, wayAddWayNodeSpatialMetadataLongerWay) {
673674
config.addCentroids = false;
674675
config.mergeOutput = osm2rdf::util::OutputMergeMode::NONE;
675676
config.wktPrecision = 1;
676-
config.addWayNodeOrder = true;
677+
config.addMemberTriples = true;
677678
config.addWayNodeSpatialMetadata = true;
678679
config.addAreaWayLinestrings = true;
679680

@@ -746,6 +747,7 @@ TEST(OSM_FactHandler, wayAddWayMetaData) {
746747
config.mergeOutput = osm2rdf::util::OutputMergeMode::NONE;
747748
config.wktPrecision = 1;
748749
config.addWayMetadata = true;
750+
config.addMemberTriples = false;
749751

750752
osm2rdf::util::Output output{config, config.output};
751753
output.open();

0 commit comments

Comments
 (0)