QGIS API Documentation 4.0.0-Norrköping (1ddcee3d0e4)
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:
58
59 QgsDistanceArea( const QgsDistanceArea &other );
63
69 bool willUseEllipsoid() const;
70
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
155 double measureArea( const QgsGeometry &geometry ) const SIP_THROW( QgsCsException );
156
167 double measureLength( const QgsGeometry &geometry ) const SIP_THROW( QgsCsException );
168
179 double measurePerimeter( const QgsGeometry &geometry ) const SIP_THROW( QgsCsException );
180
188 double measureLine( const QVector<QgsPointXY> &points ) const SIP_THROW( QgsCsException );
189
198 double measureLine( const QgsPointXY &p1, const QgsPointXY &p2 ) const SIP_THROW( QgsCsException );
199
213 double measureLineProjected( const QgsPointXY &p1, double distance = 1, double azimuth = M_PI_2, QgsPointXY *projectedPoint SIP_OUT = nullptr ) const;
214
219 Qgis::DistanceUnit lengthUnits() const;
220
225 Qgis::AreaUnit areaUnits() const;
226
232 double measurePolygon( const QVector<QgsPointXY> &points ) const SIP_THROW( QgsCsException );
233
239 double bearing( const QgsPointXY &p1, const QgsPointXY &p2 ) const SIP_THROW( QgsCsException );
240
251 static QString formatDistance( double distance, int decimals, Qgis::DistanceUnit unit, bool keepBaseUnit = false );
252
263 static QString formatArea( double area, int decimals, Qgis::AreaUnit unit, bool keepBaseUnit = false );
264
274 double convertLengthMeasurement( double length, Qgis::DistanceUnit toUnits ) const;
275
285 double convertAreaMeasurement( double area, Qgis::AreaUnit toUnits ) const;
286
297 QgsPointXY computeSpheroidProject( const QgsPointXY &p1, double distance = 1, double azimuth = M_PI_2 ) const;
298
318 QVector<QVector<QgsPointXY> > geodesicLine( const QgsPointXY &p1, const QgsPointXY &p2, double interval, bool breakLine = false ) const;
319
338 double latitudeGeodesicCrossesAntimeridian( const QgsPointXY &p1, const QgsPointXY &p2, double &fractionAlongLine SIP_OUT ) const;
339
361 QgsGeometry splitGeometryAtAntimeridian( const QgsGeometry &geometry ) const;
362
363 private:
364 // Calculates area of polygon on ellipsoid
365 double computePolygonArea( const QVector<QgsPointXY> &points ) const;
366
367 double computePolygonFlatArea( const QVector<QgsPointXY> &points ) const;
368
373 void computeAreaInit() const;
374
375 void setFromParams( const QgsEllipsoidUtils::EllipsoidParameters &params );
376
377 enum MeasureType
378 {
379 Default,
380 Area,
381 Length
382 };
383
385 QgsCoordinateTransform mCoordTransform;
386
388 QString mEllipsoid;
389
391 double mSemiMajor, mSemiMinor, mInvFlattening;
392
393 mutable std::unique_ptr< geod_geodesic > mGeod;
394
395 // utility functions for polygon area measurement
396
397 double measure( const QgsAbstractGeometry *geomV2, MeasureType type = Default ) const;
398 double measureLine( const QgsCurve *curve ) const;
399 double measurePolygon( const QgsCurve *curve ) const;
400};
401
402#endif
DistanceUnit
Units of distance.
Definition qgis.h:5170
AreaUnit
Units of area.
Definition qgis.h:5247
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:62
#define SIP_SKIP
Definition qgis_sip.h:133
#define SIP_OUT
Definition qgis_sip.h:57
#define SIP_THROW(name,...)
Definition qgis_sip.h:210
Contains parameters for an ellipsoid.