void RemoveUnknown1Visitor::visit(const shared_ptr<Element>& e)
{
  if (e->getStatus() == Status::Unknown1)
  {
    RecursiveElementRemover(e->getElementId()).apply(_map->shared_from_this());
  }
}
void PertyRemoveRandomElementVisitor::visit(const ConstElementPtr& e)
{
  boost::uniform_real<> uni(0.0, 1.0);
  if (uni(*_rng) <= _p)
  {
    RecursiveElementRemover(ElementId(e->getElementType(), e->getId())).apply(_map->shared_from_this());
  }
}
Example #3
0
 virtual void visit(const shared_ptr<Element>& e)
 {
   if (_criterion->isSatisfied(e))
   {
     NotCriterion nc(_criterion);
     RecursiveElementRemover(e->getElementId(), &nc).apply(_map->shared_from_this());
   }
 }
void RemoveDuplicateAreaVisitor::_removeOne(shared_ptr<Element> e1, shared_ptr<Element> e2)
{
  if (e1->getTags().size() > e2->getTags().size())
  {
    RecursiveElementRemover(e2->getElementId()).apply(_map->shared_from_this());
  }
  else if (e1->getTags().size() < e2->getTags().size())
  {
    RecursiveElementRemover(e1->getElementId()).apply(_map->shared_from_this());
  }
  else if (e1->getId() < e2->getId())
  {
    RecursiveElementRemover(e1->getElementId()).apply(_map->shared_from_this());
  }
  else
  {
    RecursiveElementRemover(e2->getElementId()).apply(_map->shared_from_this());
  }
}
    virtual void visit(ElementType type, long id)
    {
      ElementId eid(type, id);

      ElementPtr e = _map->getElement(eid);

      if (e->getTags().get("REF1") != _ref && e->getTags().get("REF2") != _ref)
      {
        RecursiveElementRemover(eid).apply(_map);
      }
    }
void DecomposeBuildingRelationsVisitor::_decomposeBuilding(const shared_ptr<Relation>& r)
{
  Tags baseTags = r->getTags();

  const vector<RelationData::Entry> members = r->getMembers();

  for (size_t i = 0; i < members.size(); ++i)
  {
    ElementId eid = members[i].getElementId();
    r->removeElement(eid);
    if (eid.getType() == ElementType::Node)
    {
      LOG_WARN("Unexpected node encountered in building relation. " << r->getElementId());
      continue;
    }
    // we're dropping the outline. We only care about the parts.
    else if (members[i].getRole() == "outline")
    {
      continue;
    }
    else if (members[i].getRole() != "part")
    {
      LOG_WARN("Encountered an unexpected role in a building relation. " << r->getElementId());
    }

    // ok, we've got a building part. Recompose it as a building.
    shared_ptr<Element> e = _map->getElement(members[i].getElementId());

    Tags t = baseTags;
    t.addTags(e->getTags());
    // don't need the building:part tag anymore.
    t.remove("building:part");

    if (!t.contains("building"))
    {
      t["building"] = "yes";
    }

    e->setTags(t);
  }

  // remove the building relation
  RecursiveElementRemover(r->getElementId()).apply(_map->shared_from_this());
}
void RemoveElementsVisitor::visit(const ConstElementPtr& e)
{
  assert(_filter);
  ElementType type = e->getElementType();
  long id = e->getId();
  const shared_ptr<Element>& ee = _map->getElement(type, id);

  if (_filter->isSatisfied(ee))
  {
    if (_recursive)
    {
      RecursiveElementRemover(ee->getElementId()).apply(_map->shared_from_this());
    }
    else
    {
      _map->removeElement(ElementId(type, id));
    }
  }
}
void PoiPolygonMerger::apply(const OsmMapPtr& map,
  vector< pair<ElementId, ElementId> >& replaced) const
{
  ////
  // See "Hootenanny - POI to Building" powerpoint for more details.
  ////

  // merge all POI tags first, but keep Unknown1 and Unknown2 separate. It is implicitly assumed
  // that since they're in a single group they all represent the same entity.
  Tags poiTags1 = _mergePoiTags(map, Status::Unknown1);
  Tags poiTags2 = _mergePoiTags(map, Status::Unknown2);

  // Get all the building parts for each status
  vector<ElementId> buildings1 = _getBuildingParts(map, Status::Unknown1);
  vector<ElementId> buildings2 = _getBuildingParts(map, Status::Unknown2);

  // Merge all the building parts together into a single building entity using the typical building
  // merge process.
  ElementId finalBuildingEid = _mergeBuildings(map, buildings1, buildings2, replaced);

  ElementPtr finalBuilding = map->getElement(finalBuildingEid);

  Tags finalBuildingTags = finalBuilding->getTags();
  if (poiTags1.size())
  {
    finalBuildingTags = TagMergerFactory::getInstance().mergeTags(poiTags1, finalBuildingTags,
      finalBuilding->getElementType());
  }
  if (poiTags2.size())
  {
    finalBuildingTags = TagMergerFactory::getInstance().mergeTags(finalBuildingTags,
      poiTags2, finalBuilding->getElementType());
  }
  finalBuilding->setTags(finalBuildingTags);

  // do some book keeping to remove the POIs and mark them as replaced.
  for (set< pair<ElementId, ElementId> >::const_iterator it = _pairs.begin(); it != _pairs.end();
       ++it)
  {
    const pair<ElementId, ElementId>& p = *it;
    if (p.first.getType() == ElementType::Node)
    {
      replaced.push_back(pair<ElementId, ElementId>(p.first, finalBuildingEid));
      // clear the tags just in case it is part of a way
      if (map->containsElement(p.first))
      {
        map->getElement(p.first)->getTags().clear();
        RecursiveElementRemover(p.first).apply(map);
      }
    }

    if (p.second.getType() == ElementType::Node)
    {
      replaced.push_back(pair<ElementId, ElementId>(p.second, finalBuildingEid));
      // clear the tags just in case it is part of a way
      if (map->containsElement(p.second))
      {
        map->getElement(p.second)->getTags().clear();
        RecursiveElementRemover(p.second).apply(map);
      }
    }
  }
}