QGIS API Documentation  2.99.0-Master (ae4d26a)
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  void clear() override;
395  bool fromWkb( QgsConstWkbPtr &wkb ) override;
396  bool fromWkt( const QString &wkt ) override;
397  QByteArray asWkb() const override;
398  QString asWkt( int precision = 17 ) const override;
399  QDomElement asGML2( QDomDocument &doc, int precision = 17, const QString &ns = "gml" ) const override;
400  QDomElement asGML3( QDomDocument &doc, int precision = 17, const QString &ns = "gml" ) const override;
401  QString asJSON( int precision = 17 ) const override;
402  void draw( QPainter &p ) const override;
404  bool transformZ = false ) override;
405  void transform( const QTransform &t ) override;
406  QgsCoordinateSequence coordinateSequence() const override;
407  int nCoordinates() const override;
408  QgsAbstractGeometry *boundary() const override SIP_FACTORY;
409 
410  //low-level editing
411  bool insertVertex( QgsVertexId position, const QgsPoint &vertex ) override;
412  bool moveVertex( QgsVertexId position, const QgsPoint &newPos ) override;
413  bool deleteVertex( QgsVertexId position ) override;
414 
415  double closestSegment( const QgsPoint &pt, QgsPoint &segmentPt SIP_OUT, QgsVertexId &vertexAfter SIP_OUT, bool *leftOf SIP_OUT = nullptr, double epsilon = 4 * DBL_EPSILON ) const override;
416  bool nextVertex( QgsVertexId &id, QgsPoint &vertex SIP_OUT ) const override;
417 
422  double vertexAngle( QgsVertexId vertex ) const override;
423 
424  int vertexCount( int /*part*/ = 0, int /*ring*/ = 0 ) const override;
425  int ringCount( int /*part*/ = 0 ) const override;
426  int partCount() const override;
427  QgsPoint vertexAt( QgsVertexId /*id*/ ) const override;
428  QgsPoint *toCurveType() const override SIP_FACTORY;
429 
430  bool addZValue( double zValue = 0 ) override;
431  bool addMValue( double mValue = 0 ) override;
432  bool dropZValue() override;
433  bool dropMValue() override;
434  bool convertTo( QgsWkbTypes::Type type ) override;
435 
436 #ifndef SIP_RUN
437 
445  inline const QgsPoint *cast( const QgsAbstractGeometry *geom ) const
446  {
447  if ( geom && QgsWkbTypes::flatType( geom->wkbType() ) == QgsWkbTypes::Point )
448  return static_cast<const QgsPoint *>( geom );
449  return nullptr;
450  }
451 #endif
452 
453  protected:
454  virtual int childCount() const override;
455  virtual QgsPoint childPoint( int index ) const override;
456 
457  private:
458  double mX;
459  double mY;
460  double mZ;
461  double mM;
462 };
463 
464 // clazy:excludeall=qstring-allocations
465 
466 #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 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.
double ANALYSIS_EXPORT leftOf(QgsPoint *thepoint, QgsPoint *p1, 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
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 * 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.
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.
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 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:445
#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 QDomElement asGML3(QDomDocument &doc, int precision=17, const QString &ns="gml") const =0
Returns a GML3 representation of the geometry.
virtual int vertexCount(int part=0, int ring=0) const =0
Returns the number of vertices of which this geometry is built.
virtual double closestSegment(const QgsPoint &pt, QgsPoint &segmentPt, QgsVertexId &vertexAfter, bool *leftOf=nullptr, double epsilon=4 *DBL_EPSILON) const =0
Searches for the closest segment of the geometry to a given point.
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
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
QList< QgsRingSequence > QgsCoordinateSequence
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.
virtual QDomElement asGML2(QDomDocument &doc, int precision=17, const QString &ns="gml") const =0
Returns a GML2 representation of 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.
virtual bool dropZValue()=0
Drops any z-dimensions which exist in the geometry.
virtual QString asJSON(int precision=17) const =0
Returns a GeoJSON representation of 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.