Forked from
Main Repositories / otb
20359 commits behind the upstream repository.
-
Otmane Lahlou authoredOtmane Lahlou authored
otbDataNode.h 9.33 KiB
/*=========================================================================
Program: ORFEO Toolbox
Language: C++
Date: $Date$
Version: $Revision$
Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
See OTBCopyright.txt for details.
This software is distributed WITHOUT ANY WARRANTY; without even
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
PURPOSE. See the above copyright notices for more information.
=========================================================================*/
#ifndef __otbDataNode_h
#define __otbDataNode_h
#include "itkPoint.h"
#include "otbPolyLineParametricPathWithValue.h"
#include "otbPolygon.h"
#include "otbObjectList.h"
#include "otbVectorDataKeywordlist.h"
#include <iostream>
#include "ogrsf_frmts.h"
namespace otb
{
/**
* This enumeration describes the type of nodes used to represent a tree of vector data in the Orfeo ToolBox.
*/
typedef
enum
{
ROOT = 0,
DOCUMENT = 1,
FOLDER = 2,
FEATURE_POINT = 3,
FEATURE_LINE = 4,
FEATURE_POLYGON = 5,
FEATURE_MULTIPOINT = 6,
FEATURE_MULTILINE = 7,
FEATURE_MULTIPOLYGON = 8,
FEATURE_COLLECTION = 9
} NodeType;
/** \class DataNode
* \brief This class represents a node of data in a vector data hierarchy.
*
* A DataNode has a type represented by the NodeType enumeration. Depending on
* its type, it can have associated data such as Point, Line or Polygon.
*
* A flag indicates if the data are valid or not.
*
* A DataNode has also a dictionary of fields which can be used to store associated data.
* Depending on the writing vector data file format, fields will be used by the writing driver.
*
* The three templates indicate
* - the precision of the point coordinates (default double)
* - the number of dimensions of the space (default 2)
* - the precision of the value associated with objects such as lines or polygons (default double)
*
* \sa VectorData
*/
template <class TPrecision = double, unsigned VDimension = 2, class TValuePrecision = double>
class DataNode
: public itk::Object
{
public:
/** Standard class typedef */
typedef DataNode Self;
typedef itk::Object Superclass;
typedef itk::SmartPointer<Self> Pointer;
typedef itk::SmartPointer<const Self> ConstPointer;
/** Standard macro */
itkNewMacro(Self);
itkTypeMacro(DataNode, Object);
/** Template parameters typedefs */
typedef TPrecision PrecisionType;
typedef TValuePrecision ValuePrecisionType;
itkStaticConstMacro(Dimension, unsigned int, VDimension);
/** Internal data typedef */
typedef itk::Point<PrecisionType, VDimension> PointType;
typedef otb::PolyLineParametricPathWithValue<ValuePrecisionType, VDimension> LineType;
typedef typename LineType::Pointer LinePointerType;
typedef typename LineType::ConstPointer LineConstPointerType;
typedef Polygon<ValuePrecisionType> PolygonType;
typedef typename PolygonType::VertexListType VertexListType;
typedef typename VertexListType::ConstPointer VertexListConstPointerType;
typedef typename PolygonType::Pointer PolygonPointerType;
typedef typename PolygonType::ConstPointer PolygonConstPointerType;
typedef ObjectList<PolygonType> PolygonListType;
typedef typename PolygonListType::Pointer PolygonListPointerType;
typedef typename PolygonListType::ConstPointer PolygonListConstPointerType;
/** Fields typedef */
// typedef std::map<std::string, std::string> FieldMapType;
// typedef std::pair<std::string, std::string> FieldType;
/** Accessors */
itkGetConstMacro(NodeType, NodeType);
itkGetStringMacro(NodeId);
itkSetStringMacro(NodeId);
/**
* Set the node type.
* \param type node type.
*/
void SetNodeType(NodeType type);
/**
* \return the node type as a printable string.
*/
std::string GetNodeTypeAsString() const;
/**
* Get the point data, when valid.
* \return The point.
*/
PointType GetPoint() const;
/**
* Get the line data, when valid.
* \return The line.
*/
LinePointerType GetLine() const;
/**
* Get the polygon exterior ring data, when valid.
* \return The polygon exterior ring.
*/
PolygonPointerType GetPolygonExteriorRing() const;
/**
* Get the polygon interior rings data, when valid.
* \return The polygon interior rings list.
*/
PolygonListPointerType GetPolygonInteriorRings() const;
/**
* Set the point data. Node type is automatically set to FEATURE_POINT.
* \param point the point.
*/
void SetPoint(PointType point);
/**
* Set the line data. Node type is automatically set to FEATURE_LINE.
* \param line The line.
*/
void SetLine(LineType* line);
/**
* Set the polygon exterior ring. Node type is automatically set to FEATURE_POLYGON.
* \param polygon The polygon exterior ring.
*/
void SetPolygonExteriorRing(PolygonType* polygon);
/**
* Set the polygon interior rings. Node type is automatically set to FEATURE_POLYGON.
* \param polygonList The polygon interior rings list.
*/
void SetPolygonInteriorRings(PolygonListType* polygonList);
/**
* \return True if node type is DOCUMENT.
*/
bool IsDocument() const;
/**
* \return True if node type is ROOT.
*/
bool IsRoot() const;
/**
* \return True if node type is FOLDER.
*/
bool IsFolder() const;
/**
* \return True if node type is FEATURE_POINT.
*/
bool IsPointFeature() const;
/**
* \return True if node type is FEATURE_LINE.
*/
bool IsLineFeature() const;
/**
* \return True if node type is FEATURE_POLYGON.
*/
bool IsPolygonFeature() const;
/**
* \return True if node type is FEATURE_MULTIPOINT.
*/
bool IsMultiPointFeature() const;
/**
* \return True if node type is FEATURE_MULTILINE.
*/
bool IsMultiLineFeature() const;
/**
* \return True if node type is FEATURE_MULTIPOLYGON.
*/
bool IsMultiPolygonFeature() const;
/**
* \return True if node type is FEATURE_COLLECTION.
*/
bool IsCollectionFeature() const;
/**
* Add a field to the node.
* \param key The name of the field.
* \param value The value of the field.
*/
void SetFieldAsString(const std::string& key, const std::string& value);
/**
* Returns the value associated with a field name.
* \param key The name of the field.
* \return The value of the field. A default value is returned if the key was not found.
*/
std::string GetFieldAsString(const std::string& key) const;
/**
* Add a field to the node.
* \param key The name of the field.
* \param value The value of the field.
*/
void SetFieldAsInt(const std::string& key, int value);
/**
* Returns the value associated with a field name.
* \param key The name of the field.
* \return The value of the field. A default value is returned if the key was not found.
*/
int GetFieldAsInt(const std::string& key) const;
/**
* Add a field to the node.
* \param key The name of the field.
* \param value The value of the field.
*/
void SetFieldAsDouble(const std::string& key, double value);
/**
* Returns the value associated with a field name.
* \param key The name of the field.
* \return The value of the field. A default value is returned if the key was not found.
*/
double GetFieldAsDouble(const std::string& key) const;
// /**
// * Remove the field associated with the given key, if possible.
// * \param key The name of the field.
// */
// void RemoveField(const std::string& key);
/**
* \return True if the node contains the field named after the given key.
* \param key The name of the field.
*/
bool HasField(const std::string& key) const;
/**
* Copy the field list from a DataNode
* \param datanode where to get the keywordlist to copy.
*/
void CopyFieldList(const DataNode * dataNode);
/**
* \return the field list in the node.
*/
std::vector<std::string> GetFieldList() const;
/** \return the distance to a point */
double EuclideanDistance(const DataNode* node);
double EuclideanDistance(const PointType point);
/**
* Clear all fields.
*/
// void ClearFields();
protected:
/** Constructor */
DataNode();
/** Destructor */
virtual ~DataNode() {}
/** PrintSelf method */
void PrintSelf(std::ostream& os, itk::Indent indent) const;
OGRGeometry* ConvertDataNodeToOGRGeometry(const DataNode* dataNode);
private:
DataNode(const Self&); //purposely not implemented
void operator =(const Self&); //purposely not implemented
/** typedef of the data associated with the node */
typedef struct
{
bool valid;
PointType point;
LinePointerType line;
PolygonPointerType exteriorRing;
PolygonListPointerType interiorRings;
} DataType;
/** The node type */
NodeType m_NodeType;
/** The node id */
std::string m_NodeId;
/** The data associated with the node */
DataType m_Data;
/** The fields map */
// FieldMapType m_FieldMap;
};
} // end namespace
#ifndef OTB_MANUAL_INSTANTIATION
#include "otbDataNode.txx"
#endif
#endif