QGIS API Documentation  3.37.0-Master (a5b4d9743e8)
qgsdistancearea.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgsdistancearea.h - Distance and area calculations on the ellipsoid
3  ---------------------------------------------------------------------------
4  Date : September 2005
5  Copyright : (C) 2005 by Martin Dobias
6  email : won.der at centrum.sk
7  ***************************************************************************
8  * *
9  * This program is free software; you can redistribute it and/or modify *
10  * it under the terms of the GNU General Public License as published by *
11  * the Free Software Foundation; either version 2 of the License, or *
12  * (at your option) any later version. *
13  * *
14  ***************************************************************************/
15 
16 #ifndef QGSDISTANCEAREA_H
17 #define QGSDISTANCEAREA_H
18 
19 #include "qgis_core.h"
20 #include <QVector>
21 #include <QReadWriteLock>
22 #include "qgscoordinatetransform.h"
23 #include "qgis.h"
24 #include "qgsellipsoidutils.h"
25 
26 class QgsGeometry;
28 class QgsCurve;
29 struct geod_geodesic;
30 
52 class CORE_EXPORT QgsDistanceArea
53 {
54  public:
55 
59 
61  QgsDistanceArea( const QgsDistanceArea &other );
62  QgsDistanceArea &operator=( const QgsDistanceArea &other );
63 
69  bool willUseEllipsoid() const;
70 
75  void setSourceCrs( const QgsCoordinateReferenceSystem &crs, const QgsCoordinateTransformContext &context );
76 
82  QgsCoordinateReferenceSystem sourceCrs() const { return mCoordTransform.sourceCrs(); }
83 
90  QgsCoordinateReferenceSystem ellipsoidCrs() const { return mCoordTransform.destinationCrs(); }
91 
100  bool setEllipsoid( const QString &ellipsoid );
101 
109  bool setEllipsoid( double semiMajor, double semiMinor );
110 
118  QString ellipsoid() const { return mEllipsoid; }
119 
126  double ellipsoidSemiMajor() const { return mSemiMajor; }
127 
134  double ellipsoidSemiMinor() const { return mSemiMinor; }
135 
143  double ellipsoidInverseFlattening() const { return mInvFlattening; }
144 
154  double measureArea( const QgsGeometry &geometry ) const;
155 
165  double measureLength( const QgsGeometry &geometry ) const;
166 
176  double measurePerimeter( const QgsGeometry &geometry ) const;
177 
184  double measureLine( const QVector<QgsPointXY> &points ) const;
185 
193  double measureLine( const QgsPointXY &p1, const QgsPointXY &p2 ) const;
194 
208  double measureLineProjected( const QgsPointXY &p1, double distance = 1, double azimuth = M_PI_2, QgsPointXY *projectedPoint SIP_OUT = nullptr ) const;
209 
214  Qgis::DistanceUnit lengthUnits() const;
215 
220  Qgis::AreaUnit areaUnits() const;
221 
225  double measurePolygon( const QVector<QgsPointXY> &points ) const;
226 
232  double bearing( const QgsPointXY &p1, const QgsPointXY &p2 ) const SIP_THROW( QgsCsException );
233 
244  static QString formatDistance( double distance, int decimals, Qgis::DistanceUnit unit, bool keepBaseUnit = false );
245 
256  static QString formatArea( double area, int decimals, Qgis::AreaUnit unit, bool keepBaseUnit = false );
257 
267  double convertLengthMeasurement( double length, Qgis::DistanceUnit toUnits ) const;
268 
278  double convertAreaMeasurement( double area, Qgis::AreaUnit toUnits ) const;
279 
290  QgsPointXY computeSpheroidProject( const QgsPointXY &p1, double distance = 1, double azimuth = M_PI_2 ) const;
291 
311  QVector<QVector<QgsPointXY> > geodesicLine( const QgsPointXY &p1, const QgsPointXY &p2, double interval, bool breakLine = false ) const;
312 
331  double latitudeGeodesicCrossesAntimeridian( const QgsPointXY &p1, const QgsPointXY &p2, double &fractionAlongLine SIP_OUT ) const;
332 
354  QgsGeometry splitGeometryAtAntimeridian( const QgsGeometry &geometry ) const;
355 
356  private:
357 
362  double computePolygonArea( const QVector<QgsPointXY> &points ) const;
363 
364  double computePolygonFlatArea( const QVector<QgsPointXY> &points ) const;
365 
370  void computeAreaInit() const;
371 
372  void setFromParams( const QgsEllipsoidUtils::EllipsoidParameters &params );
373 
374  enum MeasureType
375  {
376  Default,
377  Area,
378  Length
379  };
380 
382  QgsCoordinateTransform mCoordTransform;
383 
385  QString mEllipsoid;
386 
388  double mSemiMajor, mSemiMinor, mInvFlattening;
389 
390  mutable std::unique_ptr< geod_geodesic > mGeod;
391 
392  // utility functions for polygon area measurement
393 
394  double measure( const QgsAbstractGeometry *geomV2, MeasureType type = Default ) const;
395  double measureLine( const QgsCurve *curve ) const;
396  double measurePolygon( const QgsCurve *curve ) const;
397 
398 };
399 
400 #endif
401 
DistanceUnit
Units of distance.
Definition: qgis.h:4090
AreaUnit
Units of area.
Definition: qgis.h:4128
Abstract base class for all geometries.
This class represents a coordinate reference system (CRS).
Contains information about the context in which a coordinate transform is executed.
Class for doing transforms between two map coordinate systems.
Custom exception class for Coordinate Reference System related exceptions.
Definition: qgsexception.h:67
Abstract base class for curved geometry type.
Definition: qgscurve.h:35
A general purpose distance and area calculator, capable of performing ellipsoid based calculations.
QgsCoordinateReferenceSystem ellipsoidCrs() const
Returns the ellipsoid (destination) spatial reference system.
QgsCoordinateReferenceSystem sourceCrs() const
Returns the source spatial reference system.
double ellipsoidInverseFlattening() const
Returns ellipsoid's inverse flattening.
QString ellipsoid() const
Returns ellipsoid's acronym.
double ellipsoidSemiMajor() const
Returns the ellipsoid's semi major axis.
double ellipsoidSemiMinor() const
Returns ellipsoid's semi minor axis.
A geometry is the spatial representation of a feature.
Definition: qgsgeometry.h:162
A class to represent a 2D point.
Definition: qgspointxy.h:60
#define SIP_OUT
Definition: qgis_sip.h:58
#define SIP_THROW(name,...)
Definition: qgis_sip.h:203
const QgsCoordinateReferenceSystem & crs
Contains parameters for an ellipsoid.