From 220d6e0149f672f372f47f93b9c25fbaf08c5ab4 Mon Sep 17 00:00:00 2001 From: Otmane Lahlou <otmane.lahlou@c-s.fr> Date: Fri, 11 May 2012 17:55:02 +0200 Subject: [PATCH] ENH: add method to remove geometries within an ROI (wip) --- .../otbVectorDataEditionModel.cxx | 69 ++++++++++++++++++- .../Visualization/otbVectorDataEditionModel.h | 4 ++ 2 files changed, 72 insertions(+), 1 deletion(-) diff --git a/Code/Visualization/otbVectorDataEditionModel.cxx b/Code/Visualization/otbVectorDataEditionModel.cxx index f615b036f6..0bb1502183 100644 --- a/Code/Visualization/otbVectorDataEditionModel.cxx +++ b/Code/Visualization/otbVectorDataEditionModel.cxx @@ -17,7 +17,6 @@ =========================================================================*/ #include "otbVectorDataEditionModel.h" -#include "otbVectorDataFileWriter.h" #include "itkTimeProbe.h" @@ -216,5 +215,73 @@ void VectorDataEditionModel::DeleteSelectedGeometry() } } +void VectorDataEditionModel +::DeleteSelectedGeometriesInROI(itk::ImageRegion<2> rsRegion) +{ + itk::TimeProbe chrono; + chrono.Start(); + + // From RemoteSensingRegion To Datanode (polygon) + DataNodeType::Pointer regionNode = DataNodeType::New(); + PolygonType::Pointer regionPolygon = PolygonType::New(); + // Set the type of the datanode + regionNode->SetNodeId("FEATURE_POLYGON"); + regionNode->SetNodeType(otb::FEATURE_POLYGON); + regionNode->SetPolygonExteriorRing(regionPolygon); + + // Add the verticies to the polygon + VertexType p; + VertexType ul,ur, ll, lr; + ul[0] = rsRegion.GetIndex()[0]; + ul[1] = rsRegion.GetIndex()[1]; + regionPolygon->AddVertex(ul); + + ur[0] = rsRegion.GetIndex()[0] + rsRegion.GetSize()[0]; + ur[1] = rsRegion.GetIndex()[1]; + regionPolygon->AddVertex(ur); + + ll[0] = rsRegion.GetIndex()[0] + rsRegion.GetSize()[0]; + ll[1] = rsRegion.GetIndex()[1] + rsRegion.GetSize()[1]; + regionPolygon->AddVertex(ll); + + lr[0] = rsRegion.GetIndex()[0]; + lr[1] = rsRegion.GetIndex()[1] + rsRegion.GetSize()[1]; + regionPolygon->AddVertex(lr); + + // Search the geometries within or intersecting the bounding region + // and delete them + itk::PreOrderTreeIterator<VectorDataType::DataTreeType> it(this->GetVectorData()->GetDataTree()); + it.GoToBegin(); + int count = 0; + int nbGeomDeleted = 0; + std::vector<unsigned int> geomToDelete; + while (!it.IsAtEnd() ) + { + if (it.Get()->IsPointFeature() || it.Get()->IsLineFeature() || it.Get()->IsPolygonFeature()) + { + // check if the geometry intersects or is within the bounding box + if ( it.Get()->Intersects(regionNode) || it.Get()->Within(regionNode)) + { + geomToDelete.push_back(count); + // this->SetSelectedGeometry(count); + // this->DeleteGeometry(); + nbGeomDeleted++; + } + count++; + } + ++it; + } + + for (unsigned int idx = 0 ; idx < geomToDelete.size(); idx++) + { + this->SetSelectedGeometry(geomToDelete[idx] - idx); + this->DeleteGeometry(); + } + + chrono.Stop(); + std::cout<< "\tVectorDataEditionModel::DeleteWithinROI -> "<< nbGeomDeleted << " geometries deleted / " + << count <<" in " << chrono.GetMeanTime() << " seconds." <<std::endl; +} + } diff --git a/Code/Visualization/otbVectorDataEditionModel.h b/Code/Visualization/otbVectorDataEditionModel.h index 6e9d9661bb..5d311a6a1b 100644 --- a/Code/Visualization/otbVectorDataEditionModel.h +++ b/Code/Visualization/otbVectorDataEditionModel.h @@ -26,6 +26,9 @@ #include "otbVectorData.h" #include "otbVectorDataModel.h" +#include "otbRemoteSensingRegion.h" +#include "itkImageRegion.h" + namespace otb { /** \class VectorDataEditionModel @@ -72,6 +75,7 @@ public: void UpdatePoint( PointType srcPoint, PointType dstPoint); void UpdateGeometryPosition(double tx, double ty); void DeleteSelectedGeometry(); + void DeleteSelectedGeometriesInROI(itk::ImageRegion<2> rsRegion); protected: -- GitLab