Orfeo Toolbox  3.16
otbVectorDataModel.cxx
Go to the documentation of this file.
1 /*=========================================================================
2 
3  Program: ORFEO Toolbox
4  Language: C++
5  Date: $Date$
6  Version: $Revision$
7 
8 
9  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
10  See OTBCopyright.txt for details.
11 
12 
13  This software is distributed WITHOUT ANY WARRANTY; without even
14  the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
15  PURPOSE. See the above copyright notices for more information.
16 
17 =========================================================================*/
18 #include "otbVectorDataModel.h"
19 
20 namespace otb
21 {
22 
24  m_VectorData(), m_CurrentNodeType(FEATURE_POLYGON), m_CurrentRootNode(),
25  m_CurrentGeometry(), m_Origin(), m_Spacing() //, m_UpperModel()
26 {
27  m_Origin.Fill(0.);
28  m_Spacing.Fill(1.);
29 
30  // Initialize vectordata
31  this->ResetVectorData();
32 }
33 
35 {
38  m_CurrentRootNode->SetNodeId("DOCUMENT");
39  m_CurrentRootNode->SetNodeType(DOCUMENT);
40  m_VectorData->GetDataTree()->Add(
42  m_VectorData->GetDataTree()->GetRoot()->Get());
43 }
44 
46 {
47  this->NotifyAll();
48 }
49 
50 void VectorDataModel::AddPointToGeometry(VertexType& vertex, bool callUpdate)
51 {
52  VertexType newPoint;
53  newPoint[0] = m_Origin[0] + vertex[0] / m_Spacing[0];
54  newPoint[1] = m_Origin[1] + vertex[1] / m_Spacing[1];
55 
56  // Check if current node type changed, and if so, close current geometry first
58  {
59  this->EndGeometry();
60  }
61 
63  {
64  otbMsgDevMacro(<< "VectorDataModel::AddPointToGeometry: Creating and adding new point");
67  {
69  m_CurrentGeometry->SetNodeId("FEATURE_POINT");
70  m_CurrentGeometry->SetNodeType(FEATURE_POINT);
71  m_CurrentGeometry->SetPoint(newPoint);
72  m_VectorData->GetDataTree()->Add(m_CurrentGeometry, m_CurrentRootNode);
73  this->Modified();
74  }
75  else
76  {
77  itkExceptionMacro(<< "No partially created geometry should be up when adding FEATURE_POINT");
78  }
79  }
81  {
83  {
84  otbMsgDevMacro(<< "VectorDataModel::AddPointToGeometry: Creating new polygon");
86  m_CurrentGeometry->SetNodeId("FEATURE_POLYGON");
87  m_CurrentGeometry->SetNodeType(FEATURE_POLYGON);
88  PolygonType::Pointer exteriorRing = PolygonType::New();
89  m_CurrentGeometry->SetPolygonExteriorRing(exteriorRing);
90  m_VectorData->GetDataTree()->Add(m_CurrentGeometry, m_CurrentRootNode);
91  }
92  otbMsgDevMacro(<< "VectorDataModel::AddPoint: Adding point " << newPoint);
93  m_CurrentGeometry->GetPolygonExteriorRing()->AddVertex(newPoint);
94  }
95  else if (m_CurrentNodeType == FEATURE_LINE)
96  {
98  {
99  otbMsgDevMacro(<< "VectorDataModel::AddPointToGeometry: Creating new line");
101  m_CurrentGeometry->SetNodeId("FEATURE_LINE");
102  m_CurrentGeometry->SetNodeType(FEATURE_LINE);
104  m_CurrentGeometry->SetLine(line);
105  m_VectorData->GetDataTree()->Add(m_CurrentGeometry, m_CurrentRootNode);
106  }
107  otbMsgDevMacro(<< "VectorDataModel::AddPoint: Adding point " << newPoint);
108  m_CurrentGeometry->GetLine()->AddVertex(newPoint);
109  }
110  else
111  {
112  itkExceptionMacro(<< "Node type not (yet) supported: " << m_CurrentNodeType);
113  }
114 
115  if(callUpdate == true)
116  {
117  this->Update();
118  }
119 }
120 
121 void VectorDataModel::EndGeometry(bool callUpdate)
122 {
123  // Avoid multiple endings
124  if (!m_CurrentGeometry)
125  {
126  return;
127  }
128 
129  if (m_CurrentGeometry->GetNodeType() == FEATURE_POINT)
130  {
131  otbMsgDevMacro(<< "VectorDataModel::EndGeometry: Point don't need the geometry to be ended");
133  }
134  else if (m_CurrentGeometry->GetNodeType() == FEATURE_POLYGON)
135  {
136  if (m_CurrentGeometry->GetPolygonExteriorRing()->GetVertexList()->Size()
137  <= 2)
138  {
139  itkExceptionMacro(<< "Polygon must have at least 3 points");
140  }
141  otbMsgDevMacro(<< "VectorDataModel::EndGeometry: Ending polygon and adding to vector data");
142  VertexListConstIteratorType it = m_CurrentGeometry->GetPolygonExteriorRing()->GetVertexList()->Begin();
143  VertexType firstVertex = it.Value();
144  m_CurrentGeometry->GetPolygonExteriorRing()->AddVertex(firstVertex);
146  }
147  else if (m_CurrentGeometry->GetNodeType() == FEATURE_LINE)
148  {
149  if (m_CurrentGeometry->GetLine()->GetVertexList()->Size()
150  < 2)
151  {
152  itkExceptionMacro(<< "Line must have at least 2 points");
153  }
154  otbMsgDevMacro(<< "VectorDataModel::EndGeometry: Ending line and adding to vector data");
155 
157  }
158  else
159  {
160  itkExceptionMacro(<< "Node type not (yet) supported: " << m_CurrentNodeType);
161  }
162  this->Modified();
163  if(callUpdate == true)
164  {
165  this->Update();
166  }
167 }
168 
170 {
171  //delete selected geometry if there is one
173  {
175  m_VectorData->GetDataTree()->GetRoot());
176  it.GoToBegin();
177  while ( !it.IsAtEnd()
178  && it.GetNode()->Get() != m_SelectedGeometry )
179  {
180  ++it;
181  }
182  if (it.IsAtEnd())
183  {
184  itkExceptionMacro(<< "The selected geometry is not in the tree (and it should)");
185  }
186  it.Remove();
188  }
189  else
190  {
191  //No selected geometry found, delete the last one
192  otbMsgDevMacro(<< "VectorDataModel::DeleteGeometry: Removing last geometry");
193 
194  //FIXME in need of a cleaner interface for the vector data
196  * currentRootNode =
197  const_cast<VectorDataType::DataTreeType::TreeNodeType*> (m_VectorData->GetDataTree()->GetNode(
199 
200  if (currentRootNode->GetChildrenList().size() > 0)
201  {
202  otbMsgDevMacro(<< "Current number of elements (before deletion)" << currentRootNode->GetChildrenList().size());
203 
204  currentRootNode->GetChildrenList().pop_back();
205  }
206  // Clear current geometry as well
208  }
209  this->Modified();
210  this->Update();
211 
212 }
213 
215 {
217  m_VectorData->GetDataTree()->GetRoot());
218  it.GoToBegin();
219  int i = 0;
220  while (!it.IsAtEnd() &&
221  !(
222  ((it.GetNode())->Get()->IsPointFeature())
223  || (it.GetNode())->Get()->IsLineFeature()
224  || (it.GetNode())->Get()->IsPolygonFeature()
225  ))
226  {
227  ++it;
228  }
229  while (i < n && !it.IsAtEnd())
230  {
231  if ((it.GetNode())->Get()->IsPointFeature() || (it.GetNode())->Get()->IsLineFeature() ||
232  (it.GetNode())->Get()->IsPolygonFeature())
233  {
234  ++i;
235  }
236  ++it;
237  }
238  if (it.IsAtEnd())
239  {
240 // itkExceptionMacro(<<"VectorDataModel::GetNthDataNode: requesting for inaccessible node: " << n);
241  otbMsgDevMacro(<< "VectorDataModel::GetNthDataNode: requesting for inaccessible node: " << n);
242  return NULL;
243  }
244  return (it.GetNode())->Get();
245 }
246 
248 {
250 }
251 
252 
253 void
255 {
256  this->EndGeometry(false);
257  DataTreeType::Pointer tree = vData->GetDataTree();
258  TreeNodeType * root = const_cast<TreeNodeType *>(tree->GetRoot());
259  this->AddNode( root );
260  if (update)
261  {
262  this->Update();
263  }
264 }
265 
266 void
268 {
269  switch (node->Get()->GetNodeType())
270  {
271  case FEATURE_POINT:
272  {
274  PointType point = node->Get()->GetPoint();
275  VertexType vertex;
276  vertex[0] = point[0];
277  vertex[1] = point[1];
278  this->AddPointToGeometry(vertex, false);
279 
280  //Add Other Fields
281  CopyFields( node );
282 
283  this->EndGeometry(false);
284  break;
285  }
286  case FEATURE_LINE:
287  {
289  const LineType * line = node->Get()->GetLine();
291  while (vIt != line->GetVertexList()->End())
292  {
293  PointType point = vIt.Value();
294  VertexType vertex;
295  vertex[0] = point[0];
296  vertex[1] = point[1];
297  this->AddPointToGeometry(vertex, false);
298  vIt++;
299  }
300  //Add Other Fields
301  CopyFields( node );
302 
303  this->EndGeometry(false);
304  break;
305  }
306  case FEATURE_POLYGON:
307  {
309  const PolygonType * extRing = node->Get()->GetPolygonExteriorRing();
310  PolygonType::VertexListType::ConstIterator vIt = extRing->GetVertexList()->Begin();
311 
312  while (vIt != extRing->GetVertexList()->End())
313  {
314  PointType point = vIt.Value();
315  VertexType vertex;
316  vertex[0] = point[0];
317  vertex[1] = point[1];
318  this->AddPointToGeometry(vertex, false);
319  vIt++;
320  }
321 
322  //Add Other Fields
323  CopyFields( node );
324 
325  this->EndGeometry(false);
326  break;
327  }
328  default:
329  {
330  // discard
331  break;
332  }
333  }
334 
335  // Get the children list from the input node
336  ChildrenListType children = node->GetChildrenList();
337 
338  // Render each child
339  ChildrenListType::iterator it = children.begin();
340  while ( it != children.end() )
341  {
342  this->AddNode(*it);
343  ++it;
344  }
345 }
346 
347 void
349 {
350  std::vector< std::string > fieldList = node->Get()->GetFieldList();
351  unsigned int i;
352  for (i=0; i < fieldList.size(); ++i)
353  {
354  m_CurrentGeometry->SetFieldAsString(fieldList.at(i), node->Get()->GetFieldAsString(fieldList.at(i)));
355  }
356 }
357 
358 }

Generated at Sun Jun 16 2013 00:56:56 for Orfeo Toolbox with doxygen 1.8.3.1