diff --git a/python/core/qgsproject.sip b/python/core/qgsproject.sip index 3d59dda19521..6371c8914871 100644 --- a/python/core/qgsproject.sip +++ b/python/core/qgsproject.sip @@ -64,6 +64,38 @@ class QgsProject : QObject */ QFileInfo fileInfo() const; + /** + * Returns the project's native coordinate reference system. + * @note added in QGIS 2.18 + * @see setCrs() + * @see ellipsoid() + */ + QgsCoordinateReferenceSystem crs() const; + + /** + * Sets the project's native coordinate reference system. + * @note added in QGIS 2.18 + * @see crs() + * @see setEllipsoid() + */ + void setCrs( const QgsCoordinateReferenceSystem& crs ); + + /** + * Returns a proj string representing the project's ellipsoid setting, eg "WGS84". + * @see setEllipsoid() + * @see crs() + * @note added in QGIS 2.18 + */ + QString ellipsoid() const; + + /** + * Sets the project's ellipsoid from a proj string representation, eg "WGS84". + * @see ellipsoid() + * @see setCrs() + * @note added in QGIS 2.18 + */ + void setEllipsoid( const QString& ellipsoid ); + /** Clear the project - removes all settings and resets it back to an empty, default state. * @note added in 2.4 */ @@ -258,16 +290,33 @@ class QgsProject : QObject /** Convenience function to query default distance measurement units for project. * @note added in QGIS 2.14 + * @see setDistanceUnits() * @see areaUnits() */ QgsUnitTypes::DistanceUnit distanceUnits() const; + /** + * Sets the default distance measurement units for the project. + * @note added in QGIS 2.18 + * @see distanceUnits() + * @see setAreaUnits() + */ + void setDistanceUnits( QgsUnitTypes::DistanceUnit unit ); + /** Convenience function to query default area measurement units for project. * @note added in QGIS 2.14 * @see distanceUnits() */ QgsUnitTypes::AreaUnit areaUnits() const; + /** + * Sets the default area measurement units for the project. + * @note added in QGIS 2.18 + * @see areaUnits() + * @see setDistanceUnits() + */ + void setAreaUnits( QgsUnitTypes::AreaUnit unit ); + /** Return project's home path @return home path of project (or QString::null if not set) */ QString homePath() const; diff --git a/src/app/qgisapp.cpp b/src/app/qgisapp.cpp index 59cf1c5b53e2..c5245645da16 100644 --- a/src/app/qgisapp.cpp +++ b/src/app/qgisapp.cpp @@ -4435,9 +4435,7 @@ void QgisApp::fileNew( bool thePromptToSaveFlag, bool forceBlank ) QgsCoordinateReferenceSystem srs = QgsCoordinateReferenceSystem::fromOgcWmsCrs( defCrs ); mMapCanvas->setDestinationCrs( srs ); // write the projections _proj string_ to project settings - prj->writeEntry( "SpatialRefSys", "/ProjectCRSProj4String", srs.toProj4() ); - prj->writeEntry( "SpatialRefSys", "/ProjectCrs", srs.authid() ); - prj->writeEntry( "SpatialRefSys", "/ProjectCRSID", static_cast< int >( srs.srsid() ) ); + prj->setCrs( srs ); prj->setDirty( false ); if ( srs.mapUnits() != QgsUnitTypes::DistanceUnknownUnit ) { @@ -7306,7 +7304,7 @@ void QgisApp::selectByForm() myDa.setSourceCrs( vlayer->crs().srsid() ); myDa.setEllipsoidalMode( mMapCanvas->mapSettings().hasCrsTransformEnabled() ); - myDa.setEllipsoid( QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ) ); + myDa.setEllipsoid( QgsProject::instance()->ellipsoid() ); QgsAttributeEditorContext context; context.setDistanceArea( myDa ); @@ -8582,6 +8580,7 @@ void QgisApp::setProjectCrsFromLayer() QgsCoordinateReferenceSystem crs = mLayerTreeView->currentLayer()->crs(); mMapCanvas->freeze(); mMapCanvas->setDestinationCrs( crs ); + QgsProject::instance()->setCrs( crs ); if ( crs.mapUnits() != QgsUnitTypes::DistanceUnknownUnit ) { mMapCanvas->setMapUnits( crs.mapUnits() ); diff --git a/src/app/qgisappinterface.cpp b/src/app/qgisappinterface.cpp index c6bf04add48d..636a6bef9a81 100644 --- a/src/app/qgisappinterface.cpp +++ b/src/app/qgisappinterface.cpp @@ -681,7 +681,7 @@ QgsAttributeDialog* QgisAppInterface::getFeatureForm( QgsVectorLayer *l, QgsFeat myDa.setSourceCrs( l->crs().srsid() ); myDa.setEllipsoidalMode( QgisApp::instance()->mapCanvas()->mapSettings().hasCrsTransformEnabled() ); - myDa.setEllipsoid( QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ) ); + myDa.setEllipsoid( QgsProject::instance()->ellipsoid() ); QgsAttributeEditorContext context; context.setDistanceArea( myDa ); diff --git a/src/app/qgsattributeactionpropertiesdialog.cpp b/src/app/qgsattributeactionpropertiesdialog.cpp index 41c7e9124cea..f859dc0ca918 100644 --- a/src/app/qgsattributeactionpropertiesdialog.cpp +++ b/src/app/qgsattributeactionpropertiesdialog.cpp @@ -52,7 +52,7 @@ QgsAttributeActionPropertiesDialog::QgsAttributeActionPropertiesDialog( QgsActio QgsDistanceArea myDa; myDa.setSourceCrs( mLayer->crs().srsid() ); myDa.setEllipsoidalMode( QgisApp::instance()->mapCanvas()->mapSettings().hasCrsTransformEnabled() ); - myDa.setEllipsoid( QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ) ); + myDa.setEllipsoid( QgsProject::instance()->ellipsoid() ); mFieldExpression->setLayer( mLayer ); mFieldExpression->setGeomCalculator( myDa ); @@ -81,7 +81,7 @@ QgsAttributeActionPropertiesDialog::QgsAttributeActionPropertiesDialog( QgsVecto QgsDistanceArea myDa; myDa.setSourceCrs( mLayer->crs().srsid() ); myDa.setEllipsoidalMode( QgisApp::instance()->mapCanvas()->mapSettings().hasCrsTransformEnabled() ); - myDa.setEllipsoid( QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ) ); + myDa.setEllipsoid( QgsProject::instance()->ellipsoid() ); mFieldExpression->setLayer( mLayer ); mFieldExpression->setGeomCalculator( myDa ); diff --git a/src/app/qgsattributetabledialog.cpp b/src/app/qgsattributetabledialog.cpp index a84483bb498c..e10005d4728d 100644 --- a/src/app/qgsattributetabledialog.cpp +++ b/src/app/qgsattributetabledialog.cpp @@ -126,7 +126,7 @@ QgsAttributeTableDialog::QgsAttributeTableDialog( QgsVectorLayer *theLayer, QWid myDa->setSourceCrs( mLayer->crs() ); myDa->setEllipsoidalMode( QgisApp::instance()->mapCanvas()->mapSettings().hasCrsTransformEnabled() ); - myDa->setEllipsoid( QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ) ); + myDa->setEllipsoid( QgsProject::instance()->ellipsoid() ); mEditorContext.setDistanceArea( *myDa ); mEditorContext.setVectorLayerTools( QgisApp::instance()->vectorLayerTools() ); @@ -559,7 +559,7 @@ void QgsAttributeTableDialog::filterExpressionBuilder() QgsDistanceArea myDa; myDa.setSourceCrs( mLayer->crs().srsid() ); myDa.setEllipsoidalMode( QgisApp::instance()->mapCanvas()->mapSettings().hasCrsTransformEnabled() ); - myDa.setEllipsoid( QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ) ); + myDa.setEllipsoid( QgsProject::instance()->ellipsoid() ); dlg.setGeomCalculator( myDa ); if ( dlg.exec() == QDialog::Accepted ) @@ -920,7 +920,7 @@ void QgsAttributeTableDialog::setFilterExpression( const QString& filterString, myDa.setSourceCrs( mLayer->crs().srsid() ); myDa.setEllipsoidalMode( QgisApp::instance()->mapCanvas()->mapSettings().hasCrsTransformEnabled() ); - myDa.setEllipsoid( QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ) ); + myDa.setEllipsoid( QgsProject::instance()->ellipsoid() ); // parse search string and build parsed tree QgsExpression filterExpression( filter ); diff --git a/src/app/qgsdiagramproperties.cpp b/src/app/qgsdiagramproperties.cpp index 81d21d5024c1..6be3c268ba83 100644 --- a/src/app/qgsdiagramproperties.cpp +++ b/src/app/qgsdiagramproperties.cpp @@ -178,7 +178,7 @@ QgsDiagramProperties::QgsDiagramProperties( QgsVectorLayer* layer, QWidget* pare QgsDistanceArea myDa; myDa.setSourceCrs( mLayer->crs().srsid() ); myDa.setEllipsoidalMode( mMapCanvas->mapSettings().hasCrsTransformEnabled() ); - myDa.setEllipsoid( QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ) ); + myDa.setEllipsoid( QgsProject::instance()->ellipsoid() ); mSizeFieldExpressionWidget->setGeomCalculator( myDa ); //insert all attributes into the combo boxes @@ -871,7 +871,7 @@ QString QgsDiagramProperties::showExpressionBuilder( const QString& initialExpre QgsDistanceArea myDa; myDa.setSourceCrs( mLayer->crs().srsid() ); myDa.setEllipsoidalMode( mMapCanvas->mapSettings().hasCrsTransformEnabled() ); - myDa.setEllipsoid( QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ) ); + myDa.setEllipsoid( QgsProject::instance()->ellipsoid() ); dlg.setGeomCalculator( myDa ); if ( dlg.exec() == QDialog::Accepted ) diff --git a/src/app/qgsfeatureaction.cpp b/src/app/qgsfeatureaction.cpp index a02a5c78f82f..6905984e68fc 100644 --- a/src/app/qgsfeatureaction.cpp +++ b/src/app/qgsfeatureaction.cpp @@ -57,7 +57,7 @@ QgsAttributeDialog *QgsFeatureAction::newDialog( bool cloneFeature ) myDa.setSourceCrs( mLayer->crs() ); myDa.setEllipsoidalMode( QgisApp::instance()->mapCanvas()->mapSettings().hasCrsTransformEnabled() ); - myDa.setEllipsoid( QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ) ); + myDa.setEllipsoid( QgsProject::instance()->ellipsoid() ); context.setDistanceArea( myDa ); context.setVectorLayerTools( QgisApp::instance()->vectorLayerTools() ); diff --git a/src/app/qgsfieldcalculator.cpp b/src/app/qgsfieldcalculator.cpp index 5dd7bc383493..75e15357ba98 100644 --- a/src/app/qgsfieldcalculator.cpp +++ b/src/app/qgsfieldcalculator.cpp @@ -60,7 +60,7 @@ QgsFieldCalculator::QgsFieldCalculator( QgsVectorLayer* vl, QWidget* parent ) QgsDistanceArea myDa; myDa.setSourceCrs( vl->crs().srsid() ); myDa.setEllipsoidalMode( QgisApp::instance()->mapCanvas()->mapSettings().hasCrsTransformEnabled() ); - myDa.setEllipsoid( QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ) ); + myDa.setEllipsoid( QgsProject::instance()->ellipsoid() ); builder->setGeomCalculator( myDa ); //default values for field width and precision @@ -160,7 +160,7 @@ void QgsFieldCalculator::accept() myDa.setSourceCrs( mVectorLayer->crs().srsid() ); myDa.setEllipsoidalMode( QgisApp::instance()->mapCanvas()->mapSettings().hasCrsTransformEnabled() ); - myDa.setEllipsoid( QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ) ); + myDa.setEllipsoid( QgsProject::instance()->ellipsoid() ); QString calcString = builder->expressionText(); QgsExpression exp( calcString ); diff --git a/src/app/qgslabelinggui.cpp b/src/app/qgslabelinggui.cpp index 2b582fbcc7b9..9b16629bb295 100644 --- a/src/app/qgslabelinggui.cpp +++ b/src/app/qgslabelinggui.cpp @@ -590,7 +590,7 @@ void QgsLabelingGui::init() QgsDistanceArea myDa; myDa.setSourceCrs( mLayer->crs().srsid() ); myDa.setEllipsoidalMode( QgisApp::instance()->mapCanvas()->mapSettings().hasCrsTransformEnabled() ); - myDa.setEllipsoid( QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ) ); + myDa.setEllipsoid( QgsProject::instance()->ellipsoid() ); mFieldExpressionWidget->setGeomCalculator( myDa ); // set placement methods page based on geometry type diff --git a/src/app/qgsmaptoolmeasureangle.cpp b/src/app/qgsmaptoolmeasureangle.cpp index ecae82aaa536..37e71af1ef69 100644 --- a/src/app/qgsmaptoolmeasureangle.cpp +++ b/src/app/qgsmaptoolmeasureangle.cpp @@ -181,7 +181,7 @@ void QgsMapToolMeasureAngle::updateSettings() void QgsMapToolMeasureAngle::configureDistanceArea() { - QString ellipsoidId = QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ); + QString ellipsoidId = QgsProject::instance()->ellipsoid(); mDa.setSourceCrs( mCanvas->mapSettings().destinationCrs().srsid() ); mDa.setEllipsoid( ellipsoidId ); // Only use ellipsoidal calculation when project wide transformation is enabled. diff --git a/src/app/qgsmeasuredialog.cpp b/src/app/qgsmeasuredialog.cpp index 3668457d8b6f..25d6e799a4ed 100644 --- a/src/app/qgsmeasuredialog.cpp +++ b/src/app/qgsmeasuredialog.cpp @@ -79,7 +79,7 @@ void QgsMeasureDialog::updateSettings() mDistanceUnits = QgsProject::instance()->distanceUnits(); mAreaUnits = QgsProject::instance()->areaUnits(); mDa.setSourceCrs( mTool->canvas()->mapSettings().destinationCrs().srsid() ); - mDa.setEllipsoid( QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ) ); + mDa.setEllipsoid( QgsProject::instance()->ellipsoid() ); // Only use ellipsoidal calculation when project wide transformation is enabled. if ( mTool->canvas()->mapSettings().hasCrsTransformEnabled() ) { diff --git a/src/app/qgsprojectproperties.cpp b/src/app/qgsprojectproperties.cpp index 3321544567b6..81ca3f6d8244 100644 --- a/src/app/qgsprojectproperties.cpp +++ b/src/app/qgsprojectproperties.cpp @@ -783,9 +783,7 @@ void QgsProjectProperties::apply() QgsDebugMsg( QString( "Selected CRS " ) + srs.description() ); // write the currently selected projections _proj string_ to project settings QgsDebugMsg( QString( "SpatialRefSys/ProjectCRSProj4String: %1" ).arg( projectionSelector->selectedProj4String() ) ); - QgsProject::instance()->writeEntry( "SpatialRefSys", "/ProjectCRSProj4String", projectionSelector->selectedProj4String() ); - QgsProject::instance()->writeEntry( "SpatialRefSys", "/ProjectCRSID", ( int ) projectionSelector->selectedCrsId() ); - QgsProject::instance()->writeEntry( "SpatialRefSys", "/ProjectCrs", projectionSelector->selectedAuthId() ); + QgsProject::instance()->setCrs( srs ); // Set the map units to the projected coordinates if we are projecting if ( isProjected() ) @@ -837,10 +835,10 @@ void QgsProjectProperties::apply() emit displayPrecisionChanged(); QgsUnitTypes::DistanceUnit distanceUnits = static_cast< QgsUnitTypes::DistanceUnit >( mDistanceUnitsCombo->currentData().toInt() ); - QgsProject::instance()->writeEntry( "Measurement", "/DistanceUnits", QgsUnitTypes::encodeUnit( distanceUnits ) ); + QgsProject::instance()->setDistanceUnits( distanceUnits ); QgsUnitTypes::AreaUnit areaUnits = static_cast< QgsUnitTypes::AreaUnit >( mAreaUnitsCombo->currentData().toInt() ); - QgsProject::instance()->writeEntry( "Measurement", "/AreaUnits", QgsUnitTypes::encodeUnit( areaUnits ) ); + QgsProject::instance()->setAreaUnits( areaUnits ); QgsProject::instance()->writeEntry( "Paths", "/Absolute", cbxAbsolutePath->currentIndex() == 0 ); @@ -855,13 +853,13 @@ void QgsProjectProperties::apply() major = QLocale::system().toDouble( leSemiMajor->text() ); minor = QLocale::system().toDouble( leSemiMinor->text() ); } - QgsProject::instance()->writeEntry( "Measure", "/Ellipsoid", QString( "PARAMETER:%1:%2" ) - .arg( major, 0, 'g', 17 ) - .arg( minor, 0, 'g', 17 ) ); + QgsProject::instance()->setEllipsoid( QString( "PARAMETER:%1:%2" ) + .arg( major, 0, 'g', 17 ) + .arg( minor, 0, 'g', 17 ) ); } else { - QgsProject::instance()->writeEntry( "Measure", "/Ellipsoid", mEllipsoidList[ mEllipsoidIndex ].acronym ); + QgsProject::instance()->setEllipsoid( mEllipsoidList[ mEllipsoidIndex ].acronym ); } //set the color for selections @@ -2001,7 +1999,7 @@ void QgsProjectProperties::projectionSelectorInitialized() QgsDebugMsg( "Setting up ellipsoid" ); // Reading ellipsoid from setttings - QStringList mySplitEllipsoid = QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ).split( ':' ); + QStringList mySplitEllipsoid = QgsProject::instance()->ellipsoid().split( ':' ); int myIndex = 0; for ( int i = 0; i < mEllipsoidList.length(); i++ ) diff --git a/src/core/composer/qgscomposerhtml.cpp b/src/core/composer/qgscomposerhtml.cpp index 0a9f0082604b..5a6d113c8e25 100644 --- a/src/core/composer/qgscomposerhtml.cpp +++ b/src/core/composer/qgscomposerhtml.cpp @@ -548,7 +548,7 @@ void QgsComposerHtml::setExpressionContext( const QgsFeature &feature, QgsVector { mDistanceArea->setEllipsoidalMode( mComposition->mapSettings().hasCrsTransformEnabled() ); } - mDistanceArea->setEllipsoid( QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ) ); + mDistanceArea->setEllipsoid( QgsProject::instance()->ellipsoid() ); // create JSON representation of feature QgsJSONExporter exporter( layer ); diff --git a/src/core/composer/qgscomposerlabel.cpp b/src/core/composer/qgscomposerlabel.cpp index 01cb62334d91..41e101eef243 100644 --- a/src/core/composer/qgscomposerlabel.cpp +++ b/src/core/composer/qgscomposerlabel.cpp @@ -265,7 +265,7 @@ void QgsComposerLabel::refreshExpressionContext() mDistanceArea->setSourceCrs( mComposition->mapSettings().destinationCrs().srsid() ); } mDistanceArea->setEllipsoidalMode( mComposition->mapSettings().hasCrsTransformEnabled() ); - mDistanceArea->setEllipsoid( QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ) ); + mDistanceArea->setEllipsoid( QgsProject::instance()->ellipsoid() ); contentChanged(); update(); diff --git a/src/core/composer/qgscomposerscalebar.cpp b/src/core/composer/qgscomposerscalebar.cpp index 96a5ddc08e2d..a84fa4398031 100644 --- a/src/core/composer/qgscomposerscalebar.cpp +++ b/src/core/composer/qgscomposerscalebar.cpp @@ -304,7 +304,7 @@ double QgsComposerScaleBar::mapWidth() const QgsDistanceArea da; da.setEllipsoidalMode( mComposition->mapSettings().hasCrsTransformEnabled() ); da.setSourceCrs( mComposition->mapSettings().destinationCrs().srsid() ); - da.setEllipsoid( QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", "WGS84" ) ); + da.setEllipsoid( QgsProject::instance()->ellipsoid() ); QgsUnitTypes::DistanceUnit units = QgsUnitTypes::DistanceMeters; double measure = da.measureLine( QgsPoint( composerMapRect.xMinimum(), composerMapRect.yMinimum() ), diff --git a/src/core/qgsproject.cpp b/src/core/qgsproject.cpp index c7989001f89a..3b5932ecc381 100644 --- a/src/core/qgsproject.cpp +++ b/src/core/qgsproject.cpp @@ -444,6 +444,36 @@ QFileInfo QgsProject::fileInfo() const return QFileInfo( imp_->file ); } +QgsCoordinateReferenceSystem QgsProject::crs() const +{ + QgsCoordinateReferenceSystem projectCrs; + long currentCRS = readNumEntry( "SpatialRefSys", "/ProjectCRSID", -1 ); + if ( currentCRS != -1 ) + { + projectCrs = QgsCoordinateReferenceSystem::fromSrsId( currentCRS ); + } + return projectCrs; +} + +void QgsProject::setCrs( const QgsCoordinateReferenceSystem &crs ) +{ + writeEntry( "SpatialRefSys", "/ProjectCRSProj4String", crs.toProj4() ); + writeEntry( "SpatialRefSys", "/ProjectCRSID", static_cast< int >( crs.srsid() ) ); + writeEntry( "SpatialRefSys", "/ProjectCrs", crs.authid() ); + setDirty( true ); +} + +QString QgsProject::ellipsoid() const +{ + return readEntry( "Measure", "/Ellipsoid", GEO_NONE ); +} + +void QgsProject::setEllipsoid( const QString& ellipsoid ) +{ + writeEntry( "Measure", "/Ellipsoid", ellipsoid ); + setDirty( true ); +} + void QgsProject::clear() { imp_->clear(); @@ -2108,6 +2138,11 @@ QgsUnitTypes::DistanceUnit QgsProject::distanceUnits() const return ok ? type : QgsUnitTypes::DistanceMeters; } +void QgsProject::setDistanceUnits( QgsUnitTypes::DistanceUnit unit ) +{ + writeEntry( "Measurement", "/DistanceUnits", QgsUnitTypes::encodeUnit( unit ) ); +} + QgsUnitTypes::AreaUnit QgsProject::areaUnits() const { QString areaUnitString = QgsProject::instance()->readEntry( "Measurement", "/AreaUnits", QString() ); @@ -2121,6 +2156,11 @@ QgsUnitTypes::AreaUnit QgsProject::areaUnits() const return ok ? type : QgsUnitTypes::AreaSquareMeters; } +void QgsProject::setAreaUnits( QgsUnitTypes::AreaUnit unit ) +{ + writeEntry( "Measurement", "/AreaUnits", QgsUnitTypes::encodeUnit( unit ) ); +} + void QgsProjectBadLayerDefaultHandler::handleBadLayers( const QList& /*layers*/, const QDomDocument& /*projectDom*/ ) { // just ignore any bad layers diff --git a/src/core/qgsproject.h b/src/core/qgsproject.h index e838ab6cb82a..017f5e1b3bc6 100644 --- a/src/core/qgsproject.h +++ b/src/core/qgsproject.h @@ -34,6 +34,7 @@ #include "qgsunittypes.h" #include "qgsprojectversion.h" #include "qgsexpressioncontextgenerator.h" +#include "qgscoordinatereferencesystem.h" class QFileInfo; class QDomDocument; @@ -74,6 +75,7 @@ class CORE_EXPORT QgsProject : public QObject, public QgsExpressionContextGenera Q_PROPERTY( QStringList nonIdentifiableLayers READ nonIdentifiableLayers WRITE setNonIdentifiableLayers NOTIFY nonIdentifiableLayersChanged ) Q_PROPERTY( QString fileName READ fileName WRITE setFileName NOTIFY fileNameChanged ) Q_PROPERTY( QString homePath READ homePath NOTIFY homePathChanged ) + Q_PROPERTY( QgsCoordinateReferenceSystem crs READ crs WRITE setCrs ) public: @@ -120,6 +122,38 @@ class CORE_EXPORT QgsProject : public QObject, public QgsExpressionContextGenera */ QFileInfo fileInfo() const; + /** + * Returns the project's native coordinate reference system. + * @note added in QGIS 2.18 + * @see setCrs() + * @see ellipsoid() + */ + QgsCoordinateReferenceSystem crs() const; + + /** + * Sets the project's native coordinate reference system. + * @note added in QGIS 2.18 + * @see crs() + * @see setEllipsoid() + */ + void setCrs( const QgsCoordinateReferenceSystem& crs ); + + /** + * Returns a proj string representing the project's ellipsoid setting, eg "WGS84". + * @see setEllipsoid() + * @see crs() + * @note added in QGIS 2.18 + */ + QString ellipsoid() const; + + /** + * Sets the project's ellipsoid from a proj string representation, eg "WGS84". + * @see ellipsoid() + * @see setCrs() + * @note added in QGIS 2.18 + */ + void setEllipsoid( const QString& ellipsoid ); + /** Clear the project - removes all settings and resets it back to an empty, default state. * @note added in 2.4 */ @@ -314,16 +348,33 @@ class CORE_EXPORT QgsProject : public QObject, public QgsExpressionContextGenera /** Convenience function to query default distance measurement units for project. * @note added in QGIS 2.14 + * @see setDistanceUnits() * @see areaUnits() */ QgsUnitTypes::DistanceUnit distanceUnits() const; + /** + * Sets the default distance measurement units for the project. + * @note added in QGIS 2.18 + * @see distanceUnits() + * @see setAreaUnits() + */ + void setDistanceUnits( QgsUnitTypes::DistanceUnit unit ); + /** Convenience function to query default area measurement units for project. * @note added in QGIS 2.14 * @see distanceUnits() */ QgsUnitTypes::AreaUnit areaUnits() const; + /** + * Sets the default area measurement units for the project. + * @note added in QGIS 2.18 + * @see areaUnits() + * @see setDistanceUnits() + */ + void setAreaUnits( QgsUnitTypes::AreaUnit unit ); + /** Return project's home path @return home path of project (or QString::null if not set) */ QString homePath() const; diff --git a/src/core/qgsvectorlayerfeatureiterator.cpp b/src/core/qgsvectorlayerfeatureiterator.cpp index 7aeb2a24a206..5014532951f5 100644 --- a/src/core/qgsvectorlayerfeatureiterator.cpp +++ b/src/core/qgsvectorlayerfeatureiterator.cpp @@ -548,7 +548,7 @@ void QgsVectorLayerFeatureIterator::prepareExpression( int fieldIdx ) QgsDistanceArea da; da.setSourceCrs( mSource->mCrsId ); da.setEllipsoidalMode( true ); - da.setEllipsoid( QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ) ); + da.setEllipsoid( QgsProject::instance()->ellipsoid() ); exp->setGeomCalculator( &da ); exp->setDistanceUnits( QgsProject::instance()->distanceUnits() ); exp->setAreaUnits( QgsProject::instance()->areaUnits() ); diff --git a/src/gui/layertree/qgslayertreemapcanvasbridge.cpp b/src/gui/layertree/qgslayertreemapcanvasbridge.cpp index 179bea4ab307..81c2edbd229d 100644 --- a/src/gui/layertree/qgslayertreemapcanvasbridge.cpp +++ b/src/gui/layertree/qgslayertreemapcanvasbridge.cpp @@ -20,6 +20,7 @@ #include "qgsmaplayer.h" #include "qgsvectorlayer.h" #include "qgsmapcanvas.h" +#include "qgsproject.h" QgsLayerTreeMapCanvasBridge::QgsLayerTreeMapCanvasBridge( QgsLayerTreeGroup *root, QgsMapCanvas *canvas, QObject* parent ) : QObject( parent ) @@ -146,6 +147,7 @@ void QgsLayerTreeMapCanvasBridge::setCanvasLayers() if ( layerNode->layer()->isSpatial() ) { mCanvas->setDestinationCrs( layerNode->layer()->crs() ); + QgsProject::instance()->setCrs( layerNode->layer()->crs() ); mCanvas->setMapUnits( layerNode->layer()->crs().mapUnits() ); break; } @@ -182,6 +184,7 @@ void QgsLayerTreeMapCanvasBridge::setCanvasLayers() if ( layerNode->layer() && layerNode->layer()->crs().isValid() && layerNode->layer()->crs() != mFirstCRS ) { mCanvas->setDestinationCrs( mFirstCRS ); + QgsProject::instance()->setCrs( mFirstCRS ); mCanvas->setCrsTransformEnabled( true ); break; } diff --git a/src/gui/qgsmaptoolidentify.cpp b/src/gui/qgsmaptoolidentify.cpp index 7b5d07b30f57..5b5325017633 100644 --- a/src/gui/qgsmaptoolidentify.cpp +++ b/src/gui/qgsmaptoolidentify.cpp @@ -352,7 +352,7 @@ QMap< QString, QString > QgsMapToolIdentify::featureDerivedAttributes( QgsFeatur QMap< QString, QString > derivedAttributes; // init distance/area calculator - QString ellipsoid = QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ); + QString ellipsoid = QgsProject::instance()->ellipsoid(); QgsDistanceArea calc; calc.setEllipsoidalMode( mCanvas->hasCrsTransformEnabled() ); calc.setEllipsoid( ellipsoid ); diff --git a/src/gui/qgsowssourceselect.cpp b/src/gui/qgsowssourceselect.cpp index cc386b8113fd..952553e1a914 100644 --- a/src/gui/qgsowssourceselect.cpp +++ b/src/gui/qgsowssourceselect.cpp @@ -93,15 +93,11 @@ QgsOWSSourceSelect::QgsOWSSourceSelect( const QString& service, QWidget * parent { connect( mAddButton, SIGNAL( clicked() ), this, SLOT( addClicked() ) ); //set the current project CRS if available - long currentCRS = QgsProject::instance()->readNumEntry( "SpatialRefSys", "/ProjectCRSID", -1 ); - if ( currentCRS != -1 ) + QgsCoordinateReferenceSystem currentRefSys = QgsProject::instance()->crs(); + //convert CRS id to epsg + if ( currentRefSys.isValid() ) { - //convert CRS id to epsg - QgsCoordinateReferenceSystem currentRefSys = QgsCoordinateReferenceSystem::fromSrsId( currentCRS ); - if ( currentRefSys.isValid() ) - { - mSelectedCRS = currentRefSys.authid(); - } + mSelectedCRS = currentRefSys.authid(); } } else @@ -383,8 +379,7 @@ void QgsOWSSourceSelect::on_mChangeCRSButton_clicked() mySelector->setMessage(); mySelector->setOgcWmsCrsFilter( mSelectedLayersCRSs ); - QString myDefaultCrs = QgsProject::instance()->readEntry( "SpatialRefSys", "/ProjectCrs", GEO_EPSG_CRS_AUTHID ); - QgsCoordinateReferenceSystem defaultCRS = QgsCoordinateReferenceSystem::fromOgcWmsCrs( myDefaultCrs ); + QgsCoordinateReferenceSystem defaultCRS = QgsProject::instance()->crs(); if ( defaultCRS.isValid() ) { mySelector->setSelectedCrsId( defaultCRS.srsid() ); diff --git a/src/gui/qgsprojectionselectionwidget.cpp b/src/gui/qgsprojectionselectionwidget.cpp index eb1a7ba8640e..e507b7872f01 100644 --- a/src/gui/qgsprojectionselectionwidget.cpp +++ b/src/gui/qgsprojectionselectionwidget.cpp @@ -40,8 +40,7 @@ QgsProjectionSelectionWidget::QgsProjectionSelectionWidget( QWidget *parent ) { //only show project CRS if OTF reprojection is enabled - otherwise the //CRS stored in the project can be misleading - QString projectCrsString = QgsProject::instance()->readEntry( "SpatialRefSys", "/ProjectCrs" ); - mProjectCrs = QgsCoordinateReferenceSystem::fromOgcWmsCrs( projectCrsString ); + mProjectCrs = QgsProject::instance()->crs(); addProjectCrsOption(); } diff --git a/src/gui/qgssourceselectdialog.cpp b/src/gui/qgssourceselectdialog.cpp index e5c2b4211dfc..ef495638ce83 100644 --- a/src/gui/qgssourceselectdialog.cpp +++ b/src/gui/qgssourceselectdialog.cpp @@ -194,9 +194,8 @@ QString QgsSourceSelectDialog::getPreferredCrs( const QSet& crsSet ) co } //first: project CRS - long ProjectCRSID = QgsProject::instance()->readNumEntry( "SpatialRefSys", "/ProjectCRSID", -1 ); + QgsCoordinateReferenceSystem projectRefSys = QgsProject::instance()->crs(); //convert to EPSG - QgsCoordinateReferenceSystem projectRefSys = QgsCoordinateReferenceSystem::fromSrsId( ProjectCRSID ); QString ProjectCRS; if ( projectRefSys.isValid() ) { diff --git a/src/providers/wfs/qgswfssourceselect.cpp b/src/providers/wfs/qgswfssourceselect.cpp index 3ed15d37da46..0fa4d9417070 100644 --- a/src/providers/wfs/qgswfssourceselect.cpp +++ b/src/providers/wfs/qgswfssourceselect.cpp @@ -179,9 +179,8 @@ QString QgsWFSSourceSelect::getPreferredCrs( const QSet& crsSet ) const } //first: project CRS - long ProjectCRSID = QgsProject::instance()->readNumEntry( "SpatialRefSys", "/ProjectCRSID", -1 ); + QgsCoordinateReferenceSystem projectRefSys = QgsProject::instance()->crs(); //convert to EPSG - QgsCoordinateReferenceSystem projectRefSys = QgsCoordinateReferenceSystem::fromSrsId( ProjectCRSID ); QString ProjectCRS; if ( projectRefSys.isValid() ) { diff --git a/src/providers/wms/qgswmssourceselect.cpp b/src/providers/wms/qgswmssourceselect.cpp index 1dbdcd53b19d..fb43dc1c2f41 100644 --- a/src/providers/wms/qgswmssourceselect.cpp +++ b/src/providers/wms/qgswmssourceselect.cpp @@ -112,15 +112,11 @@ QgsWMSSourceSelect::QgsWMSSourceSelect( QWidget * parent, Qt::WindowFlags fl, bo setTabOrder( lstLayers, mImageFormatGroup->button( 0 ) ); //set the current project CRS if available - long currentCRS = QgsProject::instance()->readNumEntry( "SpatialRefSys", "/ProjectCRSID", -1 ); - if ( currentCRS != -1 ) + QgsCoordinateReferenceSystem currentRefSys = QgsProject::instance()->crs(); + //convert CRS id to epsg + if ( currentRefSys.isValid() ) { - //convert CRS id to epsg - QgsCoordinateReferenceSystem currentRefSys = QgsCoordinateReferenceSystem::fromSrsId( currentCRS ); - if ( currentRefSys.isValid() ) - { - mDefaultCRS = mCRS = currentRefSys.authid(); - } + mDefaultCRS = mCRS = currentRefSys.authid(); } // set up the default WMS Coordinate Reference System @@ -616,8 +612,7 @@ void QgsWMSSourceSelect::on_btnChangeSpatialRefSys_clicked() mySelector->setMessage(); mySelector->setOgcWmsCrsFilter( mCRSs ); - QString myDefaultCrs = QgsProject::instance()->readEntry( "SpatialRefSys", "/ProjectCrs", GEO_EPSG_CRS_AUTHID ); - QgsCoordinateReferenceSystem defaultCRS = QgsCoordinateReferenceSystem::fromOgcWmsCrs( myDefaultCrs ); + QgsCoordinateReferenceSystem defaultCRS = QgsProject::instance()->crs(); if ( defaultCRS.isValid() ) { mySelector->setSelectedCrsId( defaultCRS.srsid() ); diff --git a/tests/src/app/testqgsattributetable.cpp b/tests/src/app/testqgsattributetable.cpp index 2aac54cbdde0..b4600508fa13 100644 --- a/tests/src/app/testqgsattributetable.cpp +++ b/tests/src/app/testqgsattributetable.cpp @@ -87,11 +87,9 @@ void TestQgsAttributeTable::testFieldCalculation() // set project CRS and ellipsoid QgisApp::instance()->mapCanvas()->setCrsTransformEnabled( true ); QgsCoordinateReferenceSystem srs( 3111, QgsCoordinateReferenceSystem::EpsgCrsId ); - QgsProject::instance()->writeEntry( "SpatialRefSys", "/ProjectCRSProj4String", srs.toProj4() ); - QgsProject::instance()->writeEntry( "SpatialRefSys", "/ProjectCRSID", ( int ) srs.srsid() ); - QgsProject::instance()->writeEntry( "SpatialRefSys", "/ProjectCrs", srs.authid() ); - QgsProject::instance()->writeEntry( "Measure", "/Ellipsoid", QString( "WGS84" ) ); - QgsProject::instance()->writeEntry( "Measurement", "/DistanceUnits", QgsUnitTypes::encodeUnit( QgsUnitTypes::DistanceMeters ) ); + QgsProject::instance()->setCrs( srs ); + QgsProject::instance()->setEllipsoid( QString( "WGS84" ) ); + QgsProject::instance()->setDistanceUnits( QgsUnitTypes::DistanceMeters ); // run length calculation QScopedPointer< QgsAttributeTableDialog > dlg( new QgsAttributeTableDialog( tempLayer.data() ) ); @@ -106,7 +104,7 @@ void TestQgsAttributeTable::testFieldCalculation() QVERIFY( qgsDoubleNear( f.attribute( "col1" ).toDouble(), expected, 0.001 ) ); // change project length unit, check calculation respects unit - QgsProject::instance()->writeEntry( "Measurement", "/DistanceUnits", QgsUnitTypes::encodeUnit( QgsUnitTypes::DistanceFeet ) ); + QgsProject::instance()->setDistanceUnits( QgsUnitTypes::DistanceFeet ); QScopedPointer< QgsAttributeTableDialog > dlg2( new QgsAttributeTableDialog( tempLayer.data() ) ); tempLayer->startEditing(); dlg2->runFieldCalculation( tempLayer.data(), "col1", "$length" ); @@ -140,11 +138,9 @@ void TestQgsAttributeTable::testFieldCalculationArea() // set project CRS and ellipsoid QgisApp::instance()->mapCanvas()->setCrsTransformEnabled( true ); QgsCoordinateReferenceSystem srs( 3111, QgsCoordinateReferenceSystem::EpsgCrsId ); - QgsProject::instance()->writeEntry( "SpatialRefSys", "/ProjectCRSProj4String", srs.toProj4() ); - QgsProject::instance()->writeEntry( "SpatialRefSys", "/ProjectCRSID", ( int ) srs.srsid() ); - QgsProject::instance()->writeEntry( "SpatialRefSys", "/ProjectCrs", srs.authid() ); - QgsProject::instance()->writeEntry( "Measure", "/Ellipsoid", QString( "WGS84" ) ); - QgsProject::instance()->writeEntry( "Measurement", "/AreaUnits", QgsUnitTypes::encodeUnit( QgsUnitTypes::AreaSquareMeters ) ); + QgsProject::instance()->setCrs( srs ); + QgsProject::instance()->setEllipsoid( QString( "WGS84" ) ); + QgsProject::instance()->setAreaUnits( QgsUnitTypes::AreaSquareMeters ); // run area calculation QScopedPointer< QgsAttributeTableDialog > dlg( new QgsAttributeTableDialog( tempLayer.data() ) ); @@ -159,7 +155,7 @@ void TestQgsAttributeTable::testFieldCalculationArea() QVERIFY( qgsDoubleNear( f.attribute( "col1" ).toDouble(), expected, 1.0 ) ); // change project area unit, check calculation respects unit - QgsProject::instance()->writeEntry( "Measurement", "/AreaUnits", QgsUnitTypes::encodeUnit( QgsUnitTypes::AreaSquareMiles ) ); + QgsProject::instance()->setAreaUnits( QgsUnitTypes::AreaSquareMiles ); QScopedPointer< QgsAttributeTableDialog > dlg2( new QgsAttributeTableDialog( tempLayer.data() ) ); tempLayer->startEditing(); dlg2->runFieldCalculation( tempLayer.data(), "col1", "$area" ); diff --git a/tests/src/app/testqgsfieldcalculator.cpp b/tests/src/app/testqgsfieldcalculator.cpp index b81afd0ed88a..ec656a2b070f 100644 --- a/tests/src/app/testqgsfieldcalculator.cpp +++ b/tests/src/app/testqgsfieldcalculator.cpp @@ -87,11 +87,9 @@ void TestQgsFieldCalculator::testLengthCalculations() // set project CRS and ellipsoid QgisApp::instance()->mapCanvas()->setCrsTransformEnabled( true ); QgsCoordinateReferenceSystem srs( 3111, QgsCoordinateReferenceSystem::EpsgCrsId ); - QgsProject::instance()->writeEntry( "SpatialRefSys", "/ProjectCRSProj4String", srs.toProj4() ); - QgsProject::instance()->writeEntry( "SpatialRefSys", "/ProjectCRSID", ( int ) srs.srsid() ); - QgsProject::instance()->writeEntry( "SpatialRefSys", "/ProjectCrs", srs.authid() ); - QgsProject::instance()->writeEntry( "Measure", "/Ellipsoid", QString( "WGS84" ) ); - QgsProject::instance()->writeEntry( "Measurement", "/DistanceUnits", QgsUnitTypes::encodeUnit( QgsUnitTypes::DistanceMeters ) ); + QgsProject::instance()->setCrs( srs ); + QgsProject::instance()->setEllipsoid( QString( "WGS84" ) ); + QgsProject::instance()->setDistanceUnits( QgsUnitTypes::DistanceMeters ); // run length calculation tempLayer->startEditing(); @@ -113,7 +111,7 @@ void TestQgsFieldCalculator::testLengthCalculations() QVERIFY( qgsDoubleNear( f.attribute( "col1" ).toDouble(), expected, 0.001 ) ); // change project length unit, check calculation respects unit - QgsProject::instance()->writeEntry( "Measurement", "/DistanceUnits", QgsUnitTypes::encodeUnit( QgsUnitTypes::DistanceFeet ) ); + QgsProject::instance()->setDistanceUnits( QgsUnitTypes::DistanceFeet ); tempLayer->startEditing(); QScopedPointer< QgsFieldCalculator > calc2( new QgsFieldCalculator( tempLayer.data() ) ); calc2->mUpdateExistingGroupBox->setChecked( true ); @@ -151,11 +149,9 @@ void TestQgsFieldCalculator::testAreaCalculations() // set project CRS and ellipsoid QgisApp::instance()->mapCanvas()->setCrsTransformEnabled( true ); QgsCoordinateReferenceSystem srs( 3111, QgsCoordinateReferenceSystem::EpsgCrsId ); - QgsProject::instance()->writeEntry( "SpatialRefSys", "/ProjectCRSProj4String", srs.toProj4() ); - QgsProject::instance()->writeEntry( "SpatialRefSys", "/ProjectCRSID", ( int ) srs.srsid() ); - QgsProject::instance()->writeEntry( "SpatialRefSys", "/ProjectCrs", srs.authid() ); - QgsProject::instance()->writeEntry( "Measure", "/Ellipsoid", QString( "WGS84" ) ); - QgsProject::instance()->writeEntry( "Measurement", "/AreaUnits", QgsUnitTypes::encodeUnit( QgsUnitTypes::AreaSquareMeters ) ); + QgsProject::instance()->setCrs( srs ); + QgsProject::instance()->setEllipsoid( QString( "WGS84" ) ); + QgsProject::instance()->setAreaUnits( QgsUnitTypes::AreaSquareMeters ); // run area calculation tempLayer->startEditing(); @@ -177,7 +173,7 @@ void TestQgsFieldCalculator::testAreaCalculations() QVERIFY( qgsDoubleNear( f.attribute( "col1" ).toDouble(), expected, 1.0 ) ); // change project area unit, check calculation respects unit - QgsProject::instance()->writeEntry( "Measurement", "/AreaUnits", QgsUnitTypes::encodeUnit( QgsUnitTypes::AreaSquareMiles ) ); + QgsProject::instance()->setAreaUnits( QgsUnitTypes::AreaSquareMiles ); tempLayer->startEditing(); QScopedPointer< QgsFieldCalculator > calc2( new QgsFieldCalculator( tempLayer.data() ) ); calc2->mUpdateExistingGroupBox->setChecked( true ); diff --git a/tests/src/app/testqgsmaptoolidentifyaction.cpp b/tests/src/app/testqgsmaptoolidentifyaction.cpp index 2a4f71ae139e..399e1f51c4e3 100644 --- a/tests/src/app/testqgsmaptoolidentifyaction.cpp +++ b/tests/src/app/testqgsmaptoolidentifyaction.cpp @@ -130,11 +130,9 @@ void TestQgsMapToolIdentifyAction::lengthCalculation() canvas->setCrsTransformEnabled( true ); canvas->setDestinationCrs( srs ); canvas->setExtent( f1.geometry().boundingBox() ); - QgsProject::instance()->writeEntry( "SpatialRefSys", "/ProjectCRSProj4String", srs.toProj4() ); - QgsProject::instance()->writeEntry( "SpatialRefSys", "/ProjectCRSID", ( int ) srs.srsid() ); - QgsProject::instance()->writeEntry( "SpatialRefSys", "/ProjectCrs", srs.authid() ); - QgsProject::instance()->writeEntry( "Measure", "/Ellipsoid", QString( "WGS84" ) ); - QgsProject::instance()->writeEntry( "Measurement", "/DistanceUnits", QgsUnitTypes::encodeUnit( QgsUnitTypes::DistanceMeters ) ); + QgsProject::instance()->setCrs( srs ); + QgsProject::instance()->setEllipsoid( QString( "WGS84" ) ); + QgsProject::instance()->setDistanceUnits( QgsUnitTypes::DistanceMeters ); QgsPoint mapPoint = canvas->getCoordinateTransform()->transform( 2484588, 2425722 ); @@ -146,7 +144,7 @@ void TestQgsMapToolIdentifyAction::lengthCalculation() QVERIFY( qgsDoubleNear( length, 26932.2, 0.1 ) ); //check that project units are respected - QgsProject::instance()->writeEntry( "Measurement", "/DistanceUnits", QgsUnitTypes::encodeUnit( QgsUnitTypes::DistanceFeet ) ); + QgsProject::instance()->setDistanceUnits( QgsUnitTypes::DistanceFeet ); result = action->identify( mapPoint.x(), mapPoint.y(), QList() << tempLayer.data() ); QCOMPARE( result.length(), 1 ); derivedLength = result.at( 0 ).mDerivedAttributes[tr( "Length" )]; @@ -186,11 +184,9 @@ void TestQgsMapToolIdentifyAction::perimeterCalculation() canvas->setCrsTransformEnabled( true ); canvas->setDestinationCrs( srs ); canvas->setExtent( f1.geometry().boundingBox() ); - QgsProject::instance()->writeEntry( "SpatialRefSys", "/ProjectCRSProj4String", srs.toProj4() ); - QgsProject::instance()->writeEntry( "SpatialRefSys", "/ProjectCRSID", ( int ) srs.srsid() ); - QgsProject::instance()->writeEntry( "SpatialRefSys", "/ProjectCrs", srs.authid() ); - QgsProject::instance()->writeEntry( "Measure", "/Ellipsoid", QString( "WGS84" ) ); - QgsProject::instance()->writeEntry( "Measurement", "/DistanceUnits", QgsUnitTypes::encodeUnit( QgsUnitTypes::DistanceMeters ) ); + QgsProject::instance()->setCrs( srs ); + QgsProject::instance()->setEllipsoid( QString( "WGS84" ) ); + QgsProject::instance()->setDistanceUnits( QgsUnitTypes::DistanceMeters ); QgsPoint mapPoint = canvas->getCoordinateTransform()->transform( 2484588, 2425722 ); @@ -202,7 +198,7 @@ void TestQgsMapToolIdentifyAction::perimeterCalculation() QCOMPARE( perimeter, 128289.074 ); //check that project units are respected - QgsProject::instance()->writeEntry( "Measurement", "/DistanceUnits", QgsUnitTypes::encodeUnit( QgsUnitTypes::DistanceFeet ) ); + QgsProject::instance()->setDistanceUnits( QgsUnitTypes::DistanceFeet ); result = action->identify( mapPoint.x(), mapPoint.y(), QList() << tempLayer.data() ); QCOMPARE( result.length(), 1 ); derivedPerimeter = result.at( 0 ).mDerivedAttributes[tr( "Perimeter" )]; @@ -243,11 +239,9 @@ void TestQgsMapToolIdentifyAction::areaCalculation() canvas->setCrsTransformEnabled( true ); canvas->setDestinationCrs( srs ); canvas->setExtent( f1.geometry().boundingBox() ); - QgsProject::instance()->writeEntry( "SpatialRefSys", "/ProjectCRSProj4String", srs.toProj4() ); - QgsProject::instance()->writeEntry( "SpatialRefSys", "/ProjectCRSID", ( int ) srs.srsid() ); - QgsProject::instance()->writeEntry( "SpatialRefSys", "/ProjectCrs", srs.authid() ); - QgsProject::instance()->writeEntry( "Measure", "/Ellipsoid", QString( "WGS84" ) ); - QgsProject::instance()->writeEntry( "Measurement", "/AreaUnits", QgsUnitTypes::encodeUnit( QgsUnitTypes::AreaSquareMeters ) ); + QgsProject::instance()->setCrs( srs ); + QgsProject::instance()->setEllipsoid( QString( "WGS84" ) ); + QgsProject::instance()->setAreaUnits( QgsUnitTypes::AreaSquareMeters ); QgsPoint mapPoint = canvas->getCoordinateTransform()->transform( 2484588, 2425722 ); @@ -259,7 +253,7 @@ void TestQgsMapToolIdentifyAction::areaCalculation() QVERIFY( qgsDoubleNear( area, 1009089817.0, 1.0 ) ); //check that project units are respected - QgsProject::instance()->writeEntry( "Measurement", "/AreaUnits", QgsUnitTypes::encodeUnit( QgsUnitTypes::AreaSquareMiles ) ); + QgsProject::instance()->setAreaUnits( QgsUnitTypes::AreaSquareMiles ); result = action->identify( mapPoint.x(), mapPoint.y(), QList() << tempLayer.data() ); QCOMPARE( result.length(), 1 ); derivedArea = result.at( 0 ).mDerivedAttributes[tr( "Area" )]; @@ -268,7 +262,7 @@ void TestQgsMapToolIdentifyAction::areaCalculation() //test unchecked "keep base units" setting s.setValue( "/qgis/measure/keepbaseunit", false ); - QgsProject::instance()->writeEntry( "Measurement", "/AreaUnits", QgsUnitTypes::encodeUnit( QgsUnitTypes::AreaSquareFeet ) ); + QgsProject::instance()->setAreaUnits( QgsUnitTypes::AreaSquareFeet ); result = action->identify( mapPoint.x(), mapPoint.y(), QList() << tempLayer.data() ); QCOMPARE( result.length(), 1 ); derivedArea = result.at( 0 ).mDerivedAttributes[tr( "Area" )]; diff --git a/tests/src/app/testqgsmeasuretool.cpp b/tests/src/app/testqgsmeasuretool.cpp index 00b038d1f276..84a1de0cb95f 100644 --- a/tests/src/app/testqgsmeasuretool.cpp +++ b/tests/src/app/testqgsmeasuretool.cpp @@ -94,11 +94,9 @@ void TestQgsMeasureTool::testLengthCalculation() QgsCoordinateReferenceSystem srs( 3111, QgsCoordinateReferenceSystem::EpsgCrsId ); mCanvas->setCrsTransformEnabled( true ); mCanvas->setDestinationCrs( srs ); - QgsProject::instance()->writeEntry( "SpatialRefSys", "/ProjectCRSProj4String", srs.toProj4() ); - QgsProject::instance()->writeEntry( "SpatialRefSys", "/ProjectCRSID", ( int ) srs.srsid() ); - QgsProject::instance()->writeEntry( "SpatialRefSys", "/ProjectCrs", srs.authid() ); - QgsProject::instance()->writeEntry( "Measure", "/Ellipsoid", QString( "WGS84" ) ); - QgsProject::instance()->writeEntry( "Measurement", "/DistanceUnits", QgsUnitTypes::encodeUnit( QgsUnitTypes::DistanceMeters ) ); + QgsProject::instance()->setCrs( srs ); + QgsProject::instance()->setEllipsoid( QString( "WGS84" ) ); + QgsProject::instance()->setDistanceUnits( QgsUnitTypes::DistanceMeters ); // run length calculation QScopedPointer< QgsMeasureTool > tool( new QgsMeasureTool( mCanvas, false ) ); @@ -117,7 +115,7 @@ void TestQgsMeasureTool::testLengthCalculation() QGSCOMPARENEAR( measured, expected, 0.001 ); // change project length unit, check calculation respects unit - QgsProject::instance()->writeEntry( "Measurement", "/DistanceUnits", QgsUnitTypes::encodeUnit( QgsUnitTypes::DistanceFeet ) ); + QgsProject::instance()->setDistanceUnits( QgsUnitTypes::DistanceFeet ); QScopedPointer< QgsMeasureTool > tool2( new QgsMeasureTool( mCanvas, false ) ); QScopedPointer< QgsMeasureDialog > dlg2( new QgsMeasureDialog( tool2.data() ) ); @@ -163,11 +161,9 @@ void TestQgsMeasureTool::testAreaCalculation() QgsCoordinateReferenceSystem srs( 3111, QgsCoordinateReferenceSystem::EpsgCrsId ); mCanvas->setCrsTransformEnabled( true ); mCanvas->setDestinationCrs( srs ); - QgsProject::instance()->writeEntry( "SpatialRefSys", "/ProjectCRSProj4String", srs.toProj4() ); - QgsProject::instance()->writeEntry( "SpatialRefSys", "/ProjectCRSID", ( int ) srs.srsid() ); - QgsProject::instance()->writeEntry( "SpatialRefSys", "/ProjectCrs", srs.authid() ); - QgsProject::instance()->writeEntry( "Measure", "/Ellipsoid", QString( "WGS84" ) ); - QgsProject::instance()->writeEntry( "Measurement", "/AreaUnits", QgsUnitTypes::encodeUnit( QgsUnitTypes::AreaSquareMeters ) ); + QgsProject::instance()->setCrs( srs ); + QgsProject::instance()->setEllipsoid( QString( "WGS84" ) ); + QgsProject::instance()->setAreaUnits( QgsUnitTypes::AreaSquareMeters ); // run length calculation QScopedPointer< QgsMeasureTool > tool( new QgsMeasureTool( mCanvas, true ) ); @@ -188,7 +184,7 @@ void TestQgsMeasureTool::testAreaCalculation() QGSCOMPARENEAR( measured, expected, 1.0 ); // change project area unit, check calculation respects unit - QgsProject::instance()->writeEntry( "Measurement", "/AreaUnits", QgsUnitTypes::encodeUnit( QgsUnitTypes::AreaSquareMiles ) ); + QgsProject::instance()->setAreaUnits( QgsUnitTypes::AreaSquareMiles ); QScopedPointer< QgsMeasureTool > tool2( new QgsMeasureTool( mCanvas, true ) ); QScopedPointer< QgsMeasureDialog > dlg2( new QgsMeasureDialog( tool2.data() ) ); diff --git a/tests/src/core/testqgsproject.cpp b/tests/src/core/testqgsproject.cpp index a8ae721fba54..1421360e6e79 100644 --- a/tests/src/core/testqgsproject.cpp +++ b/tests/src/core/testqgsproject.cpp @@ -104,7 +104,7 @@ void TestQgsProject::testProjectUnits() QCOMPARE( prj->distanceUnits(), QgsUnitTypes::DistanceFeet ); //test setting new units for project - prj->writeEntry( "Measurement", "/DistanceUnits", QgsUnitTypes::encodeUnit( QgsUnitTypes::DistanceNauticalMiles ) ); + prj->setDistanceUnits( QgsUnitTypes::DistanceNauticalMiles ); QCOMPARE( prj->distanceUnits(), QgsUnitTypes::DistanceNauticalMiles ); // AREA @@ -121,7 +121,7 @@ void TestQgsProject::testProjectUnits() QCOMPARE( prj->areaUnits(), QgsUnitTypes::AreaSquareYards ); //test setting new units for project - prj->writeEntry( "Measurement", "/AreaUnits", QgsUnitTypes::encodeUnit( QgsUnitTypes::AreaAcres ) ); + prj->setAreaUnits( QgsUnitTypes::AreaAcres ); QCOMPARE( prj->areaUnits(), QgsUnitTypes::AreaAcres ); } diff --git a/tests/src/python/test_qgsproject.py b/tests/src/python/test_qgsproject.py index 9ef08523a997..9e79d01fa663 100644 --- a/tests/src/python/test_qgsproject.py +++ b/tests/src/python/test_qgsproject.py @@ -16,7 +16,7 @@ import qgis # NOQA -from qgis.core import QgsProject, QgsMessageLog +from qgis.core import QgsProject, QgsMessageLog, QgsUnitTypes, QgsCoordinateReferenceSystem from qgis.testing import start_app, unittest @@ -111,5 +111,34 @@ def test_makeKeyTokens_(self): def catchMessage(self): self.messageCaught = True + def testCrs(self): + prj = QgsProject.instance() + prj.clear() + + self.assertFalse(prj.crs().isValid()) + prj.setCrs(QgsCoordinateReferenceSystem.fromOgcWmsCrs('EPSG:3111')) + self.assertEqual(prj.crs().authid(), 'EPSG:3111') + + def testEllipsoid(self): + prj = QgsProject.instance() + prj.clear() + + prj.setEllipsoid('WGS84') + self.assertEqual(prj.ellipsoid(), 'WGS84') + + def testDistanceUnits(self): + prj = QgsProject.instance() + prj.clear() + + prj.setDistanceUnits(QgsUnitTypes.DistanceFeet) + self.assertEqual(prj.distanceUnits(), QgsUnitTypes.DistanceFeet) + + def testAreaUnits(self): + prj = QgsProject.instance() + prj.clear() + + prj.setAreaUnits(QgsUnitTypes.AreaSquareFeet) + self.assertEqual(prj.areaUnits(), QgsUnitTypes.AreaSquareFeet) + if __name__ == '__main__': unittest.main()