diff --git a/hoot-core/src/main/cpp/hoot/core/visitors/RemoveInvalidMultilineStringMembersVisitor.cpp b/hoot-core/src/main/cpp/hoot/core/visitors/RemoveInvalidMultilineStringMembersVisitor.cpp
index 5492a07..729ba51 100644
--- a/hoot-core/src/main/cpp/hoot/core/visitors/RemoveInvalidMultilineStringMembersVisitor.cpp
+++ b/hoot-core/src/main/cpp/hoot/core/visitors/RemoveInvalidMultilineStringMembersVisitor.cpp
@@ -47,70 +47,96 @@ RemoveInvalidMultilineStringMembersVisitor::RemoveInvalidMultilineStringMembersV
void RemoveInvalidMultilineStringMembersVisitor::visit(const ElementPtr& e)
{
- // Only look for relations
+ // Only look for relations
if (e->getElementType() == ElementType::Relation)
{
Relation* r = dynamic_cast<Relation*>(e.get());
+ LOG_VART(r->getElementId());
assert(r != 0);
- // Only multilinestring relations
+ // Only multilinestring relations
if (r->getType() == MetadataTags::RelationMultilineString())
{
vector<RelationData::Entry> multi_members = r->getMembers();
Tags& tags = r->getTags();
- for (vector<RelationData::Entry>::iterator it = multi_members.begin(); it != multi_members.end(); ++it)
+ for (vector<RelationData::Entry>::iterator it = multi_members.begin();
+ it != multi_members.end(); ++it)
{
+ LOG_VART(_map->getElement(it->getElementId())->getTags().getInformationCount());
if (_map->getElement(it->getElementId())->getTags().getInformationCount() > 0)
return;
}
+
const double expansion = r->getCircularError() / 2.0;
OsmMapPtr map(_map->shared_from_this());
- // Multiline strings that are a part of a review relation are what we are targetting for replacement
+ // Multiline strings that are a part of a review relation are what we are targetting for
+ // replacement
set<ElementId> parents = map->getParents(r->getElementId());
for (set<ElementId>::iterator it = parents.begin(); it != parents.end(); ++it)
{
ElementPtr p = map->getElement(*it);
+ LOG_VART(p->getElementId());
if (p->getElementType() == ElementType::Relation)
{
Relation* rev = dynamic_cast<Relation*>(p.get());
+ LOG_VART(rev->getType());
+
if (rev->getType() == MetadataTags::RelationReview())
{
vector<RelationData::Entry> members = rev->getMembers();
- // Iterate all of the members of the review looking for non-relation entities
+ // Iterate all of the members of the review looking for non-relation entities
for (vector<RelationData::Entry>::iterator i = members.begin(); i != members.end(); i++)
{
ElementId id1 = i->getElementId();
+ LOG_VART(id1);
if (id1.getType() == ElementType::Relation)
continue;
- // Found a non-relation entity to test against
+ // Found a non-relation entity to test against
ElementPtr element1 = map->getElement(id1);
Envelope* env1 = element1->getEnvelope(map);
env1->expandBy(expansion);
- for (vector<RelationData::Entry>::iterator j = multi_members.begin(); j != multi_members.end(); j++)
+ for (vector<RelationData::Entry>::iterator j = multi_members.begin();
+ j != multi_members.end(); j++)
{
ElementId id2 = j->getElementId();
+ LOG_VART(id2);
ElementPtr element2 = _map->getElement(id2);
Envelope* env2 = element2->getEnvelope(map);
env2->expandBy(expansion);
// Add the element to the review if the two envelopes intersect
if (env1->intersects(env2))
+ {
+ LOG_TRACE("Adding element as reviewee: " << id2 << "...");
rev->addElement(MetadataTags::RoleReviewee(), id2);
+ }
}
}
- // There is a one-to-one relation here, replace the multilinestring with the only way
+
+ // There is a one-to-one relation here, replace the multilinestring with the only way
if (rev->getMembers().size() == 1 && r->getMembers().size() == 1)
+ {
+ LOG_TRACE(
+ "Adding element as reviewee: " << r->getMembers()[0].getElementId() << "...");
rev->addElement(MetadataTags::RoleReviewee(), r->getMembers()[0].getElementId());
- // Don't remove multilinestring relations that are members of a review relation
- // only contains one member that is the original multilinestring
+ }
+
+ // Don't remove multilinestring relations that are members of a review relation
+ // only contains one member that is the original multilinestring
if (rev->getMembers().size() > 1)
+ {
+ LOG_TRACE("Removing: " << r->getElementId() << "...");
rev->removeElement(r->getElementId());
+ }
}
}
}
- // Don't remove multilinestring relations that are members of a review relation
- // only contains one member that is the original multilinestring
+
+ // Don't remove multilinestring relations that are members of a review relation
+ // only contains one member that is the original multilinestring
+ LOG_VART(map->getParents(r->getElementId()).size());
if (map->getParents(r->getElementId()).size() > 0)
return;
- // Copy tags from the multiline string tags to the children and remove from relation
+
+ // Copy tags from the multiline string tags to the children and remove from relation
vector<RelationData::Entry> members = r->getMembers();
TagMergerFactory& merger = TagMergerFactory::getInstance();
for (vector<RelationData::Entry>::iterator i = members.begin(); i != members.end(); i++)
@@ -119,6 +145,7 @@ void RemoveInvalidMultilineStringMembersVisitor::visit(const ElementPtr& e)
ElementPtr element = _map->getElement(id);
Tags merged = merger.mergeTags(element->getTags(), tags, id.getType());
element->setTags(merged);
+ LOG_TRACE("Removing: " << id << "...");
r->removeElement(id);
}
RemoveRelationByEid::removeRelation(map, r->getId());