259 changes: 98 additions & 161 deletions src/app/qgsmeasuredialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -48,87 +48,99 @@ QgsMeasureDialog::QgsMeasureDialog( QgsMeasureTool* tool, Qt::WFlags f )
item->setTextAlignment( 0, Qt::AlignRight );
mTable->addTopLevelItem( item );

//mTable->setHeaderLabels(QStringList() << tr("Segments (in meters)") << tr("Total") << tr("Azimuth") );
// Update whenever the canvas has refreshed. Maybe more often than needed,
// but at least every time any canvas related settings changes
connect( mTool->canvas(), SIGNAL( mapCanvasRefreshed() ),
this, SLOT( updateSettings() ) );

updateSettings();
}

void QgsMeasureDialog::updateSettings()
{
QSettings settings;
int s = settings.value( "/qgis/measure/projectionEnabled", "2" ).toInt();
if ( s == 2 )
mcbProjectionEnabled->setCheckState( Qt::Checked );

mDecimalPlaces = settings.value( "/qgis/measure/decimalplaces", "3" ).toInt();
mCanvasUnits = mTool->canvas()->mapUnits();
mDisplayUnits = QGis::fromLiteral( settings.value( "/qgis/measure/displayunits", QGis::toLiteral( QGis::Meters ) ).toString() );
// Configure QgsDistanceArea
mDa.setSourceCrs( mTool->canvas()->mapRenderer()->destinationCrs().srsid() );
mDa.setEllipsoid( settings.value( "/qgis/measure/ellipsoid", GEO_NONE ).toString() );
// Only use ellipsoidal calculation when project wide transformation is enabled.
if ( mTool->canvas()->mapRenderer()->hasCrsTransformEnabled() )
{
mDa.setEllipsoidalMode( true );
}
else
mcbProjectionEnabled->setCheckState( Qt::Unchecked );
{
mDa.setEllipsoidalMode( false );
}

// Update when the ellipsoidal button has changed state.
connect( mcbProjectionEnabled, SIGNAL( stateChanged( int ) ),
this, SLOT( changeProjectionEnabledState() ) );
// Update whenever the canvas has refreshed. Maybe more often than needed,
// but at least every time any settings changes
connect( mTool->canvas(), SIGNAL( mapCanvasRefreshed() ),
this, SLOT( changeProjectionEnabledState() ) );
// Update when project wide transformation has changed
connect( mTool->canvas()->mapRenderer(), SIGNAL( hasCrsTransformEnabled( bool ) ),
this, SLOT( changeProjectionEnabledState() ) );
// Update when project CRS has changed
connect( mTool->canvas()->mapRenderer(), SIGNAL( destinationSrsChanged() ),
this, SLOT( changeProjectionEnabledState() ) );
QgsDebugMsg( "****************" );
QgsDebugMsg( QString( "Ellipsoid ID : %1" ).arg( mDa.ellipsoid() ) );
QgsDebugMsg( QString( "Ellipsoidal : %1" ).arg( mDa.ellipsoidalEnabled() ? "true" : "false" ) );
QgsDebugMsg( QString( "Decimalplaces: %1" ).arg( mDecimalPlaces ) );
QgsDebugMsg( QString( "Display units: %1" ).arg( QGis::toLiteral( mDisplayUnits ) ) );
QgsDebugMsg( QString( "Canvas units : %1" ).arg( QGis::toLiteral( mCanvasUnits ) ) );

// clear interface
mTable->clear();

mTotal = 0;
updateUi();
}

}

void QgsMeasureDialog::restart()
{
mTool->restart();

// Set one cell row where to update current distance
// If measuring area, the table doesn't get shown
mTable->clear();
QTreeWidgetItem* item = new QTreeWidgetItem( QStringList( QString::number( 0, 'f', 1 ) ) );
item->setTextAlignment( 0, Qt::AlignRight );
mTable->addTopLevelItem( item );
mTotal = 0.;

updateUi();
}


void QgsMeasureDialog::mousePress( QgsPoint &point )
{
if ( mTool->points().size() == 0 )

show();
raise();
if ( ! mTool->done() )
{
addPoint( point );
show();
mouseMove( point );
}
raise();

mouseMove( point );
}

