GEOS  3.13.0dev
GeometryCollection.h
1 /**********************************************************************
2  *
3  * GEOS - Geometry Engine Open Source
4  * http://geos.osgeo.org
5  *
6  * Copyright (C) 2001-2002 Vivid Solutions Inc.
7  * Copyright (C) 2005 2006 Refractions Research Inc.
8  *
9  * This is free software; you can redistribute and/or modify it under
10  * the terms of the GNU Lesser General Public Licence as published
11  * by the Free Software Foundation.
12  * See the COPYING file for more information.
13  *
14  **********************************************************************
15  *
16  * Last port: geom/GeometryCollection.java rev. 1.41
17  *
18  **********************************************************************/
19 
20 #pragma once
21 
22 #include <geos/export.h>
23 #include <geos/geom/Geometry.h> // for inheritance
24 #include <geos/geom/Envelope.h> // for proper use of unique_ptr<>
25 #include <geos/geom/Dimension.h> // for Dimension::DimensionType
26 
27 #include <string>
28 #include <vector>
29 #include <memory> // for unique_ptr
30 
31 // Forward declarations
32 namespace geos {
33 namespace geom { // geos::geom
34 class Coordinate;
35 class CoordinateSequenceFilter;
36 }
37 }
38 
39 namespace geos {
40 namespace geom { // geos::geom
41 
51 class GEOS_DLL GeometryCollection : public Geometry {
52 
53 public:
54  friend class GeometryFactory;
55 
56  typedef std::vector<std::unique_ptr<Geometry>>::const_iterator const_iterator;
57 
58  typedef std::vector<std::unique_ptr<Geometry>>::iterator iterator;
59 
60  const_iterator begin() const
61  {
62  return geometries.begin();
63  };
64 
65  const_iterator end() const
66  {
67  return geometries.end();
68  };
69 
76  std::unique_ptr<GeometryCollection> clone() const
77  {
78  return std::unique_ptr<GeometryCollection>(cloneImpl());
79  }
80 
81  ~GeometryCollection() override = default;
82 
83  void setSRID(int) override;
84 
98  std::unique_ptr<CoordinateSequence> getCoordinates() const override;
99 
100  bool isEmpty() const override;
101 
110 
111  bool hasDimension(Dimension::DimensionType d) const override;
112 
114 
116  uint8_t getCoordinateDimension() const override;
117 
118  bool hasM() const override;
119 
120  bool hasZ() const override;
121 
122  std::unique_ptr<Geometry> getBoundary() const override;
123 
129  int getBoundaryDimension() const override;
130 
131  std::size_t getNumPoints() const override;
132 
133  std::string getGeometryType() const override;
134 
136 
137  bool equalsExact(const Geometry* other,
138  double tolerance = 0) const override;
139 
140  bool equalsIdentical(const Geometry* other) const override;
141 
142  void apply_ro(CoordinateFilter* filter) const override;
143 
144  void apply_rw(const CoordinateFilter* filter) override;
145 
146  void apply_ro(GeometryFilter* filter) const override;
147 
148  void apply_rw(GeometryFilter* filter) override;
149 
150  void apply_ro(GeometryComponentFilter* filter) const override;
151 
152  void apply_rw(GeometryComponentFilter* filter) override;
153 
154  void apply_rw(CoordinateSequenceFilter& filter) override;
155 
156  void apply_ro(CoordinateSequenceFilter& filter) const override;
157 
158  void normalize() override;
159 
160  const CoordinateXY* getCoordinate() const override;
161 
163  double getArea() const override;
164 
166  double getLength() const override;
167 
169  std::size_t getNumGeometries() const override;
170 
172  const Geometry* getGeometryN(std::size_t n) const override;
173 
181  std::vector<std::unique_ptr<Geometry>> releaseGeometries();
182 
190  std::unique_ptr<GeometryCollection> reverse() const { return std::unique_ptr<GeometryCollection>(reverseImpl()); }
191 
192  const Envelope* getEnvelopeInternal() const override {
193  if (envelope.isNull()) {
194  envelope = computeEnvelopeInternal();
195  }
196  return &envelope;
197  }
198 
199 protected:
200 
202  GeometryCollection& operator=(const GeometryCollection& gc);
203 
221  GeometryCollection(std::vector<std::unique_ptr<Geometry>> && newGeoms, const GeometryFactory& newFactory);
222 
224  template<typename T>
225  GeometryCollection(std::vector<std::unique_ptr<T>> && newGeoms, const GeometryFactory& newFactory) :
226  GeometryCollection(toGeometryArray(std::move(newGeoms)), newFactory) {}
227 
228  GeometryCollection* cloneImpl() const override { return new GeometryCollection(*this); }
229 
230  GeometryCollection* reverseImpl() const override;
231 
232  int
233  getSortIndex() const override
234  {
235  return SORTINDEX_GEOMETRYCOLLECTION;
236  };
237 
238  std::vector<std::unique_ptr<Geometry>> geometries;
239  mutable Envelope envelope;
240 
241  Envelope computeEnvelopeInternal() const;
242 
243  void geometryChangedAction() override {
244  envelope.setToNull();
245  }
246 
247  int compareToSameClass(const Geometry* gc) const override;
248 
249 };
250 
251 } // namespace geos::geom
252 } // namespace geos
253 
Geometry classes support the concept of applying a coordinate filter to every coordinate in the Geome...
Definition: CoordinateFilter.h:43
Interface for classes which provide operations that can be applied to the coordinates in a Coordinate...
Definition: CoordinateSequenceFilter.h:55
DimensionType
Definition: Dimension.h:29
An Envelope defines a rectangulare region of the 2D coordinate plane.
Definition: Envelope.h:58
void setToNull()
Makes this Envelope a "null" envelope, that is, the envelope of the empty geometry.
Definition: Envelope.h:240
Represents a collection of heterogeneous Geometry objects.
Definition: GeometryCollection.h:51
GeometryCollection * cloneImpl() const override
Make a deep-copy of this Geometry.
Definition: GeometryCollection.h:228
void setSRID(int) override
Sets the ID of the Spatial Reference System used by the Geometry.
bool isDimensionStrict(Dimension::DimensionType d) const override
Checks whether this Geometry consists only of components having dimension d.
std::string getGeometryType() const override
Return a string representation of this Geometry type.
GeometryCollection * reverseImpl() const override
Make a geometry with coordinates in reverse order.
std::unique_ptr< GeometryCollection > clone() const
Definition: GeometryCollection.h:76
std::vector< std::unique_ptr< Geometry > > releaseGeometries()
Take ownership of the sub-geometries managed by this GeometryCollection. After releasing the sub-geom...
uint8_t getCoordinateDimension() const override
Returns coordinate dimension.
bool equalsIdentical(const Geometry *other) const override
Returns true if the two geometries are of the same type and their vertices corresponding by index are...
void apply_ro(CoordinateSequenceFilter &filter) const override
void geometryChangedAction() override
Notifies this Geometry that its Coordinates have been changed by an external party.
Definition: GeometryCollection.h:243
const CoordinateXY * getCoordinate() const override
Returns a vertex of this Geometry, or NULL if this is the empty geometry.
GeometryTypeId getGeometryTypeId() const override
Return an integer representation of this Geometry type.
std::unique_ptr< GeometryCollection > reverse() const
Definition: GeometryCollection.h:190
GeometryCollection(std::vector< std::unique_ptr< Geometry >> &&newGeoms, const GeometryFactory &newFactory)
Construct a GeometryCollection with the given GeometryFactory. Will keep a reference to the factory,...
double getArea() const override
Returns the total area of this collection.
std::size_t getNumPoints() const override
Returns the count of this Geometrys vertices.
const Geometry * getGeometryN(std::size_t n) const override
Returns a pointer to the nth Geometry in this collection.
std::unique_ptr< Geometry > getBoundary() const override
Returns the boundary, or an empty geometry of appropriate dimension if this Geometry is empty.
bool hasDimension(Dimension::DimensionType d) const override
Checks whether any component of this geometry has dimension d.
bool isEmpty() const override
Returns whether or not the set of points in this Geometry is empty.
const Envelope * getEnvelopeInternal() const override
Returns the minimum and maximum x and y values in this Geometry, or a null Envelope if this Geometry ...
Definition: GeometryCollection.h:192
Dimension::DimensionType getDimension() const override
Returns the maximum dimension of geometries in this collection (0=point, 1=line, 2=surface)
int getBoundaryDimension() const override
Returns the maximum boundary dimension of geometries in this collection.
double getLength() const override
Returns the total length of this collection.
bool equalsExact(const Geometry *other, double tolerance=0) const override
Returns true iff the two Geometrys are of the same type and their vertices corresponding by index are...
std::size_t getNumGeometries() const override
Returns the number of geometries in this collection.
GeometryCollection(std::vector< std::unique_ptr< T >> &&newGeoms, const GeometryFactory &newFactory)
Convenience constructor to build a GeometryCollection from vector of Geometry subclass pointers.
Definition: GeometryCollection.h:225
std::unique_ptr< CoordinateSequence > getCoordinates() const override
Collects all coordinates of all subgeometries into a CoordinateSequence.
void apply_rw(CoordinateSequenceFilter &filter) override
Definition: GeometryComponentFilter.h:41
Supplies a set of utility methods for building Geometry objects from CoordinateSequence or other Geom...
Definition: GeometryFactory.h:65
Geometry classes support the concept of applying a Geometry filter to the Geometry.
Definition: GeometryFilter.h:45
Basic implementation of Geometry, constructed and destructed by GeometryFactory.
Definition: Geometry.h:186
GeometryTypeId
Geometry types.
Definition: Geometry.h:73
Basic namespace for all GEOS functionalities.
Definition: Angle.h:25