GEOS 3.15.0beta1
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
32namespace geos {
33namespace geom { // geos::geom
34class Coordinate;
36}
37}
38
39namespace geos {
40namespace geom { // geos::geom
41
51class GEOS_DLL GeometryCollection : public Geometry {
52
53public:
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
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
171 std::unique_ptr<GeometryCollection> getCurved(const algorithm::LineToCurveParams& params) {
172 return std::unique_ptr<GeometryCollection>(getCurvedImpl(params));
173 }
174
175 std::unique_ptr<GeometryCollection> getLinearized(const algorithm::CurveToLineParams& params) {
176 return std::unique_ptr<GeometryCollection>(getLinearizedImpl(params));
177 }
178
180 const Geometry* getGeometryN(std::size_t n) const override;
181
189 std::vector<std::unique_ptr<Geometry>> releaseGeometries();
190
198 std::unique_ptr<GeometryCollection> reverse() const { return std::unique_ptr<GeometryCollection>(reverseImpl()); }
199
200 const Envelope* getEnvelopeInternal() const override {
201 if (envelope.isNull()) {
202 envelope = computeEnvelopeInternal();
203 }
204 return &envelope;
205 }
206
207protected:
208
209 struct CollectionFlags {
210 bool flagsCalculated;
211 bool hasPoints;
212 bool hasLines;
213 bool hasPolygons;
214 bool hasM;
215 bool hasZ;
216 bool hasCurves;
217 };
218
219 GeometryCollection(const GeometryCollection& gc);
220 GeometryCollection& operator=(const GeometryCollection& gc);
221
239 GeometryCollection(std::vector<std::unique_ptr<Geometry>> && newGeoms, const GeometryFactory& newFactory);
240
242 template<typename T>
243 GeometryCollection(std::vector<std::unique_ptr<T>> && newGeoms, const GeometryFactory& newFactory) :
244 GeometryCollection(toGeometryArray(std::move(newGeoms)), newFactory) {}
245
246 GeometryCollection* cloneImpl() const override { return new GeometryCollection(*this); }
247
248 GeometryCollection* reverseImpl() const override;
249
250 GeometryCollection* getLinearizedImpl(const algorithm::CurveToLineParams&) const override;
251
252 GeometryCollection* getCurvedImpl(const algorithm::LineToCurveParams&) const override;
253
254 int
255 getSortIndex() const override
256 {
257 return SORTINDEX_GEOMETRYCOLLECTION;
258 };
259
260 std::vector<std::unique_ptr<Geometry>> geometries;
261 mutable CollectionFlags flags;
262 mutable Envelope envelope;
263
264 Envelope computeEnvelopeInternal() const;
265
266 void geometryChangedAction() override {
267 envelope.setToNull();
268 flags.flagsCalculated = false;
269 }
270
271 int compareToSameClass(const Geometry* gc) const override;
272
273 bool hasCurvedComponents() const override;
274
275 void setFlags() const;
276
277};
278
279} // namespace geos::geom
280} // namespace geos
281
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:56
Coordinate is the lightweight class used to store coordinates.
Definition Coordinate.h:220
DimensionType
Definition Dimension.h:29
An Envelope defines a rectangulare region of the 2D coordinate plane.
Definition Envelope.h:59
Represents a collection of heterogeneous Geometry objects.
Definition GeometryCollection.h:51
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.
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:243
std::string getGeometryType() const override
Return a string representation of this Geometry type.
GeometryCollection * cloneImpl() const override
Make a deep-copy of this Geometry.
Definition GeometryCollection.h:246
const Geometry * getGeometryN(std::size_t n) const override
Returns a pointer to the nth Geometry in this collection.
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...
std::unique_ptr< GeometryCollection > clone() const
Definition GeometryCollection.h:76
void apply_ro(CoordinateSequenceFilter &filter) const override
bool hasCurvedComponents() const override
Returns whether the Geometry contains curved components.
void geometryChangedAction() override
Notifies this Geometry that its Coordinates have been changed by an external party.
Definition GeometryCollection.h:266
GeometryTypeId getGeometryTypeId() const override
Return an integer representation of this Geometry type.
std::vector< std::unique_ptr< Geometry > > releaseGeometries()
Take ownership of the sub-geometries managed by this GeometryCollection. After releasing the sub-geom...
std::unique_ptr< CoordinateSequence > getCoordinates() const override
Collects all coordinates of all subgeometries into a CoordinateSequence.
double getArea() const override
Returns the total area of this collection.
std::size_t getNumPoints() const override
Returns the count of this Geometrys vertices.
bool hasDimension(Dimension::DimensionType d) const override
Checks whether any component of this geometry has dimension d.
const CoordinateXY * getCoordinate() const override
Returns a vertex of this Geometry, or NULL if this is the empty geometry.
bool isEmpty() const override
Returns whether or not the set of points in this Geometry is empty.
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...
GeometryCollection * reverseImpl() const override
Make a geometry with coordinates in reverse order.
std::unique_ptr< Geometry > getBoundary() const override
Returns the boundary, or an empty geometry of appropriate dimension if this Geometry is empty.
std::size_t getNumGeometries() const override
Returns the number of geometries in this collection.
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,...
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:200
std::unique_ptr< GeometryCollection > reverse() const
Definition GeometryCollection.h:198
void apply_rw(CoordinateSequenceFilter &filter) override
Definition GeometryComponentFilter.h:41
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:201
Definition Angle.h:26
GeometryTypeId
Geometry types.
Definition Geometry.h:78
Basic namespace for all GEOS functionalities.
Definition geos.h:38