/usr/include/qgis/qgsdistancearea.h is in libqgis-dev 2.8.6+dfsg-1build1.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 | /***************************************************************************
qgsdistancearea.h - Distance and area calculations on the ellipsoid
---------------------------------------------------------------------------
Date : September 2005
Copyright : (C) 2005 by Martin Dobias
email : won.der at centrum.sk
***************************************************************************
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
* *
***************************************************************************/
#ifndef QGSDISTANCEAREA_H
#define QGSDISTANCEAREA_H
#include <QList>
#include "qgscoordinatetransform.h"
class QgsGeometry;
/** \ingroup core
General purpose distance and area calculator.
- calculations are done on ellipsoid
- it's possible to pass points/features in any CRS, coordinates are transformed
- two options how to use it
+ use measure() takes QgsGeometry as a parameter and calculates distance or area
+ use directly measureLine(), measurePolygon() which take list of QgsPoints
(both cases transform the coordinates from source CRS to the ellipse coords)
- returned values are in meters resp. square meters
*/
class CORE_EXPORT QgsDistanceArea
{
public:
//! Constructor
QgsDistanceArea();
//! Destructor
~QgsDistanceArea();
//! Copy constructor
QgsDistanceArea( const QgsDistanceArea &origDA );
//! Assignment operator
QgsDistanceArea & operator=( const QgsDistanceArea & origDA );
//! sets whether coordinates must be projected to ellipsoid before measuring
void setEllipsoidalMode( bool flag );
//! returns projections enabled flag
bool ellipsoidalEnabled() const { return mEllipsoidalMode; }
//! sets source spatial reference system (by QGIS CRS)
void setSourceCrs( long srsid );
/**
* Sets source spatial reference system (by QGIS CRS)
* @note: missing in Python bindings in QGIS < 2.2
*/
void setSourceCrs( const QgsCoordinateReferenceSystem& srcCRS );
//! sets source spatial reference system by authid
void setSourceAuthId( QString authid );
//! returns source spatial reference system
long sourceCrs() const { return mCoordTransform->sourceCrs().srsid(); }
//! What sort of coordinate system is being used?
bool geographic() const { return mCoordTransform->sourceCrs().geographicFlag(); }
//! sets ellipsoid by its acronym
bool setEllipsoid( const QString& ellipsoid );
//! Sets ellipsoid by supplied radii
// Inverse flattening is calculated with invf = a/(a-b)
bool setEllipsoid( double semiMajor, double semiMinor );
//! returns ellipsoid's acronym
const QString& ellipsoid() const { return mEllipsoid; }
//! returns ellipsoid's semi major axis
double ellipsoidSemiMajor() const { return mSemiMajor; }
//! returns ellipsoid's semi minor axis
double ellipsoidSemiMinor() const { return mSemiMinor; }
//! returns ellipsoid's inverse flattening
double ellipsoidInverseFlattening() const { return mInvFlattening; }
//! general measurement (line distance or polygon area)
double measure( QgsGeometry* geometry );
//! measures perimeter of polygon
double measurePerimeter( QgsGeometry* geometry );
//! measures line
double measureLine( const QList<QgsPoint>& points );
/** Measures length of line with one segment
* @param p1 start of line
* @param p2 end of line
* @returns distance in meters, or map units if cartesian calculation was performed
*/
double measureLine( const QgsPoint& p1, const QgsPoint& p2 );
/** Measures length of line with one segment and returns units of distance.
* @param p1 start of line
* @param p2 end of line
* @param units will be set to units of measure
* @returns calculated distance between points. Distance units are stored in units parameter.
* @note backported from QGIS 2.12 (where it is const)
* @note not available in python bindings
*/
double measureLine( const QgsPoint& p1, const QgsPoint& p2, QGis::UnitType& units );
//! measures polygon area
double measurePolygon( const QList<QgsPoint>& points );
//! compute bearing - in radians
double bearing( const QgsPoint& p1, const QgsPoint& p2 );
static QString textUnit( double value, int decimals, QGis::UnitType u, bool isArea, bool keepBaseUnit = false );
//! Helper for conversion between physical units
void convertMeasurement( double &measure, QGis::UnitType &measureUnits, QGis::UnitType displayUnits, bool isArea );
protected:
//! measures line distance, line points are extracted from WKB
// @note available in python bindings
const unsigned char* measureLine( const unsigned char* feature, double* area, bool hasZptr = false );
//! measures polygon area and perimeter, vertices are extracted from WKB
// @note available in python bindings
const unsigned char* measurePolygon( const unsigned char* feature, double* area, double* perimeter, bool hasZptr = false );
/**
calculates distance from two points on ellipsoid
based on inverse Vincenty's formulae
Points p1 and p2 are expected to be in degrees and in currently used ellipsoid
@note if course1 is not NULL, bearing (in radians) from first point is calculated
(the same for course2)
@return distance in meters
*/
double computeDistanceBearing( const QgsPoint& p1, const QgsPoint& p2,
double* course1 = NULL, double* course2 = NULL );
//! uses flat / planimetric / Euclidean distance
double computeDistanceFlat( const QgsPoint& p1, const QgsPoint& p2 );
//! calculate distance with given coordinates (does not do a transform anymore)
double computeDistance( const QList<QgsPoint>& points );
/**
calculates area of polygon on ellipsoid
algorithm has been taken from GRASS: gis/area_poly1.c
*/
double computePolygonArea( const QList<QgsPoint>& points );
double computePolygonFlatArea( const QList<QgsPoint>& points );
/**
precalculates some values
(must be called always when changing ellipsoid)
*/
void computeAreaInit();
private:
//! Copy helper
void _copy( const QgsDistanceArea & origDA );
//! used for transforming coordinates from source CRS to ellipsoid's coordinates
QgsCoordinateTransform* mCoordTransform;
//! indicates whether we will transform coordinates
bool mEllipsoidalMode;
//! ellipsoid acronym (from table tbl_ellipsoids)
QString mEllipsoid;
//! ellipsoid parameters
double mSemiMajor, mSemiMinor, mInvFlattening;
// utility functions for polygon area measurement
double getQ( double x );
double getQbar( double x );
// temporary area measurement stuff
double m_QA, m_QB, m_QC;
double m_QbarA, m_QbarB, m_QbarC, m_QbarD;
double m_AE; /* a^2(1-e^2) */
double m_Qp; /* Q at the north pole */
double m_E; /* area of the earth */
double m_TwoPI;
};
#endif
|