63 bool hasZ = subgeom->
is3D();
86 double xmin = std::numeric_limits<double>::max();
87 double ymin = std::numeric_limits<double>::max();
88 double xmax = -std::numeric_limits<double>::max();
89 double ymax = -std::numeric_limits<double>::max();
177 for ( ; j < n; i = j++ )
185 double d = vi.
x() * vj.
y() - vj.
x() * vi.
y();
187 Cx += ( vi.
x() + vj.
x() ) * d;
188 Cy += ( vi.
y() + vj.
y() ) * d;
194 for (
int i = 0; i < n - 1; ++i )
200 return QgsPoint( Cx / ( n - 1 ), Cy / ( n - 1 ) );
204 return QgsPoint( v0.
x() + Cx / ( 3. * A ), v0.
y() + Cy / ( 3. * A ) );
224 addZValue( std::numeric_limits<double>::quiet_NaN() );
233 addMValue( std::numeric_limits<double>::quiet_NaN() );
301 Q_UNUSED( tolerance );
302 Q_UNUSED( toleranceType );
310 ::memset( levels, 0,
sizeof( Level ) * 3 );
312 levels[0].index = index;
319 if ( depth == 0 && levels[0].index >= levels[0].g->childCount() )
322 Q_ASSERT( !levels[depth].g->hasChildGeometries() );
324 ++levels[depth].index;
327 while ( depth > 0 && levels[depth].index >= levels[depth].g->childCount() )
330 ++levels[depth].index;
347 Q_ASSERT( !levels[depth].g->hasChildGeometries() );
348 return levels[depth].g->childPoint( levels[depth].index );
353 int part = 0, ring = 0, vertex = levels[depth].index;
358 else if ( depth == 1 )
361 part = levels[0].index;
363 ring = levels[0].index;
365 else if ( depth == 2 )
367 part = levels[0].index;
368 ring = levels[1].index;
378 if (
const QgsCurve *curve = dynamic_cast<const QgsCurve *>( levels[depth].g ) )
381 curve->pointAt( vertex, p, vertexType );
384 return QgsVertexId( part, ring, vertex, vertexType );
389 if ( depth != other.depth )
391 int res = ::memcmp( levels, other.levels,
sizeof( Level ) * ( depth + 1 ) );
395 void QgsAbstractGeometry::vertex_iterator::digDown()
397 if ( levels[depth].g->hasChildGeometries() && levels[depth].index >= levels[depth].g->childCount() )
401 while ( levels[depth].g->hasChildGeometries() )
404 Q_ASSERT( depth < 3 );
405 levels[depth].index = 0;
406 levels[depth].g = levels[depth - 1].g->childGeometry( levels[depth - 1].index );
463 return mGeometry == other.mGeometry && mIndex == other.mIndex;
521 return mGeometry == other.mGeometry && mIndex == other.mIndex;
virtual bool isEmpty() const
Returns true if the geometry is empty.
A rectangle specified with double values.
Java-style iterator for traversal of parts of a geometry.
virtual void transformVertices(const std::function< QgsPoint(const QgsPoint &) > &transform)
Transforms the vertices from the geometry in place, applying the transform function to every vertex...
bool operator==(const_part_iterator other) const
QgsAbstractGeometry & operator=(const QgsAbstractGeometry &geom)
int partNumber() const
Returns the part number of the current item.
Java-style iterator for traversal of vertices of a geometry.
virtual bool hasCurvedSegments() const
Returns true if the geometry contains curved segments.
static bool isMultiType(Type type)
Returns true if the WKB type is a multi type.
QgsAbstractGeometry()=default
Constructor for QgsAbstractGeometry.
QVector< QgsRingSequence > QgsCoordinateSequence
Java-style iterator for const traversal of parts of a geometry.
QgsWkbTypes::Type wkbType() const
Returns the WKB type of the geometry.
virtual bool addMValue(double mValue=0)=0
Adds a measure to the geometry, initialized to a preset value.
const QgsAbstractGeometry * geometryN(int n) const
Returns a const reference to a geometry from within the collection.
The part_iterator class provides STL-style iterator for const references to geometry parts...
SegmentationToleranceType
Segmentation tolerance as maximum angle or maximum difference between approximation and circle...
virtual bool nextVertex(QgsVertexId &id, QgsPoint &vertex) const =0
Returns next vertex id and coordinates.
virtual QgsAbstractGeometry * clone() const =0
Clones the geometry by performing a deep copy.
static bool hasZ(Type type)
Tests whether a WKB type contains the z-dimension.
QgsPoint operator*() const
Returns the current item.
virtual QgsRectangle calculateBoundingBox() const
Default calculator for the minimal bounding box for the geometry.
vertex_iterator & operator++()
The prefix ++ operator (++it) advances the iterator to the next vertex and returns an iterator to the...
const QgsAbstractGeometry * operator*() const
Returns the current item.
QgsWkbTypes::Type mWkbType
vertex_iterator()=default
Create invalid iterator.
part_iterator()=default
Create invalid iterator.
Type
The WKB type describes the number of dimensions a geometry has.
bool isMeasure() const
Returns true if the geometry contains m values.
virtual int nCoordinates() const
Returns the number of nodes contained in the geometry.
part_iterator & operator++()
The prefix ++ operator (++it) advances the iterator to the next part and returns an iterator to the n...
static Type addM(Type type)
Adds the m dimension to a WKB type and returns the new type.
virtual void filterVertices(const std::function< bool(const QgsPoint &) > &filter)
Filters the vertices from the geometry in place, removing any which do not return true for the filter...
virtual QgsAbstractGeometry * segmentize(double tolerance=M_PI/180., SegmentationToleranceType toleranceType=MaximumAngle) const
Returns a version of the geometry without curves.
QString wktTypeStr() const
Returns the WKT type string of the geometry.
Utility class for identifying a unique vertex within a geometry.
virtual QgsPoint childPoint(int index) const
Returns point at index (for geometries without child geometries - i.e.
const_part_iterator()=default
Create invalid iterator.
The part_iterator class provides STL-style iterator for geometry parts.
void setZMTypeFromSubGeometry(const QgsAbstractGeometry *subggeom, QgsWkbTypes::Type baseGeomType)
Updates the geometry type based on whether sub geometries contain z or m values.
static Type addZ(Type type)
Adds the z dimension to a WKB type and returns the new type.
virtual bool hasChildGeometries() const
Returns whether the geometry has any child geometries (false for point / curve, true otherwise) ...
T qgsgeometry_cast(const QgsAbstractGeometry *geom)
part_iterator parts_end()
Returns STL-style iterator pointing to the imaginary part after the last part of the geometry...
Abstract base class for curved geometry type.
double & rx()
Returns a reference to the x-coordinate of this point.
Abstract base class for all geometries.
virtual int dimension() const =0
Returns the inherent dimension of the geometry.
virtual void clearCache() const
Clears any cached parameters associated with the geometry, e.g., bounding boxes.
The vertex_iterator class provides STL-style iterator for vertices.
Point geometry type, with support for z-dimension and m-values.
QgsVertexIterator vertices() const
Returns a read-only, Java-style iterator for traversal of vertices of all the geometry, including all geometry parts and rings.
virtual double length() const
Returns the length of the geometry.
QVector< QgsPoint > QgsPointSequence
virtual QgsCoordinateSequence coordinateSequence() const =0
Retrieves the sequence of geometries, rings and nodes.
const_part_iterator const_parts_end() const
Returns STL-style iterator pointing to the imaginary const part after the last part of the geometry...
int partCount() const override
Returns count of parts contained in the geometry.
QVector< QgsPointSequence > QgsRingSequence
const QgsAbstractGeometry * next()
Returns next part of the geometry (undefined behavior if hasNext() returns false before calling next(...
bool operator==(const vertex_iterator &other) const
QgsAbstractGeometry * operator*() const
Returns the current item.
virtual void clear()=0
Clears the geometry, ie reset it to a null geometry.
virtual QgsPoint centroid() const
Returns the centroid of the geometry.
QgsAbstractGeometry * next()
Returns next part of the geometry (undefined behavior if hasNext() returns false before calling next(...
virtual double perimeter() const
Returns the perimeter of the geometry.
QgsPoint next()
Returns next vertex of the geometry (undefined behavior if hasNext() returns false before calling nex...
virtual bool addZValue(double zValue=0)=0
Adds a z-dimension to the geometry, initialized to a preset value.
virtual int vertexCount(int part=0, int ring=0) const =0
Returns the number of vertices of which this geometry is built.
virtual double area() const
Returns the area of the geometry.
bool is3D() const
Returns true if the geometry is 3D and contains a z-value.
QgsGeometryConstPartIterator parts() const
Returns Java-style iterator for traversal of parts of the geometry.
virtual bool convertTo(QgsWkbTypes::Type type)
Converts the geometry to a specified type.
static bool hasM(Type type)
Tests whether a WKB type contains m values.
virtual bool dropMValue()=0
Drops any measure values which exist in the geometry.
const_part_iterator & operator++()
The prefix ++ operator (++it) advances the iterator to the next part and returns an iterator to the n...
virtual QgsPoint vertexAt(QgsVertexId id) const =0
Returns the point corresponding to a specified vertex id.
static Type flatType(Type type)
Returns the flat type for a WKB type.
QgsVertexId vertexId() const
Returns vertex ID of the current item.
double & ry()
Returns a reference to the y-coordinate of this point.
int partNumber() const
Returns the part number of the current item.
virtual bool dropZValue()=0
Drops any z-dimensions which exist in the geometry.
bool operator==(part_iterator other) const
virtual QString geometryType() const =0
Returns a unique string representing the geometry type.