Quantum GIS API Documentation  master-693a1fe
src/core/qgsdistancearea.h
Go to the documentation of this file.
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
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines