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())); } }
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())); } }