|
Quantum GIS API Documentation
master-ce49b66
|
00001 /*************************************************************************** 00002 qgsdistancearea.h - Distance and area calculations on the ellipsoid 00003 --------------------------------------------------------------------------- 00004 Date : September 2005 00005 Copyright : (C) 2005 by Martin Dobias 00006 email : won.der at centrum.sk 00007 *************************************************************************** 00008 * * 00009 * This program is free software; you can redistribute it and/or modify * 00010 * it under the terms of the GNU General Public License as published by * 00011 * the Free Software Foundation; either version 2 of the License, or * 00012 * (at your option) any later version. * 00013 * * 00014 ***************************************************************************/ 00015 00016 #ifndef QGSDISTANCEAREA_H 00017 #define QGSDISTANCEAREA_H 00018 00019 #include <QList> 00020 #include "qgscoordinatetransform.h" 00021 00022 class QgsGeometry; 00023 00034 class CORE_EXPORT QgsDistanceArea 00035 { 00036 public: 00038 QgsDistanceArea(); 00039 00041 ~QgsDistanceArea(); 00042 00044 QgsDistanceArea( const QgsDistanceArea &origDA ); 00045 00047 QgsDistanceArea & operator=( const QgsDistanceArea & origDA ); 00048 00050 void setEllipsoidalMode( bool flag ); 00051 00053 bool ellipsoidalEnabled() const { return mEllipsoidalMode; } 00054 00056 void setSourceCrs( long srsid ); 00057 00059 void setSourceAuthId( QString authid ); 00060 00062 long sourceCrs() { return mSourceRefSys; } 00064 bool geographic() { return mCoordTransform->sourceCrs().geographicFlag(); } 00065 00067 bool setEllipsoid( const QString& ellipsoid ); 00068 00070 // Inverse flattening is calculated with invf = a/(a-b) 00071 bool setEllipsoid( double semiMajor, double semiMinor ); 00072 00074 const QString& ellipsoid() { return mEllipsoid; } 00075 00077 double ellipsoidSemiMajor() { return mSemiMajor; } 00079 double ellipsoidSemiMinor() { return mSemiMinor; } 00081 double ellipsoidInverseFlattening() { return mInvFlattening; } 00082 00084 double measure( QgsGeometry* geometry ); 00085 00087 double measurePerimeter( QgsGeometry* geometry ); 00088 00090 double measureLine( const QList<QgsPoint>& points ); 00091 00093 double measureLine( const QgsPoint& p1, const QgsPoint& p2 ); 00094 00096 double measurePolygon( const QList<QgsPoint>& points ); 00097 00099 double bearing( const QgsPoint& p1, const QgsPoint& p2 ); 00100 00101 static QString textUnit( double value, int decimals, QGis::UnitType u, bool isArea, bool keepBaseUnit = false ); 00102 00104 void convertMeasurement( double &measure, QGis::UnitType &measureUnits, QGis::UnitType displayUnits, bool isArea ); 00105 00106 protected: 00108 unsigned char* measureLine( unsigned char* feature, double* area, bool hasZptr = false ); 00110 unsigned char* measurePolygon( unsigned char* feature, double* area, double* perimeter, bool hasZptr = false ); 00111 00122 double computeDistanceBearing( const QgsPoint& p1, const QgsPoint& p2, 00123 double* course1 = NULL, double* course2 = NULL ); 00124 00125 00131 double computePolygonArea( const QList<QgsPoint>& points ); 00132 00133 double computePolygonFlatArea( const QList<QgsPoint>& points ); 00134 00139 void computeAreaInit(); 00140 00141 private: 00143 void _copy( const QgsDistanceArea & origDA ); 00144 00146 QgsCoordinateTransform* mCoordTransform; 00147 00149 bool mEllipsoidalMode; 00150 00152 long mSourceRefSys; 00153 00155 QString mEllipsoid; 00156 00158 double mSemiMajor, mSemiMinor, mInvFlattening; 00159 00160 // utility functions for polygon area measurement 00161 00162 double getQ( double x ); 00163 double getQbar( double x ); 00164 00165 // temporary area measurement stuff 00166 00167 double m_QA, m_QB, m_QC; 00168 double m_QbarA, m_QbarB, m_QbarC, m_QbarD; 00169 double m_AE; /* a^2(1-e^2) */ 00170 double m_Qp; /* Q at the north pole */ 00171 double m_E; /* area of the earth */ 00172 double m_TwoPI; 00173 00174 }; 00175 00176 #endif