diff --git a/python/core/auto_generated/qgsdistancearea.sip.in b/python/core/auto_generated/qgsdistancearea.sip.in index 9c85b1e4ddd..350766db54c 100644 --- a/python/core/auto_generated/qgsdistancearea.sip.in +++ b/python/core/auto_generated/qgsdistancearea.sip.in @@ -189,25 +189,23 @@ Measures the perimeter of a polygon geometry. .. versionadded:: 2.12 %End - double measureLine( const QVector &points, bool forceCartesian = false ) const; + double measureLine( const QVector &points ) const; %Docstring Measures the length of a line with multiple segments. :param points: list of points in line -:param forceCartesian: calculate distances in Cartesian coordinates :return: length of line. The units for the returned length can be retrieved by calling lengthUnits(). .. seealso:: :py:func:`lengthUnits` %End - double measureLine( const QgsPointXY &p1, const QgsPointXY &p2, bool forceCartesian = false ) const; + double measureLine( const QgsPointXY &p1, const QgsPointXY &p2 ) const; %Docstring Measures the distance between two points. :param p1: start of line :param p2: end of line -:param forceCartesian: calculate distances in Cartesian coordinates :return: distance between points. The units for the returned distance can be retrieved by calling lengthUnits(). diff --git a/src/app/qgsmeasuredialog.cpp b/src/app/qgsmeasuredialog.cpp index 5d4ac842277..356847b6f22 100644 --- a/src/app/qgsmeasuredialog.cpp +++ b/src/app/qgsmeasuredialog.cpp @@ -52,14 +52,14 @@ QgsMeasureDialog::QgsMeasureDialog( QgsMeasureTool *tool, Qt::WindowFlags f ) repopulateComboBoxUnits( mMeasureArea ); if ( mMeasureArea ) { - if ( useMapUnits ) + if ( mUseMapUnits ) mUnitsCombo->setCurrentIndex( mUnitsCombo->findData( QgsUnitTypes::AreaUnknownUnit ) ); else mUnitsCombo->setCurrentIndex( mUnitsCombo->findData( QgsProject::instance()->areaUnits() ) ); } else { - if ( useMapUnits ) + if ( mUseMapUnits ) mUnitsCombo->setCurrentIndex( mUnitsCombo->findData( QgsUnitTypes::DistanceUnknownUnit ) ); else mUnitsCombo->setCurrentIndex( mUnitsCombo->findData( QgsProject::instance()->distanceUnits() ) ); @@ -113,7 +113,7 @@ void QgsMeasureDialog::updateSettings() mCanvasUnits = mCanvas->mapUnits(); // Configure QgsDistanceArea mDistanceUnits = QgsProject::instance()->distanceUnits(); - mapDistanceUnits = QgsProject::instance()->crs().mapUnits(); + mMapDistanceUnits = QgsProject::instance()->crs().mapUnits(); mAreaUnits = QgsProject::instance()->areaUnits(); mDa.setSourceCrs( mCanvas->mapSettings().destinationCrs(), QgsProject::instance()->transformContext() ); mDa.setEllipsoid( QgsProject::instance()->ellipsoid() ); @@ -125,9 +125,15 @@ void QgsMeasureDialog::updateSettings() if ( !mCanvas->mapSettings().destinationCrs().isValid() || ( mCanvas->mapSettings().destinationCrs().mapUnits() == QgsUnitTypes::DistanceDegrees && mDistanceUnits == QgsUnitTypes::DistanceDegrees ) ) - forceCartesian = true; + { + mDa.setEllipsoid( GEO_NONE ); + mForceCartesian = true; + } else - forceCartesian = false; + { + mDa.setEllipsoid( QgsProject::instance()->ellipsoid() ); + mForceCartesian = false; + } } void QgsMeasureDialog::unitsChanged( int index ) @@ -137,12 +143,12 @@ void QgsMeasureDialog::unitsChanged( int index ) mAreaUnits = static_cast< QgsUnitTypes::AreaUnit >( mUnitsCombo->itemData( index ).toInt() ); if ( mAreaUnits == QgsUnitTypes::AreaUnknownUnit ) { - useMapUnits = true; - mAreaUnits = QgsUnitTypes::distanceToAreaUnit( mapDistanceUnits ); + mUseMapUnits = true; + mAreaUnits = QgsUnitTypes::distanceToAreaUnit( mMapDistanceUnits ); } else { - useMapUnits = false; + mUseMapUnits = false; } } else @@ -150,12 +156,12 @@ void QgsMeasureDialog::unitsChanged( int index ) mDistanceUnits = static_cast< QgsUnitTypes::DistanceUnit >( mUnitsCombo->itemData( index ).toInt() ); if ( mDistanceUnits == QgsUnitTypes::DistanceUnknownUnit ) { - useMapUnits = true; - mDistanceUnits = mapDistanceUnits; + mUseMapUnits = true; + mDistanceUnits = mMapDistanceUnits; } else { - useMapUnits = false; + mUseMapUnits = false; } } mTable->clear(); @@ -185,9 +191,15 @@ void QgsMeasureDialog::mouseMove( const QgsPointXY &point ) if ( !mCanvas->mapSettings().destinationCrs().isValid() || ( mCanvas->mapSettings().destinationCrs().mapUnits() == QgsUnitTypes::DistanceDegrees && mDistanceUnits == QgsUnitTypes::DistanceDegrees ) ) - forceCartesian = true; + { + mDa.setEllipsoid( GEO_NONE ); + mForceCartesian = true; + } else - forceCartesian = false; + { + mDa.setEllipsoid( QgsProject::instance()->ellipsoid() ); + mForceCartesian = false; + } mLastMousePoint = point; // show current distance/area while moving the point @@ -204,9 +216,9 @@ void QgsMeasureDialog::mouseMove( const QgsPointXY &point ) { QVector< QgsPointXY > tmpPoints = mTool->points(); QgsPointXY p1( tmpPoints.at( tmpPoints.size() - 1 ) ), p2( point ); - double d = mDa.measureLine( p1, p2, forceCartesian ); - editTotal->setText( formatDistance( mTotal + d, !forceCartesian ) ); - if ( !forceCartesian ) + double d = mDa.measureLine( p1, p2 ); + editTotal->setText( formatDistance( mTotal + d, !mForceCartesian ) ); + if ( !mForceCartesian ) d = convertLength( d, mDistanceUnits ); // Set moving @@ -237,8 +249,8 @@ void QgsMeasureDialog::addPoint() } if ( numPoints > 1 ) { - mTotal = mDa.measureLine( mTool->points(), forceCartesian ); - editTotal->setText( formatDistance( mTotal, !forceCartesian ) ); + mTotal = mDa.measureLine( mTool->points() ); + editTotal->setText( formatDistance( mTotal, !mForceCartesian ) ); } } } @@ -265,14 +277,14 @@ void QgsMeasureDialog::removeLastPoint() //remove final row delete mTable->takeTopLevelItem( mTable->topLevelItemCount() - 1 ); - mTotal = mDa.measureLine( mTool->points(), forceCartesian ); + mTotal = mDa.measureLine( mTool->points() ); if ( !mTool->done() ) { // need to add the distance for the temporary mouse cursor point QVector< QgsPointXY > tmpPoints = mTool->points(); QgsPointXY p1( tmpPoints.at( tmpPoints.size() - 1 ) ); - double d = mDa.measureLine( p1, mLastMousePoint, forceCartesian ); + double d = mDa.measureLine( p1, mLastMousePoint ); d = convertLength( d, mDistanceUnits ); @@ -282,7 +294,7 @@ void QgsMeasureDialog::removeLastPoint() } else { - editTotal->setText( formatDistance( mTotal, !forceCartesian ) ); + editTotal->setText( formatDistance( mTotal, !mForceCartesian ) ); } } } @@ -346,7 +358,8 @@ void QgsMeasureDialog::updateUi() // Set tooltip to indicate how we calculate measurements QString toolTip = tr( "The calculations are based on:" ); - bool forceCartesian = false; + mDa.setEllipsoid( QgsProject::instance()->ellipsoid() ); + mForceCartesian = false; bool convertToDisplayUnits = true; if ( mMeasureArea ) @@ -356,7 +369,8 @@ void QgsMeasureDialog::updateUi() // no CRS => no units, newb! toolTip += "
* " + tr( "No map projection set, so area is calculated using Cartesian calculations." ); toolTip += "
* " + tr( "Units are unknown." ); - forceCartesian = true; + mDa.setEllipsoid( GEO_NONE ); + mForceCartesian = true; convertToDisplayUnits = false; } else if ( mCanvas->mapSettings().destinationCrs().mapUnits() == QgsUnitTypes::DistanceDegrees @@ -365,7 +379,8 @@ void QgsMeasureDialog::updateUi() //both source and destination units are degrees toolTip += "
* " + tr( "Both project CRS (%1) and measured area are in degrees, so area is calculated using Cartesian calculations in square degrees." ).arg( mCanvas->mapSettings().destinationCrs().description() ); - forceCartesian = true; + mDa.setEllipsoid( GEO_NONE ); + mForceCartesian = true; convertToDisplayUnits = false; //not required since we will be measuring in degrees } else @@ -426,7 +441,8 @@ void QgsMeasureDialog::updateUi() // no CRS => no units, newb! toolTip += "
* " + tr( "No map projection set, so distance is calculated using Cartesian calculations." ); toolTip += "
* " + tr( "Units are unknown." ); - forceCartesian = true; + mDa.setEllipsoid( GEO_NONE ); + mForceCartesian = true; convertToDisplayUnits = false; } else if ( mCanvas->mapSettings().destinationCrs().mapUnits() == QgsUnitTypes::DistanceDegrees @@ -435,7 +451,8 @@ void QgsMeasureDialog::updateUi() //both source and destination units are degrees toolTip += "
* " + tr( "Both project CRS (%1) and measured length are in degrees, so distance is calculated using Cartesian calculations in degrees." ).arg( mCanvas->mapSettings().destinationCrs().description() ); - forceCartesian = true; + mDa.setEllipsoid( GEO_NONE ); + mForceCartesian = true; convertToDisplayUnits = false; //not required since we will be measuring in degrees } else @@ -496,17 +513,17 @@ void QgsMeasureDialog::updateUi() if ( mMeasureArea ) { - if ( useMapUnits ) + if ( mUseMapUnits ) mUnitsCombo->setCurrentIndex( mUnitsCombo->findData( QgsUnitTypes::AreaUnknownUnit ) ); else mUnitsCombo->setCurrentIndex( mUnitsCombo->findData( mAreaUnits ) ); } else { - if ( useMapUnits ) + if ( mUseMapUnits ) { mUnitsCombo->setCurrentIndex( mUnitsCombo->findData( QgsUnitTypes::DistanceUnknownUnit ) ); - mTable->setHeaderLabels( QStringList( tr( "Segments [%1]" ).arg( QgsUnitTypes::toString( mapDistanceUnits ) ) ) ); + mTable->setHeaderLabels( QStringList( tr( "Segments [%1]" ).arg( QgsUnitTypes::toString( mMapDistanceUnits ) ) ) ); } else { @@ -542,11 +559,11 @@ void QgsMeasureDialog::updateUi() if ( !b ) { double d = -1; - d = mDa.measureLine( p1, p2, forceCartesian ); - if ( !forceCartesian ) + d = mDa.measureLine( p1, p2 ); + if ( !mForceCartesian ) { - if ( mDistanceUnits == QgsUnitTypes::DistanceUnknownUnit && mapDistanceUnits != QgsUnitTypes::DistanceUnknownUnit ) - d = convertLength( d, mapDistanceUnits ); + if ( mDistanceUnits == QgsUnitTypes::DistanceUnknownUnit && mMapDistanceUnits != QgsUnitTypes::DistanceUnknownUnit ) + d = convertLength( d, mMapDistanceUnits ); else d = convertLength( d, mDistanceUnits ); } @@ -560,7 +577,7 @@ void QgsMeasureDialog::updateUi() b = false; } - mTotal = mDa.measureLine( mTool->points(), forceCartesian ); + mTotal = mDa.measureLine( mTool->points() ); mTable->show(); // Show the table with items editTotal->setText( formatDistance( mTotal, convertToDisplayUnits ) ); } diff --git a/src/app/qgsmeasuredialog.h b/src/app/qgsmeasuredialog.h index a5e71c453bc..856e415aa40 100644 --- a/src/app/qgsmeasuredialog.h +++ b/src/app/qgsmeasuredialog.h @@ -99,13 +99,13 @@ class APP_EXPORT QgsMeasureDialog : public QDialog, private Ui::QgsMeasureBase bool mMeasureArea = false; //! Indicates whether the user chose "Map units" instead of directly selecting a unit - bool useMapUnits = false; + bool mUseMapUnits = false; /** * Indicates whether we need to measure distances in Cartesian instead of * spherical coordinates, such as when measuring in degrees in a geographic CRS */ - bool forceCartesian = true; + bool mForceCartesian = true; //! Number of decimal places we want. int mDecimalPlaces = 3; @@ -117,7 +117,7 @@ class APP_EXPORT QgsMeasureDialog : public QDialog, private Ui::QgsMeasureBase QgsUnitTypes::DistanceUnit mDistanceUnits = QgsUnitTypes::DistanceUnknownUnit; //! Current map unit for distance values - QgsUnitTypes::DistanceUnit mapDistanceUnits = QgsUnitTypes::DistanceUnknownUnit; + QgsUnitTypes::DistanceUnit mMapDistanceUnits = QgsUnitTypes::DistanceUnknownUnit; //! Current unit for area values QgsUnitTypes::AreaUnit mAreaUnits = QgsUnitTypes::AreaUnknownUnit; diff --git a/src/core/qgsdistancearea.cpp b/src/core/qgsdistancearea.cpp index 12e63c32aa0..d4090508519 100644 --- a/src/core/qgsdistancearea.cpp +++ b/src/core/qgsdistancearea.cpp @@ -253,7 +253,7 @@ double QgsDistanceArea::measurePerimeter( const QgsGeometry &geometry ) const return length; } -double QgsDistanceArea::measureLine( const QgsCurve *curve, bool forceCartesian ) const +double QgsDistanceArea::measureLine( const QgsCurve *curve ) const { if ( !curve ) { @@ -264,10 +264,10 @@ double QgsDistanceArea::measureLine( const QgsCurve *curve, bool forceCartesian QVector linePoints; curve->points( linePointsV2 ); QgsGeometry::convertPointList( linePointsV2, linePoints ); - return measureLine( linePoints, forceCartesian ); + return measureLine( linePoints ); } -double QgsDistanceArea::measureLine( const QVector &points, bool forceCartesian ) const +double QgsDistanceArea::measureLine( const QVector &points ) const { if ( points.size() < 2 ) return 0; @@ -277,14 +277,14 @@ double QgsDistanceArea::measureLine( const QVector &points, bool for try { - if ( willUseEllipsoid() && !forceCartesian ) + if ( willUseEllipsoid() ) p1 = mCoordTransform.transform( points[0] ); else p1 = points[0]; for ( QVector::const_iterator i = points.constBegin(); i != points.constEnd(); ++i ) { - if ( willUseEllipsoid() && !forceCartesian ) + if ( willUseEllipsoid() ) { p2 = mCoordTransform.transform( *i ); total += computeDistanceBearing( p1, p2 ); @@ -292,7 +292,7 @@ double QgsDistanceArea::measureLine( const QVector &points, bool for else { p2 = *i; - total += measureLine( p1, p2, forceCartesian ); + total += measureLine( p1, p2 ); } p1 = p2; @@ -309,7 +309,7 @@ double QgsDistanceArea::measureLine( const QVector &points, bool for } -double QgsDistanceArea::measureLine( const QgsPointXY &p1, const QgsPointXY &p2, bool forceCartesian ) const +double QgsDistanceArea::measureLine( const QgsPointXY &p1, const QgsPointXY &p2 ) const { double result; @@ -318,7 +318,7 @@ double QgsDistanceArea::measureLine( const QgsPointXY &p1, const QgsPointXY &p2, QgsPointXY pp1 = p1, pp2 = p2; QgsDebugMsgLevel( QStringLiteral( "Measuring from %1 to %2" ).arg( p1.toString( 4 ), p2.toString( 4 ) ), 3 ); - if ( willUseEllipsoid() && !forceCartesian ) + if ( willUseEllipsoid() ) { QgsDebugMsgLevel( QStringLiteral( "Ellipsoidal calculations is enabled, using ellipsoid %1" ).arg( mEllipsoid ), 4 ); QgsDebugMsgLevel( QStringLiteral( "From proj4 : %1" ).arg( mCoordTransform.sourceCrs().toProj4() ), 4 ); diff --git a/src/core/qgsdistancearea.h b/src/core/qgsdistancearea.h index 40f02bcb3f5..06d1573559c 100644 --- a/src/core/qgsdistancearea.h +++ b/src/core/qgsdistancearea.h @@ -165,21 +165,19 @@ class CORE_EXPORT QgsDistanceArea /** * Measures the length of a line with multiple segments. * \param points list of points in line - * \param forceCartesian calculate distances in Cartesian coordinates * \returns length of line. The units for the returned length can be retrieved by calling lengthUnits(). * \see lengthUnits() */ - double measureLine( const QVector &points, bool forceCartesian = false ) const; + double measureLine( const QVector &points ) const; /** * Measures the distance between two points. * \param p1 start of line * \param p2 end of line - * \param forceCartesian calculate distances in Cartesian coordinates * \returns distance between points. The units for the returned distance can be retrieved by calling lengthUnits(). * \see lengthUnits() */ - double measureLine( const QgsPointXY &p1, const QgsPointXY &p2, bool forceCartesian = false ) const; + double measureLine( const QgsPointXY &p1, const QgsPointXY &p2 ) const; /** * Calculates the distance from one point with distance in meters and azimuth (direction) @@ -343,7 +341,7 @@ class CORE_EXPORT QgsDistanceArea double getQbar( double x ) const; double measure( const QgsAbstractGeometry *geomV2, MeasureType type = Default ) const; - double measureLine( const QgsCurve *curve, bool forceCartesian = false ) const; + double measureLine( const QgsCurve *curve ) const; double measurePolygon( const QgsCurve *curve ) const; // temporary area measurement stuff