double QgsDistanceArea::measureLine( const QgsPoint &p1, const QgsPoint &p2 ) const { double result; try { QgsPoint pp1 = p1, pp2 = p2; QgsDebugMsgLevel( QString( "Measuring from %1 to %2" ).arg( p1.toString( 4 ), p2.toString( 4 ) ), 3 ); if ( mEllipsoidalMode && ( mEllipsoid != GEO_NONE ) ) { QgsDebugMsgLevel( QString( "Ellipsoidal calculations is enabled, using ellipsoid %1" ).arg( mEllipsoid ), 4 ); QgsDebugMsgLevel( QString( "From proj4 : %1" ).arg( mCoordTransform->sourceCrs().toProj4() ), 4 ); QgsDebugMsgLevel( QString( "To proj4 : %1" ).arg( mCoordTransform->destCRS().toProj4() ), 4 ); pp1 = mCoordTransform->transform( p1 ); pp2 = mCoordTransform->transform( p2 ); QgsDebugMsgLevel( QString( "New points are %1 and %2, calculating..." ).arg( pp1.toString( 4 ), pp2.toString( 4 ) ), 4 ); result = computeDistanceBearing( pp1, pp2 ); } else { QgsDebugMsgLevel( "Cartesian calculation on canvas coordinates", 4 ); result = computeDistanceFlat( p1, p2 ); } } catch ( QgsCsException &cse ) { Q_UNUSED( cse ); QgsMessageLog::logMessage( QObject::tr( "Caught a coordinate system exception while trying to transform a point. Unable to calculate line length." ) ); result = 0.0; } QgsDebugMsgLevel( QString( "The result was %1" ).arg( result ), 3 ); return result; }
double QgsDistanceArea::bearing( const QgsPoint& p1, const QgsPoint& p2 ) const { QgsPoint pp1 = p1, pp2 = p2; double bearing; if ( mEllipsoidalMode && ( mEllipsoid != GEO_NONE ) ) { pp1 = mCoordTransform->transform( p1 ); pp2 = mCoordTransform->transform( p2 ); computeDistanceBearing( pp1, pp2, &bearing ); } else //compute simple planar azimuth { double dx = p2.x() - p1.x(); double dy = p2.y() - p1.y(); bearing = atan2( dx, dy ); } return bearing; }
double QgsDistanceArea::measureLine( const QList<QgsPoint> &points ) const { if ( points.size() < 2 ) return 0; double total = 0; QgsPoint p1, p2; try { if ( mEllipsoidalMode && ( mEllipsoid != GEO_NONE ) ) p1 = mCoordTransform->transform( points[0] ); else p1 = points[0]; for ( QList<QgsPoint>::const_iterator i = points.begin(); i != points.end(); ++i ) { if ( mEllipsoidalMode && ( mEllipsoid != GEO_NONE ) ) { p2 = mCoordTransform->transform( *i ); total += computeDistanceBearing( p1, p2 ); } else { p2 = *i; total += measureLine( p1, p2 ); } p1 = p2; } return total; } catch ( QgsCsException &cse ) { Q_UNUSED( cse ); QgsMessageLog::logMessage( QObject::tr( "Caught a coordinate system exception while trying to transform a point. Unable to calculate line length." ) ); return 0.0; } }
double QgsDistanceArea::measureLine( const QgsPoint& p1, const QgsPoint& p2 ) { try { QgsPoint pp1 = p1, pp2 = p2; if ( mProjectionsEnabled && ( mEllipsoid != "NONE" ) ) { pp1 = mCoordTransform->transform( p1 ); pp2 = mCoordTransform->transform( p2 ); return computeDistanceBearing( pp1, pp2 ); } else { return sqrt(( p2.x() - p1.x() )*( p2.x() - p1.x() ) + ( p2.y() - p1.y() )*( p2.y() - p1.y() ) ); } } catch ( QgsCsException &cse ) { Q_UNUSED( cse ); QgsMessageLog::logMessage( QObject::tr( "Caught a coordinate system exception while trying to transform a point. Unable to calculate line length." ) ); return 0.0; } }