void QgsMeasureDialog::mouseMove( QgsPoint &point )
{
QSettings settings;
int decimalPlaces = settings.value( "/qgis/measure/decimalplaces", "3" ).toInt();
Q_UNUSED( point );

// show current distance/area while moving the point
// by creating a temporary copy of point array
// and adding moving point at the end
if ( mMeasureArea && mTool->points().size() > 1 )
if ( mMeasureArea && mTool->points().size() > 2 )
{
QList<QgsPoint> tmpPoints = mTool->points();
tmpPoints.append( point );
double area = mDa.measurePolygon( tmpPoints );
editTotal->setText( formatArea( area, decimalPlaces ) );
double area = mDa.measurePolygon( mTool->points() );
editTotal->setText( formatArea( area ) );
}
else if ( !mMeasureArea && mTool->points().size() > 0 )
else if ( !mMeasureArea && mTool->points().size() > 1 )
{
QgsPoint p1( mTool->points().last() ), p2( point );

int last = mTool->points().size() - 1;
QgsPoint p1 = mTool->points()[last];
QgsPoint p2 = mTool->points()[last-1];
double d = mDa.measureLine( p1, p2 );
editTotal->setText( formatDistance( mTotal + d, decimalPlaces ) );
QGis::UnitType myDisplayUnits;
// Ignore units
convertMeasurement( d, myDisplayUnits, false );

mTotal = mDa.measureLine( mTool->points() );
editTotal->setText( formatDistance( mTotal ) );

QGis::UnitType displayUnits;
// Meters or feet?
convertMeasurement( d, displayUnits, false );

// Set moving
QTreeWidgetItem *item = mTable->topLevelItem( mTable->topLevelItemCount() - 1 );
item->setText( 0, QLocale::system().toString( d, 'f', decimalPlaces ) );
item->setText( 0, QLocale::system().toString( d, 'f', mDecimalPlaces ) );
QgsDebugMsg( QString( "Final result is %1" ).arg( item->text( 0 ) ) );
}
}
Expand All @@ -137,38 +149,21 @@ void QgsMeasureDialog::addPoint( QgsPoint &p )
{
Q_UNUSED( p );

QSettings settings;
int decimalPlaces = settings.value( "/qgis/measure/decimalplaces", "3" ).toInt();

QgsDebugMsg( "Entering" );
int numPoints = mTool->points().size();
if ( mMeasureArea && numPoints > 2 )
{
double area = mDa.measurePolygon( mTool->points() );
editTotal->setText( formatArea( area, decimalPlaces ) );
editTotal->setText( formatArea( area ) );
}
else if ( !mMeasureArea && numPoints > 1 )
{
int last = numPoints - 2;

QgsPoint p1 = mTool->points()[last], p2 = mTool->points()[last+1];

double d = mDa.measureLine( p1, p2 );

mTotal += d;
editTotal->setText( formatDistance( mTotal, decimalPlaces ) );

QGis::UnitType myDisplayUnits;
// Ignore units
convertMeasurement( d, myDisplayUnits, false );

QTreeWidgetItem *item = mTable->topLevelItem( mTable->topLevelItemCount() - 1 );
item->setText( 0, QLocale::system().toString( d, 'f', decimalPlaces ) );

item = new QTreeWidgetItem( QStringList( QLocale::system().toString( 0.0, 'f', decimalPlaces ) ) );
QTreeWidgetItem * item = new QTreeWidgetItem( QStringList( QLocale::system().toString( 0.0, 'f', mDecimalPlaces ) ) );
item->setTextAlignment( 0, Qt::AlignRight );
mTable->addTopLevelItem( item );
mTable->scrollToItem( item );
}
QgsDebugMsg( "Exiting" );
}

void QgsMeasureDialog::on_buttonBox_rejected( void )
Expand Down Expand Up @@ -204,44 +199,34 @@ void QgsMeasureDialog::saveWindowLocation()
settings.setValue( key, height() );
}

QString QgsMeasureDialog::formatDistance( double distance, int decimalPlaces )
QString QgsMeasureDialog::formatDistance( double distance )
{
QSettings settings;
bool baseUnit = settings.value( "/qgis/measure/keepbaseunit", false ).toBool();

QGis::UnitType myDisplayUnits;
convertMeasurement( distance, myDisplayUnits, false );
return QgsDistanceArea::textUnit( distance, decimalPlaces, myDisplayUnits, false, baseUnit );
QGis::UnitType newDisplayUnits;
convertMeasurement( distance, newDisplayUnits, false );
return QgsDistanceArea::textUnit( distance, mDecimalPlaces, newDisplayUnits, false, baseUnit );
}

QString QgsMeasureDialog::formatArea( double area, int decimalPlaces )
QString QgsMeasureDialog::formatArea( double area )
{
QSettings settings;
bool baseUnit = settings.value( "/qgis/measure/keepbaseunit", false ).toBool();

QGis::UnitType myDisplayUnits;
convertMeasurement( area, myDisplayUnits, true );
return QgsDistanceArea::textUnit( area, decimalPlaces, myDisplayUnits, true, baseUnit );
QGis::UnitType newDisplayUnits;
convertMeasurement( area, newDisplayUnits, true );
return QgsDistanceArea::textUnit( area, mDecimalPlaces, newDisplayUnits, true, baseUnit );
}

