Fix extraction in case of ways referencing invalid node ids

This commit is contained in:
Patrick Niklaus 2016-03-08 20:59:11 +01:00
parent adc3bacea9
commit ae4161b780

View File

@ -627,7 +627,7 @@ void ExtractionContainers::PrepareRestrictions()
if (way_start_and_end_iterator->way_id > if (way_start_and_end_iterator->way_id >
OSMWayID(restrictions_iterator->restriction.from.way)) OSMWayID(restrictions_iterator->restriction.from.way))
{ {
util::SimpleLogger().Write(LogLevel::logDEBUG) util::SimpleLogger().Write(LogLevel::logWARNING)
<< "Restriction references invalid way: " << "Restriction references invalid way: "
<< restrictions_iterator->restriction.from.way; << restrictions_iterator->restriction.from.way;
restrictions_iterator->restriction.from.node = SPECIAL_NODEID; restrictions_iterator->restriction.from.node = SPECIAL_NODEID;
@ -644,7 +644,7 @@ void ExtractionContainers::PrepareRestrictions()
auto via_id_iter = external_to_internal_node_id_map.find(via_node_id); auto via_id_iter = external_to_internal_node_id_map.find(via_node_id);
if (via_id_iter == external_to_internal_node_id_map.end()) if (via_id_iter == external_to_internal_node_id_map.end())
{ {
util::SimpleLogger().Write(LogLevel::logDEBUG) util::SimpleLogger().Write(LogLevel::logWARNING)
<< "Restriction references invalid node: " << "Restriction references invalid node: "
<< restrictions_iterator->restriction.via.node; << restrictions_iterator->restriction.via.node;
restrictions_iterator->restriction.via.node = SPECIAL_NODEID; restrictions_iterator->restriction.via.node = SPECIAL_NODEID;
@ -657,7 +657,16 @@ void ExtractionContainers::PrepareRestrictions()
// assign new from node id // assign new from node id
auto id_iter = external_to_internal_node_id_map.find( auto id_iter = external_to_internal_node_id_map.find(
OSMNodeID(way_start_and_end_iterator->first_segment_target_id)); OSMNodeID(way_start_and_end_iterator->first_segment_target_id));
BOOST_ASSERT(id_iter != external_to_internal_node_id_map.end()); if (id_iter == external_to_internal_node_id_map.end())
{
util::SimpleLogger().Write(LogLevel::logWARNING)
<< "Way references invalid node: "
<< way_start_and_end_iterator->first_segment_target_id;
restrictions_iterator->restriction.from.node = SPECIAL_NODEID;
++restrictions_iterator;
++way_start_and_end_iterator;
continue;
}
restrictions_iterator->restriction.from.node = id_iter->second; restrictions_iterator->restriction.from.node = id_iter->second;
} }
else if (OSMNodeID(way_start_and_end_iterator->last_segment_target_id) == via_node_id) else if (OSMNodeID(way_start_and_end_iterator->last_segment_target_id) == via_node_id)
@ -665,7 +674,16 @@ void ExtractionContainers::PrepareRestrictions()
// assign new from node id // assign new from node id
auto id_iter = external_to_internal_node_id_map.find( auto id_iter = external_to_internal_node_id_map.find(
OSMNodeID(way_start_and_end_iterator->last_segment_source_id)); OSMNodeID(way_start_and_end_iterator->last_segment_source_id));
BOOST_ASSERT(id_iter != external_to_internal_node_id_map.end()); if (id_iter == external_to_internal_node_id_map.end())
{
util::SimpleLogger().Write(LogLevel::logWARNING)
<< "Way references invalid node: "
<< way_start_and_end_iterator->last_segment_target_id;
restrictions_iterator->restriction.from.node = SPECIAL_NODEID;
++restrictions_iterator;
++way_start_and_end_iterator;
continue;
}
restrictions_iterator->restriction.from.node = id_iter->second; restrictions_iterator->restriction.from.node = id_iter->second;
} }
++restrictions_iterator; ++restrictions_iterator;
@ -726,14 +744,32 @@ void ExtractionContainers::PrepareRestrictions()
{ {
auto to_id_iter = external_to_internal_node_id_map.find( auto to_id_iter = external_to_internal_node_id_map.find(
OSMNodeID(way_start_and_end_iterator->first_segment_target_id)); OSMNodeID(way_start_and_end_iterator->first_segment_target_id));
BOOST_ASSERT(to_id_iter != external_to_internal_node_id_map.end()); if (to_id_iter == external_to_internal_node_id_map.end())
{
util::SimpleLogger().Write(LogLevel::logWARNING)
<< "Way references invalid node: "
<< way_start_and_end_iterator->first_segment_source_id;
restrictions_iterator->restriction.to.node = SPECIAL_NODEID;
++restrictions_iterator;
++way_start_and_end_iterator;
continue;
}
restrictions_iterator->restriction.to.node = to_id_iter->second; restrictions_iterator->restriction.to.node = to_id_iter->second;
} }
else if (OSMNodeID(way_start_and_end_iterator->last_segment_target_id) == via_node_id) else if (OSMNodeID(way_start_and_end_iterator->last_segment_target_id) == via_node_id)
{ {
auto to_id_iter = external_to_internal_node_id_map.find( auto to_id_iter = external_to_internal_node_id_map.find(
OSMNodeID(way_start_and_end_iterator->last_segment_source_id)); OSMNodeID(way_start_and_end_iterator->last_segment_source_id));
BOOST_ASSERT(to_id_iter != external_to_internal_node_id_map.end()); if (to_id_iter == external_to_internal_node_id_map.end())
{
util::SimpleLogger().Write(LogLevel::logWARNING)
<< "Way references invalid node: "
<< way_start_and_end_iterator->last_segment_source_id;
restrictions_iterator->restriction.to.node = SPECIAL_NODEID;
++restrictions_iterator;
++way_start_and_end_iterator;
continue;
}
restrictions_iterator->restriction.to.node = to_id_iter->second; restrictions_iterator->restriction.to.node = to_id_iter->second;
} }
++restrictions_iterator; ++restrictions_iterator;