QGIS API Documentation  3.9.0-Master (224899f119)
qgspoint.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgspointv2.h
3  --------------
4  begin : September 2014
5  copyright : (C) 2014 by Marco Hugentobler
6  email : marco at sourcepole dot ch
7  ***************************************************************************/
8 
9 /***************************************************************************
10  * *
11  * This program is free software; you can redistribute it and/or modify *
12  * it under the terms of the GNU General Public License as published by *
13  * the Free Software Foundation; either version 2 of the License, or *
14  * (at your option) any later version. *
15  * *
16  ***************************************************************************/
17 
18 #ifndef QGSPOINT_H
19 #define QGSPOINT_H
20 
21 #include "qgis_core.h"
22 #include "qgis_sip.h"
23 #include "qgsabstractgeometry.h"
24 #include "qgsrectangle.h"
25 
26 /***************************************************************************
27  * This class is considered CRITICAL and any change MUST be accompanied with
28  * full unit tests in testqgsgeometry.cpp.
29  * See details in QEP #17
30  ****************************************************************************/
31 
37 class CORE_EXPORT QgsPoint: public QgsAbstractGeometry
38 {
39  Q_GADGET
40 
41  Q_PROPERTY( double x READ x WRITE setX )
42  Q_PROPERTY( double y READ y WRITE setY )
43  Q_PROPERTY( double z READ z WRITE setZ )
44  Q_PROPERTY( double m READ m WRITE setM )
45 
46  public:
47 
73 #ifndef SIP_RUN
74  QgsPoint( double x = std::numeric_limits<double>::quiet_NaN(), double y = std::numeric_limits<double>::quiet_NaN(), double z = std::numeric_limits<double>::quiet_NaN(), double m = std::numeric_limits<double>::quiet_NaN(), QgsWkbTypes::Type wkbType = QgsWkbTypes::Unknown );
75 #else
76  QgsPoint( SIP_PYOBJECT x = Py_None, SIP_PYOBJECT y = Py_None, SIP_PYOBJECT z = Py_None, SIP_PYOBJECT m = Py_None, QgsWkbTypes::Type wkbType = QgsWkbTypes::Unknown ) [( double x = 0.0, double y = 0.0, double z = 0.0, double m = 0.0, QgsWkbTypes::Type wkbType = QgsWkbTypes::Unknown )];
77  % MethodCode
78  double x;
79  double y;
80  double z;
81  double m;
82 
83  if ( a0 == Py_None )
84  {
85  x = std::numeric_limits<double>::quiet_NaN();
86  }
87  else
88  {
89  x = PyFloat_AsDouble( a0 );
90  }
91 
92  if ( a1 == Py_None )
93  {
94  y = std::numeric_limits<double>::quiet_NaN();
95  }
96  else
97  {
98  y = PyFloat_AsDouble( a1 );
99  }
100 
101  if ( a2 == Py_None )
102  {
103  z = std::numeric_limits<double>::quiet_NaN();
104  }
105  else
106  {
107  z = PyFloat_AsDouble( a2 );
108  }
109 
110  if ( a3 == Py_None )
111  {
112  m = std::numeric_limits<double>::quiet_NaN();
113  }
114  else
115  {
116  m = PyFloat_AsDouble( a3 );
117  }
118 
119  sipCpp = new sipQgsPoint( x, y, z, m, a4 );
120  % End
121 #endif
122 
126  explicit QgsPoint( const QgsPointXY &p );
127 
131  explicit QgsPoint( QPointF p );
132 
138  explicit QgsPoint( QgsWkbTypes::Type wkbType, double x = std::numeric_limits<double>::quiet_NaN(), double y = std::numeric_limits<double>::quiet_NaN(), double z = std::numeric_limits<double>::quiet_NaN(), double m = std::numeric_limits<double>::quiet_NaN() ) SIP_SKIP;
139 
140  bool operator==( const QgsAbstractGeometry &other ) const override
141  {
142  const QgsPoint *pt = qgsgeometry_cast< const QgsPoint * >( &other );
143  if ( !pt )
144  return false;
145 
146  const QgsWkbTypes::Type type = wkbType();
147 
148  if ( pt->wkbType() != type )
149  return false;
150 
151  const bool nan1X = std::isnan( mX );
152  const bool nan2X = std::isnan( pt->x() );
153  if ( nan1X != nan2X )
154  return false;
155  if ( !nan1X && !qgsDoubleNear( mX, pt->x(), 1E-8 ) )
156  return false;
157 
158  const bool nan1Y = std::isnan( mY );
159  const bool nan2Y = std::isnan( pt->y() );
160  if ( nan1Y != nan2Y )
161  return false;
162  if ( !nan1Y && !qgsDoubleNear( mY, pt->y(), 1E-8 ) )
163  return false;
164 
165  if ( QgsWkbTypes::hasZ( type ) )
166  {
167  const bool nan1Z = std::isnan( mZ );
168  const bool nan2Z = std::isnan( pt->z() );
169  if ( nan1Z != nan2Z )
170  return false;
171  if ( !nan1Z && !qgsDoubleNear( mZ, pt->z(), 1E-8 ) )
172  return false;
173  }
174 
175  if ( QgsWkbTypes::hasM( type ) )
176  {
177  const bool nan1M = std::isnan( mM );
178  const bool nan2M = std::isnan( pt->m() );
179  if ( nan1M != nan2M )
180  return false;
181  if ( !nan1M && !qgsDoubleNear( mM, pt->m(), 1E-8 ) )
182  return false;
183  }
184 
185  return true;
186  }
187 
188  bool operator!=( const QgsAbstractGeometry &other ) const override
189  {
190  return !operator==( other );
191  }
192 
198  double x() const { return mX; }
199 
205  double y() const { return mY; }
206 
212  double z() const { return mZ; }
213 
219  double m() const { return mM; }
220 
228  double &rx() SIP_SKIP { clearCache(); return mX; }
229 
237  double &ry() SIP_SKIP { clearCache(); return mY; }
238 
246  double &rz() SIP_SKIP { clearCache(); return mZ; }
247 
255  double &rm() SIP_SKIP { clearCache(); return mM; }
256 
262  void setX( double x )
263  {
264  clearCache();
265  mX = x;
266  }
267 
273  void setY( double y )
274  {
275  clearCache();
276  mY = y;
277  }
278 
286  void setZ( double z )
287  {
288  if ( !is3D() )
289  return;
290  clearCache();
291  mZ = z;
292  }
293 
301  void setM( double m )
302  {
303  if ( !isMeasure() )
304  return;
305  clearCache();
306  mM = m;
307  }
308 
313  QPointF toQPointF() const
314  {
315  return QPointF( mX, mY );
316  }
317 
325  double distance( double x, double y ) const
326  {
327  return std::sqrt( ( mX - x ) * ( mX - x ) + ( mY - y ) * ( mY - y ) );
328  }
329 
336  double distance( const QgsPoint &other ) const
337  {
338  return std::sqrt( ( mX - other.x() ) * ( mX - other.x() ) + ( mY - other.y() ) * ( mY - other.y() ) );
339  }
340 
348  double distanceSquared( double x, double y ) const
349  {
350  return ( mX - x ) * ( mX - x ) + ( mY - y ) * ( mY - y );
351  }
352 
360  double distanceSquared( const QgsPoint &other ) const
361  {
362  return ( mX - other.x() ) * ( mX - other.x() ) + ( mY - other.y() ) * ( mY - other.y() );
363  }
364 
372  double distance3D( double x, double y, double z ) const;
373 
380  double distance3D( const QgsPoint &other ) const;
381 
389  double distanceSquared3D( double x, double y, double z ) const;
390 
398  double distanceSquared3D( const QgsPoint &other ) const;
399 
404  double azimuth( const QgsPoint &other ) const;
405 
411  double inclination( const QgsPoint &other ) const;
412 
441  QgsPoint project( double distance, double azimuth, double inclination = 90.0 ) const;
442 
447  QgsVector operator-( const QgsPoint &p ) const { return QgsVector( mX - p.mX, mY - p.mY ); }
448 
453  QgsPoint &operator+=( QgsVector v ) { mX += v.x(); mY += v.y(); return *this; }
454 
459  QgsPoint &operator-=( QgsVector v ) { mX -= v.x(); mY -= v.y(); return *this; }
460 
465  QgsPoint operator+( QgsVector v ) const { QgsPoint r = *this; r.rx() += v.x(); r.ry() += v.y(); return r; }
466 
471  QgsPoint operator-( QgsVector v ) const { QgsPoint r = *this; r.rx() -= v.x(); r.ry() -= v.y(); return r; }
472 
473  //implementation of inherited methods
474  bool isEmpty() const override;
475  QgsRectangle boundingBox() const override;
476  QString geometryType() const override;
477  int dimension() const override;
478  QgsPoint *clone() const override SIP_FACTORY;
479  QgsPoint *snappedToGrid( double hSpacing, double vSpacing, double dSpacing = 0, double mSpacing = 0 ) const override SIP_FACTORY;
480  bool removeDuplicateNodes( double epsilon = 4 * std::numeric_limits<double>::epsilon(), bool useZValues = false ) override;
481  void clear() override;
482  bool fromWkb( QgsConstWkbPtr &wkb ) override;
483  bool fromWkt( const QString &wkt ) override;
484  QByteArray asWkb() const override;
485  QString asWkt( int precision = 17 ) const override;
486  QDomElement asGml2( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
487  QDomElement asGml3( QDomDocument &doc, int precision = 17, const QString &ns = "gml", QgsAbstractGeometry::AxisOrder axisOrder = QgsAbstractGeometry::AxisOrder::XY ) const override;
488  json asJsonObject( int precision = 17 ) const override SIP_SKIP;
489  void draw( QPainter &p ) const override;
491  void transform( const QTransform &t, double zTranslate = 0.0, double zScale = 1.0, double mTranslate = 0.0, double mScale = 1.0 ) override;
492  QgsCoordinateSequence coordinateSequence() const override;
493  int nCoordinates() const override;
494  int vertexNumberFromVertexId( QgsVertexId id ) const override;
495  QgsAbstractGeometry *boundary() const override SIP_FACTORY;
496  bool isValid( QString &error SIP_OUT, int flags = 0 ) const override;
497 
498  //low-level editing
499  bool insertVertex( QgsVertexId position, const QgsPoint &vertex ) override;
500  bool moveVertex( QgsVertexId position, const QgsPoint &newPos ) override;
501  bool deleteVertex( QgsVertexId position ) override;
502 
503  double closestSegment( const QgsPoint &pt, QgsPoint &segmentPt SIP_OUT, QgsVertexId &vertexAfter SIP_OUT, int *leftOf SIP_OUT = nullptr, double epsilon = 4 * std::numeric_limits<double>::epsilon() ) const override;
504  bool nextVertex( QgsVertexId &id, QgsPoint &vertex SIP_OUT ) const override;
505  void adjacentVertices( QgsVertexId vertex, QgsVertexId &previousVertex SIP_OUT, QgsVertexId &nextVertex SIP_OUT ) const override;
506 
511  double vertexAngle( QgsVertexId vertex ) const override;
512 
513  int vertexCount( int /*part*/ = 0, int /*ring*/ = 0 ) const override;
514  int ringCount( int /*part*/ = 0 ) const override;
515  int partCount() const override;
516  QgsPoint vertexAt( QgsVertexId /*id*/ ) const override;
517  QgsPoint *toCurveType() const override SIP_FACTORY;
518  double segmentLength( QgsVertexId startVertex ) const override;
519 
520  bool addZValue( double zValue = 0 ) override;
521  bool addMValue( double mValue = 0 ) override;
522  bool dropZValue() override;
523  bool dropMValue() override;
524  void swapXy() override;
525  bool convertTo( QgsWkbTypes::Type type ) override;
526 
527 #ifndef SIP_RUN
528 
529  void filterVertices( const std::function< bool( const QgsPoint & ) > &filter ) override;
530  void transformVertices( const std::function< QgsPoint( const QgsPoint & ) > &transform ) override;
531 
539  inline const QgsPoint *cast( const QgsAbstractGeometry *geom ) const
540  {
541  if ( geom && QgsWkbTypes::flatType( geom->wkbType() ) == QgsWkbTypes::Point )
542  return static_cast<const QgsPoint *>( geom );
543  return nullptr;
544  }
545 #endif
546 
547  QgsPoint *createEmptyWithSameType() const override SIP_FACTORY;
548 
549 #ifdef SIP_RUN
550  SIP_PYOBJECT __repr__();
551  % MethodCode
552  QString str = QStringLiteral( "<QgsPoint: %1>" ).arg( sipCpp->asWkt() );
553  sipRes = PyUnicode_FromString( str.toUtf8().constData() );
554  % End
555 #endif
556 
557  protected:
558 
559  int childCount() const override;
560  QgsPoint childPoint( int index ) const override;
561 
562  private:
563  double mX;
564  double mY;
565  double mZ;
566  double mM;
567 };
568 
569 // clazy:excludeall=qstring-allocations
570 
571 #endif // QGSPOINT_H
bool isMeasure() const
Returns true if the geometry contains m values.
virtual QString asWkt(int precision=17) const =0
Returns a WKT representation of the geometry.
int precision
A rectangle specified with double values.
Definition: qgsrectangle.h:41
virtual QgsAbstractGeometry * snappedToGrid(double hSpacing, double vSpacing, double dSpacing=0, double mSpacing=0) const =0
Makes a new geometry with all the points or vertices snapped to the closest point of the grid...
virtual int vertexNumberFromVertexId(QgsVertexId id) const =0
Returns the vertex number corresponding to a vertex id.
double y
Definition: qgspoint.h:42
virtual int childCount() const
Returns number of child geometries (for geometries with child geometries) or child points (for geomet...
virtual bool isEmpty() const
Returns true if the geometry is empty.
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...
virtual bool deleteVertex(QgsVertexId position)=0
Deletes a vertex within the geometry.
virtual bool isValid(QString &error, int flags=0) const =0
Checks validity of the geometry, and returns true if the geometry is valid.
virtual void transform(const QgsCoordinateTransform &ct, QgsCoordinateTransform::TransformDirection d=QgsCoordinateTransform::ForwardTransform, bool transformZ=false) SIP_THROW(QgsCsException)=0
Transforms the geometry using a coordinate transform.
virtual QgsAbstractGeometry * toCurveType() const =0
Returns the geometry converted to the more generic curve type.
QgsVector operator-(const QgsPoint &p) const
Calculates the vector obtained by subtracting a point from this point.
Definition: qgspoint.h:447
virtual QByteArray asWkb() const =0
Returns a WKB representation of the geometry.
double & rz()
Returns a reference to the z-coordinate of this point.
Definition: qgspoint.h:246
QPointF toQPointF() const
Returns the point as a QPointF.
Definition: qgspoint.h:313
void setZ(double z)
Sets the point&#39;s z-coordinate.
Definition: qgspoint.h:286
virtual bool insertVertex(QgsVertexId position, const QgsPoint &vertex)=0
Inserts a vertex into the geometry.
virtual QgsPoint childPoint(int index) const
Returns point at index (for geometries without child geometries - i.e.
QVector< QgsRingSequence > QgsCoordinateSequence
double distance(double x, double y) const
Returns the Cartesian 2D distance between this point and a specified x, y coordinate.
Definition: qgspoint.h:325
A class to represent a 2D point.
Definition: qgspointxy.h:43
bool qgsDoubleNear(double a, double b, double epsilon=4 *std::numeric_limits< double >::epsilon())
Compare two doubles (but allow some difference)
Definition: qgis.h:265
virtual bool operator==(const QgsAbstractGeometry &other) const =0
TransformDirection
Enum used to indicate the direction (forward or inverse) of the transform.
virtual double vertexAngle(QgsVertexId vertex) const =0
Returns approximate angle at a vertex.
virtual bool addMValue(double mValue=0)=0
Adds a measure to the geometry, initialized to a preset value.
virtual QgsAbstractGeometry * createEmptyWithSameType() const =0
Creates a new geometry with the same class and same WKB type as the original and transfers ownership...
bool operator!=(const QgsAbstractGeometry &other) const override
Definition: qgspoint.h:188
virtual QDomElement asGml2(QDomDocument &doc, int precision=17, const QString &ns="gml", AxisOrder axisOrder=QgsAbstractGeometry::AxisOrder::XY) const =0
Returns a GML2 representation of the geometry.
virtual QgsAbstractGeometry * boundary() const =0
Returns the closure of the combinatorial boundary of the geometry (ie the topological boundary of the...
virtual bool nextVertex(QgsVertexId &id, QgsPoint &vertex) const =0
Returns next vertex id and coordinates.
virtual QgsRectangle boundingBox() const =0
Returns the minimal bounding box for the geometry.
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.
Definition: qgswkbtypes.h:917
double y() const
Returns the point&#39;s y-coordinate.
Definition: qgspoint.h:205
Type
The WKB type describes the number of dimensions a geometry has.
Definition: qgswkbtypes.h:68
QgsPoint & operator-=(QgsVector v)
Subtracts a vector from this point in place.
Definition: qgspoint.h:459
void setM(double m)
Sets the point&#39;s m-value.
Definition: qgspoint.h:301
virtual double closestSegment(const QgsPoint &pt, QgsPoint &segmentPt, QgsVertexId &vertexAfter, int *leftOf=nullptr, double epsilon=4 *std::numeric_limits< double >::epsilon()) const =0
Searches for the closest segment of the geometry to a given point.
virtual void clearCache() const
Clears any cached parameters associated with the geometry, e.g., bounding boxes.
virtual double segmentLength(QgsVertexId startVertex) const =0
Returns the length of the segment of the geometry which begins at startVertex.
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...
Utility class for identifying a unique vertex within a geometry.
#define SIP_SKIP
Definition: qgis_sip.h:126
QgsPoint operator+(QgsVector v) const
Adds a vector to this point.
Definition: qgspoint.h:465
T qgsgeometry_cast(const QgsAbstractGeometry *geom)
double distance(const QgsPoint &other) const
Returns the Cartesian 2D distance between this point and another point.
Definition: qgspoint.h:336
virtual int ringCount(int part=0) const =0
Returns the number of rings of which this geometry is built.
#define SIP_FACTORY
Definition: qgis_sip.h:76
double & rx()
Returns a reference to the x-coordinate of this point.
Definition: qgspoint.h:228
Abstract base class for all geometries.
virtual int dimension() const =0
Returns the inherent dimension of the geometry.
QgsWkbTypes::Type wkbType() const
Returns the WKB type of the geometry.
Point geometry type, with support for z-dimension and m-values.
Definition: qgspoint.h:37
AxisOrder
Axis order for GML generation.
A class to represent a vector.
Definition: qgsvector.h:29
void setX(double x)
Sets the point&#39;s x-coordinate.
Definition: qgspoint.h:262
void setY(double y)
Sets the point&#39;s y-coordinate.
Definition: qgspoint.h:273
double m() const
Returns the point&#39;s m value.
Definition: qgspoint.h:219
virtual QgsCoordinateSequence coordinateSequence() const =0
Retrieves the sequence of geometries, rings and nodes.
virtual void adjacentVertices(QgsVertexId vertex, QgsVertexId &previousVertex, QgsVertexId &nextVertex) const =0
Returns the vertices adjacent to a specified vertex within a geometry.
double & rm()
Returns a reference to the m value of this point.
Definition: qgspoint.h:255
virtual void clear()=0
Clears the geometry, ie reset it to a null geometry.
virtual bool moveVertex(QgsVertexId position, const QgsPoint &newPos)=0
Moves a vertex within the geometry.
virtual void draw(QPainter &p) const =0
Draws the geometry using the specified QPainter.
const QgsPoint * cast(const QgsAbstractGeometry *geom) const
Cast the geom to a QgsPoint.
Definition: qgspoint.h:539
#define SIP_OUT
Definition: qgis_sip.h:58
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.
Class for doing transforms between two map coordinate systems.
#define SIP_THROW(name)
Definition: qgis_sip.h:184
virtual bool convertTo(QgsWkbTypes::Type type)
Converts the geometry to a specified type.
double z
Definition: qgspoint.h:43
double z() const
Returns the point&#39;s z-coordinate.
Definition: qgspoint.h:212
static bool hasM(Type type)
Tests whether a WKB type contains m values.
Definition: qgswkbtypes.h:967
QgsPoint operator-(QgsVector v) const
Subtracts a vector from this point.
Definition: qgspoint.h:471
Transform from source to destination CRS.
double x() const
Returns the vector&#39;s x-component.
Definition: qgsvector.cpp:76
virtual bool removeDuplicateNodes(double epsilon=4 *std::numeric_limits< double >::epsilon(), bool useZValues=false)=0
Removes duplicate nodes from the geometry, wherever removing the nodes does not result in a degenerat...
Custom exception class for Coordinate Reference System related exceptions.
Definition: qgsexception.h:65
virtual bool dropMValue()=0
Drops any measure values which exist in the geometry.
virtual bool fromWkt(const QString &wkt)=0
Sets the geometry from a WKT string.
double distanceSquared(double x, double y) const
Returns the Cartesian 2D squared distance between this point a specified x, y coordinate.
Definition: qgspoint.h:348
virtual QgsPoint vertexAt(QgsVertexId id) const =0
Returns the point corresponding to a specified vertex id.
virtual int nCoordinates() const
Returns the number of nodes contained in the geometry.
static Type flatType(Type type)
Returns the flat type for a WKB type.
Definition: qgswkbtypes.h:576
virtual void swapXy()=0
Swaps the x and y coordinates from the geometry.
double y() const
Returns the vector&#39;s y-component.
Definition: qgsvector.cpp:81
virtual json asJsonObject(int precision=17) const
Returns a json object representation of the geometry.
double & ry()
Returns a reference to the y-coordinate of this point.
Definition: qgspoint.h:237
bool is3D() const
Returns true if the geometry is 3D and contains a z-value.
double ANALYSIS_EXPORT leftOf(const QgsPoint &thepoint, const QgsPoint *p1, const QgsPoint *p2)
Returns whether &#39;thepoint&#39; is left or right of the line from &#39;p1&#39; to &#39;p2&#39;. Negativ values mean left a...
Definition: MathUtils.cpp:292
double distanceSquared(const QgsPoint &other) const
Returns the Cartesian 2D squared distance between this point another point.
Definition: qgspoint.h:360
virtual bool dropZValue()=0
Drops any z-dimensions which exist in the geometry.
double x() const
Returns the point&#39;s x-coordinate.
Definition: qgspoint.h:198
QgsPoint & operator+=(QgsVector v)
Adds a vector to this point in place.
Definition: qgspoint.h:453
virtual int partCount() const =0
Returns count of parts contained in the geometry.
double m
Definition: qgspoint.h:44
virtual QDomElement asGml3(QDomDocument &doc, int precision=17, const QString &ns="gml", AxisOrder axisOrder=QgsAbstractGeometry::AxisOrder::XY) const =0
Returns a GML3 representation of the geometry.
virtual QString geometryType() const =0
Returns a unique string representing the geometry type.
virtual bool fromWkb(QgsConstWkbPtr &wkb)=0
Sets the geometry from a WKB string.
double x
Definition: qgspoint.h:41