All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
CurvePolygon.cpp
Go to the documentation of this file.
1 /* Copyright (C) 2008-2013 National Institute For Space Research (INPE) - Brazil.
2 
3  This file is part of the TerraLib - a Framework for building GIS enabled applications.
4 
5  TerraLib is free software: you can redistribute it and/or modify
6  it under the terms of the GNU Lesser General Public License as published by
7  the Free Software Foundation, either version 3 of the License,
8  or (at your option) any later version.
9 
10  TerraLib is distributed in the hope that it will be useful,
11  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  GNU Lesser General Public License for more details.
14 
15  You should have received a copy of the GNU Lesser General Public License
16  along with TerraLib. See COPYING. If not, write to
17  TerraLib Team at <terralib-team@terralib.org>.
18  */
19 
20 /*!
21  \file terralib/geometry/CurvePolygon.cpp
22 
23  \brief CurvePolygon is a planar surface defined by 1 exterior boundary and 0 or more interior boundaries.
24 */
25 
26 // TerraLib
27 #include "../common/STLUtils.h"
28 #include "../common/Translator.h"
29 #include "Config.h"
30 #include "Coord2D.h"
31 #include "Curve.h"
32 #include "CurvePolygon.h"
33 #include "Envelope.h"
34 #include "GEOSWriter.h"
35 #include "Point.h"
36 
37 #ifdef TERRALIB_GEOS_ENABLED
38 // GEOS
39 #include <geos/algorithm/CentroidArea.h>
40 #include <geos/geom/Geometry.h>
41 #include <geos/geom/IntersectionMatrix.h>
42 #include <geos/operation/buffer/OffsetCurveBuilder.h>
43 #include <geos/util/GEOSException.h>
44 #endif
45 
46 const std::string te::gm::CurvePolygon::sm_typeName("CurvePolygon");
47 
48 te::gm::CurvePolygon::CurvePolygon(std::size_t nRings, GeomType t, int srid, Envelope* mbr)
49  : Surface(t, srid, mbr),
50  m_rings(nRings)
51 {
52 }
53 
55  : Surface(rhs)
56 {
58 }
59 
61 {
62  te::common::FreeContents(m_rings);
63 }
64 
66 {
67  if(this != &rhs)
68  {
69  Surface::operator=(rhs);
70 
71  te::common::FreeContents(m_rings);
72 
73  m_rings.clear();
74 
75  te::common::Clone(rhs.m_rings, m_rings);
76  }
77 
78  return *this;
79 }
80 
82 {
83  return new CurvePolygon(*this);
84 }
85 
87 {
88  assert(m_rings.size() > 0);
89  return m_rings[0];
90 }
91 
93 {
94  return (m_rings.size() > 0) ? (m_rings.size() - 1) : 0;
95 }
96 
97 void te::gm::CurvePolygon::setNumRings(std::size_t size)
98 {
99  if(size < m_rings.size())
100  {
101  std::size_t oldSize = m_rings.size();
102  for(std::size_t i = size; i < oldSize; ++i)
103  delete m_rings[i];
104  }
105 
106  m_rings.resize(size);
107 }
108 
110 {
111  assert(i < getNumInteriorRings());
112  return m_rings[i + 1];
113 }
114 
115 void te::gm::CurvePolygon::setRingN(std::size_t i, Curve* r)
116 {
117  assert(i < m_rings.size());
118  delete m_rings[i];
119  m_rings[i] = r;
120 }
121 
123 {
124  assert(i < m_rings.size());
125  delete m_rings[i];
126  m_rings.erase(m_rings.begin() + i);
127 }
128 
130 {
131  te::common::FreeContents(m_rings);
132  m_rings.clear();
133 }
134 
136 {
137 #ifdef TERRALIB_GEOS_ENABLED
138  std::auto_ptr<geos::geom::Geometry> g(GEOSWriter::write(this));
139 
140  return g->getArea();
141 
142 #else
143  throw Exception(TE_TR("getArea routine is supported by GEOS! Please, enable the GEOS support."));
144 #endif
145 }
146 
148 {
149 #ifdef TERRALIB_GEOS_ENABLED
150  std::auto_ptr<geos::geom::Geometry> thisGeom(GEOSWriter::write(this));
151 
152  geos::algorithm::CentroidArea c;
153 
154  c.add(thisGeom.get());
155 
156  geos::geom::Coordinate coord;
157 
158  if(c.getCentroid(coord))
159  {
160  Point* pt = new Point(coord.x, coord.y, m_srid, 0);
161 
162  return pt;
163  }
164 
165  return 0;
166 
167 #else
168  throw te::common::Exception(TE_TR("getCentroid routine is supported by GEOS! Please, enable the GEOS support."));
169 #endif
170 }
171 
173 {
174  te::gm::Point * p = getCentroid();
175 
176  if(p)
177  {
178  te::gm::Coord2D* coord = new te::gm::Coord2D(p->getX(), p->getY());
179 
180  delete p;
181 
182  return coord;
183  }
184 
185  return 0;
186 }
187 
189 {
190  return 0;
191 }
192 
194 {
195  return 0;
196 }
197 
199 {
200 #ifdef TERRALIB_GEOS_ENABLED
201  std::auto_ptr<geos::geom::Geometry> g(GEOSWriter::write(this));
202 
203  return g->getLength();
204 
205 #else
206  throw Exception(TE_TR("getLength routine is supported by GEOS! Please, enable the GEOS support."));
207 #endif
208 }
209 
210 const std::string& te::gm::CurvePolygon::getGeometryType() const throw()
211 {
212  return sm_typeName;
213 }
214 
215 void te::gm::CurvePolygon::setSRID(int srid) throw()
216 {
217  std::size_t n = m_rings.size();
218 
219  for(std::size_t i = 0; i < n; ++i)
220  m_rings[i]->setSRID(srid);
221 
222  m_srid = srid;
223 }
224 
226 {
227 #ifdef TERRALIB_MOD_SRS_ENABLED
228  if(srid == m_srid)
229  return;
230 
231  std::size_t n = m_rings.size();
232 
233  for(std::size_t i = 0; i < n; ++i)
234  m_rings[i]->transform(srid);
235 
236  if(m_mbr)
237  computeMBR(true); // just update the polygon MBR
238 
239  m_srid = srid;
240 #else
241  throw Exception(TE_TR("transform method is not supported!"));
242 #endif // TERRALIB_MOD_SRS_ENABLED
243 }
244 
245 void te::gm::CurvePolygon::computeMBR(bool cascade) const throw()
246 {
247  if(m_mbr == 0)
248  m_mbr = new Envelope;
249  else
250  m_mbr->makeInvalid();
251 
252  std::size_t n = m_rings.size();
253 
254  if(n == 0)
255  return;
256 
257  if(cascade)
258  m_rings[0]->computeMBR(true);
259 
260  *m_mbr = *(m_rings[0]->getMBR());
261 
262  if(cascade)
263  for(std::size_t i = 1; i < n; ++i)
264  m_rings[i]->computeMBR(true);
265 }
266 
267 std::size_t te::gm::CurvePolygon::getNPoints() const throw()
268 {
269  std::size_t n = m_rings.size();
270 
271  std::size_t sum = 0;
272 
273  for(std::size_t i = 0; i < n; ++i)
274  sum += m_rings[i]->getNPoints();
275 
276  return sum;
277 }
278 
virtual CurvePolygon & operator=(const CurvePolygon &rhs)
Assignment operator.
Curve * getInteriorRingN(std::size_t i) const
It returns the n-th interior ring for this curve polygon as a curve.
void makeInvalid()
It will invalidated the envelope.
Definition: Envelope.h:430
GeomType
Each enumerated type is compatible with a Well-known Binary (WKB) type code.
Definition: Enums.h:41
virtual const std::string & getGeometryType() const
The name of the geometry subtype for curve polygons is: CurvePolygon.
void transform(int srid)
It converts the coordinate values of the geometry to the new spatial reference system.
void setSRID(int srid)
It sets the Spatial Reference System ID of the geometry and all its parts if it is a GeometryCollecti...
Curve is an abstract class that represents 1-dimensional geometric objects stored as a sequence of co...
Definition: Curve.h:58
std::size_t getNumInteriorRings() const
It returns the number of interior rings in this CurvePolygon.
double getPerimeter() const
It returns the length of the boundary for the surface.
A point with x and y coordinate values.
Curve * getExteriorRing() const
It returns the exterior ring of this CurvePolygon.
void removeRingN(std::size_t i)
It removes the n-th ring in this CurvePolygon.
An utility struct for representing 2D coordinates.
Definition: Coord2D.h:40
#define TE_TR(message)
It marks a string in order to get translated.
Definition: Translator.h:345
void setNumRings(std::size_t size)
It sets the number of rings in this curve polygon.
An Envelope defines a 2D rectangular region.
static const std::string sm_typeName
Definition: CurvePolygon.h:441
std::size_t getNPoints() const
it returns the number of points (vertexes) in the geometry.
const double & getY() const
It returns the Point y-coordinate value.
Definition: Point.h:150
A point with x and y coordinate values.
Definition: Point.h:50
An Envelope defines a 2D rectangular region.
Definition: Envelope.h:51
CurvePolygon is a planar surface defined by 1 exterior boundary and 0 or more interior boundaries...
Point * getPointOnSurface() const
It returns a point guaranteed to be on this surface.
CurvePolygon(std::size_t nRings, GeomType t, int srid=0, Envelope *mbr=0)
It initializes the curve polygon with the specified spatial reference system id and envelope...
CurvePolygon is a planar surface defined by 1 exterior boundary and 0 or more interior boundaries...
Definition: CurvePolygon.h:57
virtual ~CurvePolygon()
Virtual destructor.
virtual Surface & operator=(const Surface &rhs)
Assignment operator.
Definition: Surface.cpp:59
A base class for values that can be retrieved from the data access module.
Definition: AbstractData.h:57
Coord2D * getCoordOnSurface() const
It returns a coordinate guaranteed to be on this surface.
This class is designed to declare objects to be thrown as exceptions by TerraLib. ...
Definition: Exception.h:58
Curve is an abstract class that represents 1-dimensional geometric objects stored as a sequence of co...
A class that converts a TerraLib geometry to a GEOS geometry.
double getArea() const
It returns the area of this surface, as measured in the spatial reference system of this surface...
void computeMBR(bool cascade) const
It computes the minimum bounding rectangle for the curve polygon.
Coord2D * getCentroidCoord() const
It returns the mathematical centroid for this surface as a coordinate.
Point * getCentroid() const
It returns the mathematical centroid for this surface as a point.
void clear()
It deletes all the rings of the CurvePolygon and clear it.
virtual te::dt::AbstractData * clone() const
It clones the linestring.
Configuration flags for the Vector Geometry Model of TerraLib.
void Clone(const std::vector< T * > &src, std::vector< T * > &dst)
This function can be applied to a vector of pointers.
Definition: STLUtils.h:237
An utility struct for representing 2D coordinates.
void FreeContents(boost::unordered_map< K, V * > &m)
This function can be applied to a map of pointers. It will delete each pointer in the map...
Definition: BoostUtils.h:55
const double & getX() const
It returns the Point x-coordinate value.
Definition: Point.h:136
void setRingN(std::size_t i, Curve *r)
It sets the informed position ring to the new one.
Surface is an abstract class that represents a 2-dimensional geometric objects.
Definition: Surface.h:54
std::vector< Curve * > m_rings
An array with the ring list.
Definition: CurvePolygon.h:439