QGIS API Documentation  2.99.0-Master (19b062c)
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 QGSPOINTV2_H
19 #define QGSPOINTV2_H
20 
21 #include "qgis_core.h"
22 #include "qgis.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 = 0.0, double y = 0.0, 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( double x = 0.0, double y = 0.0, 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 z;
79  double m;
80 
81  if ( a2 == Py_None )
82  {
83  z = std::numeric_limits<double>::quiet_NaN();
84  }
85  else
86  {
87  z = PyFloat_AsDouble( a2 );
88  }
89 
90  if ( a3 == Py_None )
91  {
92  m = std::numeric_limits<double>::quiet_NaN();
93  }
94  else
95  {
96  m = PyFloat_AsDouble( a3 );
97  }
98 
99  sipCpp = new sipQgsPoint( a0, a1, z, m, a4 );
100  % End
101 #endif
102 
106  explicit QgsPoint( const QgsPointXY &p );
107 
111  explicit QgsPoint( QPointF p );
112 
118  explicit QgsPoint( QgsWkbTypes::Type wkbType, double x = 0.0, double y = 0.0, double z = std::numeric_limits<double>::quiet_NaN(), double m = std::numeric_limits<double>::quiet_NaN() ) SIP_SKIP;
119 
120  bool operator==( const QgsPoint &pt ) const;
121  bool operator!=( const QgsPoint &pt ) const;
122 
128  double x() const { return mX; }
129 
135  double y() const { return mY; }
136 
142  double z() const { return mZ; }
143 
149  double m() const { return mM; }
150 
158  double &rx() SIP_SKIP { clearCache(); return mX; }
159 
167  double &ry() SIP_SKIP { clearCache(); return mY; }
168 
176  double &rz() SIP_SKIP { clearCache(); return mZ; }
177 
185  double &rm() SIP_SKIP { clearCache(); return mM; }
186 
192  void setX( double x )
193  {
194  clearCache();
195  mX = x;
196  }
197 
203  void setY( double y )
204  {
205  clearCache();
206  mY = y;
207  }
208 
216  void setZ( double z )
217  {
218  if ( !is3D() )
219  return;
220  clearCache();
221  mZ = z;
222  }
223 
231  void setM( double m )
232  {
233  if ( !isMeasure() )
234  return;
235  clearCache();
236  mM = m;
237  }
238 
243  QPointF toQPointF() const;
244 
252  double distance( double x, double y ) const;
253 
260  double distance( const QgsPoint &other ) const;
261 
269  double distanceSquared( double x, double y ) const;
270 
278  double distanceSquared( const QgsPoint &other ) const;
279 
287  double distance3D( double x, double y, double z ) const;
288 
295  double distance3D( const QgsPoint &other ) const;
296 
304  double distanceSquared3D( double x, double y, double z ) const;
305 
313  double distanceSquared3D( const QgsPoint &other ) const;
314 
319  double azimuth( const QgsPoint &other ) const;
320 
326  double inclination( const QgsPoint &other ) const;
327 
356  QgsPoint project( double distance, double azimuth, double inclination = 90.0 ) const;
357 
362  QgsVector operator-( const QgsPoint &p ) const { return QgsVector( mX - p.mX, mY - p.mY ); }
363 
368  QgsPoint &operator+=( QgsVector v ) { mX += v.x(); mY += v.y(); return *this; }
369 
374  QgsPoint &operator-=( QgsVector v ) { mX -= v.x(); mY -= v.y(); return *this; }
375 
380  QgsPoint operator+( QgsVector v ) const { QgsPoint r = *this; r.rx() += v.x(); r.ry() += v.y(); return r; }
381 
386  QgsPoint operator-( QgsVector v ) const { QgsPoint r = *this; r.rx() -= v.x(); r.ry() -= v.y(); return r; }
387 
388  //implementation of inherited methods
389  bool isEmpty() const override;
390  QgsRectangle boundingBox() const override;
391  QString geometryType() const override;
392  int dimension() const override;
393  QgsPoint *clone() const override SIP_FACTORY;
394  virtual QgsPoint *snappedToGrid( double hSpacing, double vSpacing, double dSpacing = 0, double mSpacing = 0 ) const override SIP_FACTORY;
395  void clear() override;
396  bool fromWkb( QgsConstWkbPtr &wkb ) override;
397  bool fromWkt( const QString &wkt ) override;
398  QByteArray asWkb() const override;
399  QString asWkt( int precision = 17 ) const override;
400  QDomElement asGml2( QDomDocument &doc, int precision = 17, const QString &ns = "gml" ) const override;
401  QDomElement asGml3( QDomDocument &doc, int precision = 17, const QString &ns = "gml" ) const override;
402  QString asJson( int precision = 17 ) const override;
403  void draw( QPainter &p ) const override;
405  bool transformZ = false ) override;
406  void transform( const QTransform &t, double zTranslate = 0.0, double zScale = 1.0, double mTranslate = 0.0, double mScale = 1.0 ) override;
407  QgsCoordinateSequence coordinateSequence() const override;
408  int nCoordinates() const override;
409  int vertexNumberFromVertexId( QgsVertexId id ) const override;
410  QgsAbstractGeometry *boundary() const override SIP_FACTORY;
411 
412  //low-level editing
413  bool insertVertex( QgsVertexId position, const QgsPoint &vertex ) override;
414  bool moveVertex( QgsVertexId position, const QgsPoint &newPos ) override;
415  bool deleteVertex( QgsVertexId position ) override;
416 
417  double closestSegment( const QgsPoint &pt, QgsPoint &segmentPt SIP_OUT, QgsVertexId &vertexAfter SIP_OUT, int *leftOf SIP_OUT = nullptr, double epsilon = 4 * DBL_EPSILON ) const override;
418  bool nextVertex( QgsVertexId &id, QgsPoint &vertex SIP_OUT ) const override;
419  void adjacentVertices( QgsVertexId vertex, QgsVertexId &previousVertex SIP_OUT, QgsVertexId &nextVertex SIP_OUT ) const override;
420 
425  double vertexAngle( QgsVertexId vertex ) const override;
426 
427  int vertexCount( int /*part*/ = 0, int /*ring*/ = 0 ) const override;
428  int ringCount( int /*part*/ = 0 ) const override;
429  int partCount() const override;
430  QgsPoint vertexAt( QgsVertexId /*id*/ ) const override;
431  QgsPoint *toCurveType() const override SIP_FACTORY;
432  double segmentLength( QgsVertexId startVertex ) const override;
433 
434  bool addZValue( double zValue = 0 ) override;
435  bool addMValue( double mValue = 0 ) override;
436  bool dropZValue() override;
437  bool dropMValue() override;
438  bool convertTo( QgsWkbTypes::Type type ) override;
439 
440 #ifndef SIP_RUN
441 
449  inline const QgsPoint *cast( const QgsAbstractGeometry *geom ) const
450  {
451  if ( geom && QgsWkbTypes::flatType( geom->wkbType() ) == QgsWkbTypes::Point )
452  return static_cast<const QgsPoint *>( geom );
453  return nullptr;
454  }
455 #endif
456 
457  protected:
458  QgsPoint *createEmptyWithSameType() const override SIP_FACTORY;
459  int childCount() const override;
460  QgsPoint childPoint( int index ) const override;
461 
462  private:
463  double mX;
464  double mY;
465  double mZ;
466  double mM;
467 };
468 
469 // clazy:excludeall=qstring-allocations
470 
471 #endif // QGSPOINTV2_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.
A rectangle specified with double values.
Definition: qgsrectangle.h:39
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.
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 bool deleteVertex(QgsVertexId position)=0
Deletes a vertex within the geometry.
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:362
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:176
void setZ(double z)
Sets the point&#39;s z-coordinate.
Definition: qgspoint.h:216
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
A class to represent a 2D point.
Definition: qgspointxy.h:43
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...
virtual QString asJson(int precision=17) const =0
Returns a GeoJSON representation of the geometry.
virtual double closestSegment(const QgsPoint &pt, QgsPoint &segmentPt, QgsVertexId &vertexAfter, int *leftOf=nullptr, double epsilon=4 *DBL_EPSILON) const =0
Searches for the closest segment of the geometry to a given point.
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 void transform(const QgsCoordinateTransform &ct, QgsCoordinateTransform::TransformDirection d=QgsCoordinateTransform::ForwardTransform, bool transformZ=false)=0
Transforms the geometry using a coordinate transform.
virtual QgsAbstractGeometry * clone() const =0
Clones the geometry by performing a deep copy.
double y() const
Returns the point&#39;s y-coordinate.
Definition: qgspoint.h:135
Type
The WKB type describes the number of dimensions a geometry has.
Definition: qgswkbtypes.h:67
QgsPoint & operator-=(QgsVector v)
Subtracts a vector from this point in place.
Definition: qgspoint.h:374
void setM(double m)
Sets the point&#39;s m-value.
Definition: qgspoint.h:231
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.
Utility class for identifying a unique vertex within a geometry.
#define SIP_SKIP
Definition: qgis_sip.h:119
QgsPoint operator+(QgsVector v) const
Adds a vector to this point.
Definition: qgspoint.h:380
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:69
double & rx()
Returns a reference to the x-coordinate of this point.
Definition: qgspoint.h:158
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
A class to represent a vector.
Definition: qgsvector.h:27
void setX(double x)
Sets the point&#39;s x-coordinate.
Definition: qgspoint.h:192
void setY(double y)
Sets the point&#39;s y-coordinate.
Definition: qgspoint.h:203
double m() const
Returns the point&#39;s m value.
Definition: qgspoint.h:149
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:185
virtual void clear()=0
Clears the geometry, ie reset it to a null geometry.
virtual QDomElement asGml2(QDomDocument &doc, int precision=17, const QString &ns="gml") const =0
Returns a GML2 representation of the 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:449
#define SIP_OUT
Definition: qgis_sip.h:51
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.
virtual bool convertTo(QgsWkbTypes::Type type)
Converts the geometry to a specified type.
double z() const
Returns the point&#39;s z-coordinate.
Definition: qgspoint.h:142
virtual QDomElement asGml3(QDomDocument &doc, int precision=17, const QString &ns="gml") const =0
Returns a GML3 representation of the geometry.
QgsPoint operator-(QgsVector v) const
Subtracts a vector from this point.
Definition: qgspoint.h:386
Transform from source to destination CRS.
double x() const
Returns the vector&#39;s x-component.
Definition: qgsvector.cpp:76
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.
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:427
double y() const
Returns the vector&#39;s y-component.
Definition: qgsvector.cpp:81
double & ry()
Returns a reference to the y-coordinate of this point.
Definition: qgspoint.h:167
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
virtual bool dropZValue()=0
Drops any z-dimensions which exist in the geometry.
QgsPoint & operator+=(QgsVector v)
Adds a vector to this point in place.
Definition: qgspoint.h:368
virtual int partCount() const =0
Returns count of parts contained in 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.