Example #1
0
void OsmMapIndex::preGeometryChange(Element* e)
{
  if (_nodeToWayMap != 0)
  {
    VALIDATE(_nodeToWayMap->validate(_map));
  }
  // if the element to relation map is being maintained and this is not a node. Node movement
  // doesn't impact any relation memberships.
  if (_elementToRelationMap != 0 && e->getElementType() != ElementType::Node)
  {
    assert(_pendingRelationChange.size() == 0);
    VALIDATE(_elementToRelationMap->validate(_map));
    // find out which relations will be impacted by the changes.
    _pendingRelationChange = _elementToRelationMap->getRelationByElement(e);

    // if the relation itself is being changed, then add it to the pending list.
    if (e->getElementType() == ElementType::Relation)
    {
      _pendingRelationChange.insert(e->getId());
    }

    // remove all the relations that are being impacted.
    for (set<long>::iterator it = _pendingRelationChange.begin();
      it != _pendingRelationChange.end(); ++it)
    {
      _elementToRelationMap->removeRelation(_map, _map.getRelation(*it));
    }
  }
  if (e->getElementType() == ElementType::Way)
  {
    removeWay(_map.getWay(e->getId()));
  }
}
Example #2
0
void RemoveElementOp::apply(OsmMapPtr& map)
{
  if (ElementType::Node == _eIdToRemove.getType().getEnum())
  {
    // Remove node fully (Removes node from relations & ways, then removes node from map)
    RemoveNodeOp removeNode(_eIdToRemove.getId(), _doCheck, true);
    removeNode.apply(map);
  }
  else if (ElementType::Way == _eIdToRemove.getType().getEnum())
  {
    RemoveWayOp removeWay(_eIdToRemove.getId(), _doCheck);
    removeWay.apply(map);
  }
  else if (ElementType::Relation == _eIdToRemove.getType().getEnum())
  {
    RemoveRelationOp removeRelation(_eIdToRemove.getId());
    removeRelation.apply(map);
  }
  else
  {
    throw HootException(QString("Unexpected element type: %1").arg(_eIdToRemove.toString()));
  }
}