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