void QgsMeasureDialog::updateUi()
{
// Only enable checkbox when project wide transformation is on
mcbProjectionEnabled->setEnabled( mTool->canvas()->hasCrsTransformEnabled() );

configureDistanceArea();

QSettings settings;

// Set tooltip to indicate how we calculate measurments
QGis::UnitType mapUnits = mTool->canvas()->mapUnits();
QGis::UnitType displayUnits = QGis::fromLiteral( settings.value( "/qgis/measure/displayunits", QGis::toLiteral( QGis::Meters ) ).toString() );

QString toolTip = tr( "The calculations are based on:" );
if ( ! mTool->canvas()->hasCrsTransformEnabled() )
{
toolTip += "<br> * " + tr( "Project CRS transformation is turned off." ) + " ";
toolTip += tr( "Canvas units setting is taken from project properties setting (%1)." ).arg( QGis::tr( mapUnits ) );
toolTip += tr( "Canvas units setting is taken from project properties setting (%1)." ).arg( QGis::tr( mCanvasUnits ) );
toolTip += "<br> * " + tr( "Ellipsoidal calculation is not possible, as project CRS is undefined." );
}
else
Expand All @@ -254,74 +239,22 @@ void QgsMeasureDialog::updateUi()
else
{
toolTip += "<br> * " + tr( "Project CRS transformation is turned on but ellipsoidal calculation is not selected." );
toolTip += "<br> * " + tr( "The canvas units setting is taken from the project CRS (%1)." ).arg( QGis::tr( mapUnits ) );
toolTip += "<br> * " + tr( "The canvas units setting is taken from the project CRS (%1)." ).arg( QGis::tr( mCanvasUnits ) );
}
}

if (( mapUnits == QGis::Meters && displayUnits == QGis::Feet ) || ( mapUnits == QGis::Feet && displayUnits == QGis::Meters ) )
if (( mCanvasUnits == QGis::Meters && mDisplayUnits == QGis::Feet ) || ( mCanvasUnits == QGis::Feet && mDisplayUnits == QGis::Meters ) )
{
toolTip += "<br> * " + tr( "Finally, the value is converted from %2 to %3." ).arg( QGis::tr( mapUnits ) ).arg( QGis::tr( displayUnits ) );
toolTip += "<br> * " + tr( "Finally, the value is converted from %2 to %3." ).arg( QGis::tr( mCanvasUnits ) ).arg( QGis::tr( mDisplayUnits ) );
}

editTotal->setToolTip( toolTip );
mTable->setToolTip( toolTip );

int decimalPlaces = settings.value( "/qgis/measure/decimalplaces", "3" ).toInt();

mTable->setHeaderLabels( QStringList( tr( "Segments [%1]" ).arg( QGis::tr( displayUnits ) ) ) );

if ( mMeasureArea )
{
mTable->hide();
editTotal->setText( formatArea( 0, decimalPlaces ) );
}
else
{
mTable->show();
editTotal->setText( formatDistance( 0, decimalPlaces ) );
}
}

void QgsMeasureDialog::convertMeasurement( double &measure, QGis::UnitType &u, bool isArea )
{
// Helper for converting between meters and feet
// The parameter &u is out only...

// Get the canvas units
QGis::UnitType myUnits = mTool->canvas()->mapUnits();

// Get the units for display
QSettings settings;
QGis::UnitType displayUnits = QGis::fromLiteral( settings.value( "/qgis/measure/displayunits", QGis::toLiteral( QGis::Meters ) ).toString() );

QgsDebugMsg( QString( "Preferred display units are %1" ).arg( QGis::toLiteral( displayUnits ) ) );

mDa.convertMeasurement( measure, myUnits, displayUnits, isArea );
u = myUnits;
}

