QGIS API Documentation 3.99.0-Master (2fe06baccd8)
Loading...
Searching...
No Matches
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.h"
20#include "qgis_core.h"
22#include "qgsellipsoidutils.h"
23
24#include <QReadWriteLock>
25#include <QVector>
26
27class QgsGeometry;
29class QgsCurve;
30struct geod_geodesic;
31
53class CORE_EXPORT QgsDistanceArea
54{
55 public:
56
59
60 QgsDistanceArea( const QgsDistanceArea &other );
64
70 bool willUseEllipsoid() const;
71
77
83 QgsCoordinateReferenceSystem sourceCrs() const { return mCoordTransform.sourceCrs(); }
84
91 QgsCoordinateReferenceSystem ellipsoidCrs() const { return mCoordTransform.destinationCrs(); }
92
101 bool setEllipsoid( const QString &ellipsoid );
102
110 bool setEllipsoid( double semiMajor, double semiMinor );
111
119 QString ellipsoid() const { return mEllipsoid; }
120
127 double ellipsoidSemiMajor() const { return mSemiMajor; }
128
135 double ellipsoidSemiMinor() const { return mSemiMinor; }
136
144 double ellipsoidInverseFlattening() const { return mInvFlattening; }
145
156 double measureArea( const QgsGeometry &geometry ) const SIP_THROW( QgsCsException );
157
168 double measureLength( const QgsGeometry &geometry ) const SIP_THROW( QgsCsException );
169
180 double measurePerimeter( const QgsGeometry &geometry ) const SIP_THROW( QgsCsException );
181
189 double measureLine( const QVector<QgsPointXY> &points ) const SIP_THROW( QgsCsException );
190
199 double measureLine( const QgsPointXY &p1, const QgsPointXY &p2 ) const SIP_THROW( QgsCsException );
200
214 double measureLineProjected( const QgsPointXY &p1, double distance = 1, double azimuth = M_PI_2, QgsPointXY *projectedPoint SIP_OUT = nullptr ) const;
215
220 Qgis::DistanceUnit lengthUnits() const;
221
226 Qgis::AreaUnit areaUnits() const;
227
233 double measurePolygon( const QVector<QgsPointXY> &points ) const SIP_THROW( QgsCsException );
234
240 double bearing( const QgsPointXY &p1, const QgsPointXY &p2 ) const SIP_THROW( QgsCsException );
241
252 static QString formatDistance( double distance, int decimals, Qgis::DistanceUnit unit, bool keepBaseUnit = false );
253
264 static QString formatArea( double area, int decimals, Qgis::AreaUnit unit, bool keepBaseUnit = false );
265
275 double convertLengthMeasurement( double length, Qgis::DistanceUnit toUnits ) const;
276
286 double convertAreaMeasurement( double area, Qgis::AreaUnit toUnits ) const;
287
298 QgsPointXY computeSpheroidProject( const QgsPointXY &p1, double distance = 1, double azimuth = M_PI_2 ) const;
299
319 QVector<QVector<QgsPointXY> > geodesicLine( const QgsPointXY &p1, const QgsPointXY &p2, double interval, bool breakLine = false ) const;
320
339 double latitudeGeodesicCrossesAntimeridian( const QgsPointXY &p1, const QgsPointXY &p2, double &fractionAlongLine SIP_OUT ) const;
340
362 QgsGeometry splitGeometryAtAntimeridian( const QgsGeometry &geometry ) const;
363
364 private:
365
366 // Calculates area of polygon on ellipsoid
367 double computePolygonArea( const QVector<QgsPointXY> &points ) const;
368
369 double computePolygonFlatArea( const QVector<QgsPointXY> &points ) const;
370
375 void computeAreaInit() const;
376
377 void setFromParams( const QgsEllipsoidUtils::EllipsoidParameters &params );
378
379 enum MeasureType
380 {
381 Default,
382 Area,
383 Length
384 };
385
387 QgsCoordinateTransform mCoordTransform;
388
390 QString mEllipsoid;
391
393 double mSemiMajor, mSemiMinor, mInvFlattening;
394
395 mutable std::unique_ptr< geod_geodesic > mGeod;
396
397 // utility functions for polygon area measurement
398
399 double measure( const QgsAbstractGeometry *geomV2, MeasureType type = Default ) const;
400 double measureLine( const QgsCurve *curve ) const;
401 double measurePolygon( const QgsCurve *curve ) const;
402
403};
404
405#endif
406
DistanceUnit
Units of distance.
Definition qgis.h:5013
AreaUnit
Units of area.
Definition qgis.h:5090
Abstract base class for all geometries.
Represents a coordinate reference system (CRS).
Contains information about the context in which a coordinate transform is executed.
Custom exception class for Coordinate Reference System related exceptions.
Abstract base class for curved geometry type.
Definition qgscurve.h:36
QgsCoordinateReferenceSystem ellipsoidCrs() const
Returns the ellipsoid (destination) spatial reference system.
QgsDistanceArea & operator=(const QgsDistanceArea &other)
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.
void setSourceCrs(const QgsCoordinateReferenceSystem &crs, const QgsCoordinateTransformContext &context)
Sets source spatial reference system crs.
bool willUseEllipsoid() const
Returns whether calculations will use the ellipsoid.
double ellipsoidSemiMinor() const
Returns ellipsoid's semi minor axis.
A geometry is the spatial representation of a feature.
Represents a 2D point.
Definition qgspointxy.h:60
#define SIP_SKIP
Definition qgis_sip.h:134
#define SIP_OUT
Definition qgis_sip.h:58
#define SIP_THROW(name,...)
Definition qgis_sip.h:211
Contains parameters for an ellipsoid.