void QgsMeasureDialog::changeProjectionEnabledState()
{
// store value
QSettings settings;
if ( mcbProjectionEnabled->isChecked() )
{
settings.setValue( "/qgis/measure/projectionEnabled", 2 );
}
else
{
settings.setValue( "/qgis/measure/projectionEnabled", 0 );
}

// clear interface
mTable->clear();
QTreeWidgetItem* item = new QTreeWidgetItem( QStringList( QString::number( 0, 'f', 1 ) ) );
item->setTextAlignment( 0, Qt::AlignRight );
mTable->addTopLevelItem( item );
mTotal = 0;
updateUi();

int decimalPlaces = settings.value( "/qgis/measure/decimalplaces", "3" ).toInt();
QGis::UnitType newDisplayUnits;
double dummy = 1.0;
convertMeasurement( dummy, newDisplayUnits, true );
mTable->setHeaderLabels( QStringList( tr( "Segments [%1]" ).arg( QGis::tr( newDisplayUnits ) ) ) );

if ( mMeasureArea )
{
Expand All @@ -330,7 +263,8 @@ void QgsMeasureDialog::changeProjectionEnabledState()
{
area = mDa.measurePolygon( mTool->points() );
}
editTotal->setText( formatArea( area, decimalPlaces ) );
mTable->hide(); // Hide the table, only show summary.
editTotal->setText( formatArea( area ) );
}
else
{
Expand All @@ -345,31 +279,34 @@ void QgsMeasureDialog::changeProjectionEnabledState()
if ( !b )
{
double d = mDa.measureLine( p1, p2 );
mTotal += d;
editTotal->setText( formatDistance( mTotal, decimalPlaces ) );
QGis::UnitType myDisplayUnits;

convertMeasurement( d, myDisplayUnits, false );
QGis::UnitType dummyUnits;
convertMeasurement( d, dummyUnits, false );

QTreeWidgetItem *item = mTable->topLevelItem( mTable->topLevelItemCount() - 1 );
item->setText( 0, QLocale::system().toString( d, 'f', decimalPlaces ) );
item = new QTreeWidgetItem( QStringList( QLocale::system().toString( 0.0, 'f', decimalPlaces ) ) );
QTreeWidgetItem *item = new QTreeWidgetItem( QStringList( QLocale::system().toString( d , 'f', mDecimalPlaces ) ) );
item->setTextAlignment( 0, Qt::AlignRight );
mTable->addTopLevelItem( item );
mTable->scrollToItem( item );
}
p1 = p2;
b = false;
}
mTotal = mDa.measureLine( mTool->points() );
mTable->show(); // Show the table with items
editTotal->setText( formatDistance( mTotal ) );
}
}

void QgsMeasureDialog::configureDistanceArea()
void QgsMeasureDialog::convertMeasurement( double &measure, QGis::UnitType &u, bool isArea )
{
QSettings settings;
QString ellipsoidId = settings.value( "/qgis/measure/ellipsoid", "WGS84" ).toString();
mDa.setSourceCrs( mTool->canvas()->mapRenderer()->destinationCrs().srsid() );
mDa.setEllipsoid( ellipsoidId );
// Only use ellipsoidal calculation when project wide transformation is enabled.
mDa.setEllipsoidalMode( mcbProjectionEnabled->isChecked() && mTool->canvas()->hasCrsTransformEnabled() );
// Helper for converting between meters and feet
// The parameter &u is out only...

// Get the canvas units
QGis::UnitType myUnits = mCanvasUnits;

QgsDebugMsg( QString( "Preferred display units are %1" ).arg( QGis::toLiteral( mDisplayUnits ) ) );

mDa.convertMeasurement( measure, myUnits, mDisplayUnits, isArea );
u = myUnits;
}

21 changes: 14 additions & 7 deletions src/app/qgsmeasuredialog.h
Original file line number Diff line number Diff line change
Expand Up @@ -63,31 +63,38 @@ class QgsMeasureDialog : public QDialog, private Ui::QgsMeasureBase
//! Show the help for the dialog
void on_buttonBox_helpRequested() { QgsContextHelp::run( metaObject()->className() ); }

//! on change state projection/ellipsoid enable
void changeProjectionEnabledState();
//! When any external settings change
void updateSettings();

private:

//! formats distance to most appropriate units
QString formatDistance( double distance, int decimalPlaces );
QString formatDistance( double distance );

//! formats area to most appropriate units
QString formatArea( double area, int decimalPlaces );
QString formatArea( double area );

//! shows/hides table, shows correct units
void updateUi();

//! Converts the measurement, depending on settings in options and current transformation
void convertMeasurement( double &measure, QGis::UnitType &u, bool isArea );

//! Configures distance area objects with ellipsoid / output crs
void configureDistanceArea();

double mTotal;

//! indicates whether we're measuring distances or areas
bool mMeasureArea;

//! Number of decimal places we want.
int mDecimalPlaces;

//! Current unit for input values
QGis::UnitType mCanvasUnits;

//! Current unit for output values
QGis::UnitType mDisplayUnits;

//! Our measurement object
QgsDistanceArea mDa;

//! pointer to measure tool which owns this dialog
Expand Down
51 changes: 35 additions & 16 deletions src/app/qgsmeasuretool.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,9 @@ QgsMeasureTool::QgsMeasureTool( QgsMapCanvas* canvas, bool measureArea )
QPixmap myCrossHairQPixmap = QPixmap(( const char ** ) cross_hair_cursor );
mCursor = QCursor( myCrossHairQPixmap, 8, 8 );

mRightMouseClicked = false;
mDone = false;
// Append point we will move
mPoints.append( QgsPoint( 0, 0 ) );

mDialog = new QgsMeasureDialog( this );
mSnapper.setMapCanvas( canvas );
Expand Down Expand Up @@ -89,27 +91,27 @@ void QgsMeasureTool::activate()
void QgsMeasureTool::deactivate()
{
mDialog->close();
mRubberBand->reset();
QgsMapTool::deactivate();
}


void QgsMeasureTool::restart()
{
mPoints.clear();
// Append point we will move
mPoints.append( QgsPoint( 0, 0 ) );

mRubberBand->reset( mMeasureArea );

// re-read settings
updateSettings();

mRightMouseClicked = false;
mDone = false;
mWrongProjectProjection = false;

}





void QgsMeasureTool::updateSettings()
{
QSettings settings;
Expand All @@ -127,22 +129,29 @@ void QgsMeasureTool::canvasPressEvent( QMouseEvent * e )
{
if ( e->button() == Qt::LeftButton )
{
if ( mRightMouseClicked )
if ( mDone )
{
mDialog->restart();

}
QgsPoint idPoint = snapPoint( e->pos() );
mDialog->mousePress( idPoint );
// mDialog->mousePress( idPoint );
}
}

void QgsMeasureTool::canvasMoveEvent( QMouseEvent * e )
{
if ( !mRightMouseClicked )
if ( ! mDone )
{
QgsPoint point = snapPoint( e->pos() );

mRubberBand->movePoint( point );
mDialog->mouseMove( point );
if ( ! mPoints.isEmpty() )
{
// Update last point
mPoints.removeLast();
mPoints.append( point ) ;
mDialog->mouseMove( point );
}
}
}

Expand All @@ -153,10 +162,16 @@ void QgsMeasureTool::canvasReleaseEvent( QMouseEvent * e )

if ( e->button() == Qt::RightButton && ( e->buttons() & Qt::LeftButton ) == 0 ) // restart
{
if ( mRightMouseClicked )
if ( mDone )
{
mDialog->restart();
}
else
mRightMouseClicked = true;
{
// The figure is finished
mDone = true;
mDialog->show();
}
}
else if ( e->button() == Qt::LeftButton )
{
Expand All @@ -171,16 +186,20 @@ void QgsMeasureTool::addPoint( QgsPoint &point )
{
QgsDebugMsg( "point=" + point.toString() );

int last = mPoints.size() - 1;
// don't add points with the same coordinates
if ( mPoints.size() > 0 && point == mPoints[0] )
if ( mPoints.size() > 1 && mPoints[ last ] == mPoints[ last - 1 ] )
return;

QgsPoint pnt( point );
// Append point that we will be moving.
mPoints.append( pnt );


mRubberBand->addPoint( point );
mDialog->addPoint( point );
if ( ! mDone )
{
mDialog->addPoint( point );
}
}

QgsPoint QgsMeasureTool::snapPoint( const QPoint& p )
Expand Down
6 changes: 5 additions & 1 deletion src/app/qgsmeasuretool.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,10 @@ class QgsMeasureTool : public QgsMapTool
//! returns whether measuring distance or area
bool measureArea() { return mMeasureArea; }

//! When we hvae added our last point, and not following
// Added in 2.0
bool done() { return mDone; }

//! Reset and start new
void restart();

Expand Down Expand Up @@ -83,7 +87,7 @@ class QgsMeasureTool : public QgsMapTool
bool mMeasureArea;

//! indicates whether we've just done a right mouse click
bool mRightMouseClicked;
bool mDone;

//! indicates whether we've recently warned the user about having the wrong
// project projection
Expand Down
41 changes: 29 additions & 12 deletions src/app/qgsoptions.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,8 @@
#include "qgsoptions.h"
#include "qgis.h"
#include "qgisapp.h"
#include "qgsmapcanvas.h"
#include "qgsmaprenderer.h"
#include "qgsgenericprojectionselector.h"
#include "qgscoordinatereferencesystem.h"
#include "qgstolerance.h"
Expand Down Expand Up @@ -47,15 +49,14 @@
#include <limits>
#include <sqlite3.h>
#include "qgslogger.h"
#define ELLIPS_FLAT "NONE"
#define ELLIPS_FLAT_DESC "None / Planimetric"

#define CPL_SUPRESS_CPLUSPLUS
#include <gdal.h>
#include <geos_c.h>
#include <cpl_conv.h> // for setting gdal options

#include "qgsconfig.h"
const char * QgsOptions::GEO_NONE_DESC = QT_TRANSLATE_NOOP( "QgsOptions", "None / Planimetric" );

/**
* \class QgsOptions - Set user options and preferences
Expand Down Expand Up @@ -278,13 +279,27 @@ QgsOptions::QgsOptions( QWidget *parent, Qt::WFlags fl ) :
leProjectGlobalCrs->setText( mDefaultCrs.authid() + " - " + mDefaultCrs.description() );

// populate combo box with ellipsoids
QgsDebugMsg( "Setting upp ellipsoid" );

getEllipsoidList();
QString myEllipsoidId = settings.value( "/qgis/measure/ellipsoid", "WGS84" ).toString();
cmbEllipsoid->setItemText( cmbEllipsoid->currentIndex(), getEllipsoidName( myEllipsoidId ) );
// Pre-select current ellipsoid
QString myEllipsoidId = settings.value( "/qgis/measure/ellipsoid", GEO_NONE ).toString();
cmbEllipsoid->setCurrentIndex( cmbEllipsoid->findText( getEllipsoidName( myEllipsoidId ), Qt::MatchExactly ) );
// Check if CRS transformation is on, or else turn combobox off
if ( QgisApp::instance()->mapCanvas()->mapRenderer()->hasCrsTransformEnabled() )
{
cmbEllipsoid->setEnabled( true );
cmbEllipsoid->setToolTip( "" );
}
else
{
cmbEllipsoid->setEnabled( false );
cmbEllipsoid->setToolTip( "Can only use ellipsoidal calculations when CRS transformation is enabled" );
}

// Set the units for measuring
QString myUnitsTxt = settings.value( "/qgis/measure/displayunits", "meters" ).toString();
if ( myUnitsTxt == "feet" )
QGis::UnitType myDisplayUnits = QGis::fromLiteral( settings.value( "/qgis/measure/displayunits", QGis::toLiteral( QGis::Meters ) ).toString() );
if ( myDisplayUnits == QGis::Feet )
{
radFeet->setChecked( true );
}
Expand Down Expand Up @@ -929,13 +944,12 @@ void QgsOptions::saveOptions()

if ( radFeet->isChecked() )
{
settings.setValue( "/qgis/measure/displayunits", "feet" );
settings.setValue( "/qgis/measure/displayunits", QGis::toLiteral( QGis::Feet ) );
}
else
{
settings.setValue( "/qgis/measure/displayunits", "meters" );
settings.setValue( "/qgis/measure/displayunits", QGis::toLiteral( QGis::Meters ) );
}
settings.setValue( "/qgis/measure/ellipsoid", getEllipsoidAcronym( cmbEllipsoid->currentText() ) );

QString angleUnitString = "degrees";
if ( mRadiansRadioButton->isChecked() )
Expand Down Expand Up @@ -1163,7 +1177,7 @@ void QgsOptions::getEllipsoidList()
int myResult;


cmbEllipsoid->addItem( ELLIPS_FLAT_DESC );
cmbEllipsoid->addItem( tr( GEO_NONE_DESC ) );
//check the db is available
myResult = sqlite3_open_v2( QgsApplication::srsDbFilePath().toUtf8().data(), &myDatabase, SQLITE_OPEN_READONLY, NULL );
if ( myResult )
Expand Down Expand Up @@ -1196,7 +1210,8 @@ QString QgsOptions::getEllipsoidAcronym( QString theEllipsoidName )
const char *myTail;
sqlite3_stmt *myPreparedStatement;
int myResult;
QString myName( ELLIPS_FLAT );
QString myName = GEO_NONE;

//check the db is available
myResult = sqlite3_open_v2( QgsApplication::srsDbFilePath().toUtf8().data(), &myDatabase, SQLITE_OPEN_READONLY, NULL );
if ( myResult )
Expand Down Expand Up @@ -1228,7 +1243,9 @@ QString QgsOptions::getEllipsoidName( QString theEllipsoidAcronym )
const char *myTail;
sqlite3_stmt *myPreparedStatement;
int myResult;
QString myName( ELLIPS_FLAT_DESC );
QString myName;

myName = tr( GEO_NONE_DESC );
//check the db is available
myResult = sqlite3_open_v2( QgsApplication::srsDbFilePath().toUtf8().data(), &myDatabase, SQLITE_OPEN_READONLY, NULL );
if ( myResult )
Expand Down
2 changes: 2 additions & 0 deletions src/app/qgsoptions.h
Original file line number Diff line number Diff line change
Expand Up @@ -194,6 +194,8 @@ class QgsOptions : public QDialog, private Ui::QgsOptionsBase
QgsCoordinateReferenceSystem mDefaultCrs;
QgsCoordinateReferenceSystem mLayerDefaultCrs;
bool mLoadedGdalDriverList;

static const char * GEO_NONE_DESC;
};

#endif // #ifndef QGSOPTIONS_H
13 changes: 10 additions & 3 deletions src/core/qgis.h
Original file line number Diff line number Diff line change
Expand Up @@ -97,11 +97,14 @@ class CORE_EXPORT QGis
DegreesDecimalMinutes = 2, // was 5
};

// Provides the canonical name of the type value
//! Provides the canonical name of the type value
// Added in version 2.0
static QString toLiteral( QGis::UnitType unit );
// Converts from the canonical name to the type value
//! Converts from the canonical name to the type value
// Added in version 2.0
static UnitType fromLiteral( QString literal, QGis::UnitType defaultType = UnknownUnit );
// Provides translated version of the type value
//! Provides translated version of the type value
// Added in version 2.0
static QString tr( QGis::UnitType unit );

//! User defined event types
Expand Down Expand Up @@ -197,6 +200,10 @@ const int LAT_PREFIX_LEN = 7;
* or user (~/.qgis.qgis.db) defined projection. */
const int USER_CRS_START_ID = 100000;

//! Constant that holds the string representation for "No ellips/No CRS"
// Added in version 2.0
const QString GEO_NONE = "NONE";

//
// Constants for point symbols
//
Expand Down
22 changes: 11 additions & 11 deletions src/core/qgsdistancearea.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -44,7 +44,7 @@ QgsDistanceArea::QgsDistanceArea()
mEllipsoidalMode = false;
mCoordTransform = new QgsCoordinateTransform;
setSourceCrs( GEOCRS_ID ); // WGS 84
setEllipsoid( "WGS84" );
setEllipsoid( GEO_NONE );
}


Expand Down Expand Up @@ -124,9 +124,9 @@ bool QgsDistanceArea::setEllipsoid( const QString& ellipsoid )
int myResult;

// Shortcut if ellipsoid is none.
if ( ellipsoid == "NONE" )
if ( ellipsoid == GEO_NONE )
{
mEllipsoid = "NONE";
mEllipsoid = GEO_NONE;
return true;
}

Expand Down Expand Up @@ -386,14 +386,14 @@ double QgsDistanceArea::measureLine( const QList<QgsPoint>& points )

try
{
if ( mEllipsoidalMode && ( mEllipsoid != "NONE" ) )
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 != "NONE" ) )
if ( mEllipsoidalMode && ( mEllipsoid != GEO_NONE ) )
{
p2 = mCoordTransform->transform( *i );
total += computeDistanceBearing( p1, p2 );
Expand Down Expand Up @@ -427,7 +427,7 @@ double QgsDistanceArea::measureLine( const QgsPoint& p1, const QgsPoint& p2 )
QgsPoint pp1 = p1, pp2 = p2;

QgsDebugMsg( QString( "Measuring from %1 to %2" ).arg( p1.toString( 4 ) ).arg( p2.toString( 4 ) ) );
if ( mEllipsoidalMode && ( mEllipsoid != "NONE" ) )
if ( mEllipsoidalMode && ( mEllipsoid != GEO_NONE ) )
{
QgsDebugMsg( QString( "Ellipsoidal calculations is enabled, using ellipsoid %1" ).arg( mEllipsoid ) );
QgsDebugMsg( QString( "From proj4 : %1" ).arg( mCoordTransform->sourceCrs().toProj4() ) );
Expand Down Expand Up @@ -496,7 +496,7 @@ unsigned char* QgsDistanceArea::measurePolygon( unsigned char* feature, double*

pnt = QgsPoint( x, y );

if ( mEllipsoidalMode && ( mEllipsoid != "NONE" ) )
if ( mEllipsoidalMode && ( mEllipsoid != GEO_NONE ) )
{
pnt = mCoordTransform->transform( pnt );
}
Expand Down Expand Up @@ -548,7 +548,7 @@ double QgsDistanceArea::measurePolygon( const QList<QgsPoint>& points )

try
{
if ( mEllipsoidalMode && ( mEllipsoid != "NONE" ) )
if ( mEllipsoidalMode && ( mEllipsoid != GEO_NONE ) )
{
QList<QgsPoint> pts;
for ( QList<QgsPoint>::const_iterator i = points.begin(); i != points.end(); ++i )
Expand Down Expand Up @@ -576,7 +576,7 @@ double QgsDistanceArea::bearing( const QgsPoint& p1, const QgsPoint& p2 )
QgsPoint pp1 = p1, pp2 = p2;
double bearing;

if ( mEllipsoidalMode && ( mEllipsoid != "NONE" ) )
if ( mEllipsoidalMode && ( mEllipsoid != GEO_NONE ) )
{
pp1 = mCoordTransform->transform( p1 );
pp2 = mCoordTransform->transform( p2 );
Expand Down Expand Up @@ -738,7 +738,7 @@ double QgsDistanceArea::computePolygonArea( const QList<QgsPoint>& points )
double area;

QgsDebugMsgLevel( "Ellipsoid: " + mEllipsoid, 3 );
if (( ! mEllipsoidalMode ) || ( mEllipsoid == "NONE" ) )
if (( ! mEllipsoidalMode ) || ( mEllipsoid == GEO_NONE ) )
{
return computePolygonFlatArea( points );
}
Expand Down Expand Up @@ -934,7 +934,7 @@ void QgsDistanceArea::convertMeasurement( double &measure, QGis::UnitType &measu
// The parameters measure and measureUnits are in/out

if (( measureUnits == QGis::Degrees || measureUnits == QGis::Feet ) &&
mEllipsoid != "NONE" &&
mEllipsoid != GEO_NONE &&
mEllipsoidalMode )
{
// Measuring on an ellipsoid returned meters. Force!
Expand Down
14 changes: 7 additions & 7 deletions src/core/qgsexpression.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -773,15 +773,15 @@ static QVariant fcnRound( const QVariantList& values , QgsFeature *f, QgsExpress
Q_UNUSED( f );
if ( values.length() == 2 )
{
double number = getDoubleValue( values.at( 0 ), parent );
double scaler = pow( 10.0, getIntValue( values.at( 1 ), parent ) );
return QVariant( qRound( number * scaler ) / scaler );
double number = getDoubleValue( values.at( 0 ), parent );
double scaler = pow( 10.0, getIntValue( values.at( 1 ), parent ) );
return QVariant( round( number * scaler ) / scaler );
}

if ( values.length() == 1 )
{
double number = getIntValue( values.at( 0 ), parent );
return QVariant( qRound( number) ).toInt();
double number = getIntValue( values.at( 0 ), parent );
return QVariant( round( number ) ).toInt();
}

return QVariant();
Expand Down Expand Up @@ -950,10 +950,10 @@ bool QgsExpression::needsGeometry()
void QgsExpression::initGeomCalculator()
{
mCalc = new QgsDistanceArea;
mCalc->setEllipsoidalMode( false );
QSettings settings;
QString ellipsoid = settings.value( "/qgis/measure/ellipsoid", "WGS84" ).toString();
QString ellipsoid = settings.value( "/qgis/measure/ellipsoid", GEO_NONE ).toString();
mCalc->setEllipsoid( ellipsoid );
mCalc->setEllipsoidalMode( false );
}

bool QgsExpression::prepare( const QgsFieldMap& fields )
Expand Down
7 changes: 0 additions & 7 deletions src/ui/qgsdisplayanglebase.ui
Original file line number Diff line number Diff line change
Expand Up @@ -44,13 +44,6 @@
</property>
</widget>
</item>
<item row="0" column="0">
<widget class="QCheckBox" name="mcbProjectionEnabled">
<property name="text">
<string>Ellipsoidal</string>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
Expand Down
7 changes: 0 additions & 7 deletions src/ui/qgsmeasurebase.ui
Original file line number Diff line number Diff line change
Expand Up @@ -98,13 +98,6 @@
</property>
</widget>
</item>
<item row="0" column="0" colspan="3">
<widget class="QCheckBox" name="mcbProjectionEnabled">
<property name="text">
<string>Ellipsoidal</string>
</property>
</widget>
</item>
</layout>
</widget>
<layoutdefault spacing="6" margin="11"/>
Expand Down
4 changes: 2 additions & 2 deletions tests/src/core/testqgsdistancearea.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -52,7 +52,7 @@ void TestQgsDistanceArea::basic()
QgsDistanceArea daA;
double resultA, resultB, resultC;

daA.setEllipsoid( "NONE" );
daA.setEllipsoid( GEO_NONE );
resultA = daA.measureLine( p1, p2 );
QCOMPARE( resultA, 5.0 );

Expand Down Expand Up @@ -139,7 +139,7 @@ void TestQgsDistanceArea::unit_conversions()
{
// Do some very simple test of conversion and units
QgsDistanceArea myDa;
myDa.setEllipsoidalMode( "NONE" );
myDa.setEllipsoidalMode( false );

double inputValue;
QGis::UnitType inputUnit;
Expand Down