Skip to content

Commit 47aed17

Browse files
committed
Copied ellipsoidal settings to project properties
1 parent e063c23 commit 47aed17

File tree

3 files changed

+256
-3
lines changed

3 files changed

+256
-3
lines changed

src/app/qgsprojectproperties.cpp

+191
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,8 @@
1919
#include "qgsprojectproperties.h"
2020

2121
//qgis includes
22+
#include "qgsapplication.h"
23+
#include "qgsdistancearea.h"
2224
#include "qgisapp.h"
2325
#include "qgscomposer.h"
2426
#include "qgscontexthelp.h"
@@ -50,6 +52,8 @@
5052
#include <QHeaderView> // Qt 4.4
5153
#include <QMessageBox>
5254

55+
const char * QgsProjectProperties::GEO_NONE_DESC = QT_TRANSLATE_NOOP( "QgsOptions", "None / Planimetric" );
56+
5357
//stdc++ includes
5458

5559
QgsProjectProperties::QgsProjectProperties( QgsMapCanvas* mapCanvas, QWidget *parent, Qt::WFlags fl )
@@ -63,6 +67,8 @@ QgsProjectProperties::QgsProjectProperties( QgsMapCanvas* mapCanvas, QWidget *pa
6367
connect( this, SIGNAL( accepted() ), this, SLOT( apply() ) );
6468
connect( projectionSelector, SIGNAL( sridSelected( QString ) ), this, SLOT( setMapUnitsToCurrentProjection() ) );
6569

70+
connect( cmbEllipsoid, SIGNAL( currentIndexChanged( int ) ), this, SLOT( updateEllipsoidUI( int ) ) );
71+
6672
///////////////////////////////////////////////////////////
6773
// Properties stored in map canvas's QgsMapRenderer
6874
// these ones are propagated to QgsProject by a signal
@@ -104,6 +110,34 @@ QgsProjectProperties::QgsProjectProperties( QgsMapCanvas* mapCanvas, QWidget *pa
104110

105111
cbxAbsolutePath->setCurrentIndex( QgsProject::instance()->readBoolEntry( "Paths", "/Absolute", true ) ? 0 : 1 );
106112

113+
// populate combo box with ellipsoids
114+
115+
QgsDebugMsg( "Setting upp ellipsoid" );
116+
117+
mEllipsoidIndex = 0;
118+
populateEllipsoidList();
119+
120+
// Reading ellipsoid from setttings
121+
QStringList mySplitEllipsoid = QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ).split( ':' );
122+
123+
int myIndex = 0;
124+
for ( int i = 0; i < mEllipsoidList.length(); i++ )
125+
{
126+
if ( mEllipsoidList[ i ].acronym.startsWith( mySplitEllipsoid[ 0 ] ) )
127+
{
128+
myIndex = i;
129+
break;
130+
}
131+
}
132+
// Update paramaters if present.
133+
if ( mySplitEllipsoid.length() >= 3 )
134+
{
135+
mEllipsoidList[ myIndex ].semiMajor = mySplitEllipsoid[ 1 ].toDouble();
136+
mEllipsoidList[ myIndex ].semiMinor = mySplitEllipsoid[ 2 ].toDouble();
137+
}
138+
139+
updateEllipsoidUI( myIndex );
140+
107141
int dp = QgsProject::instance()->readNumEntry( "PositionPrecision", "/DecimalPlaces" );
108142
spinBoxDP->setValue( dp );
109143

@@ -507,6 +541,26 @@ void QgsProjectProperties::apply()
507541

508542
QgsProject::instance()->writeEntry( "Paths", "/Absolute", cbxAbsolutePath->currentIndex() == 0 );
509543

544+
if ( mEllipsoidList[ mEllipsoidIndex ].acronym.startsWith( "PARAMETER" ) )
545+
{
546+
double major = mEllipsoidList[ mEllipsoidIndex ].semiMajor;
547+
double minor = mEllipsoidList[ mEllipsoidIndex ].semiMinor;
548+
// If the user fields have changed, use them instead.
549+
if ( leSemiMajor->isModified() || leSemiMinor->isModified() )
550+
{
551+
QgsDebugMsg( "Using paramteric major/minor" );
552+
major = QLocale::system().toDouble( leSemiMajor->text() );
553+
minor = QLocale::system().toDouble( leSemiMinor->text() );
554+
}
555+
QgsProject::instance()->writeEntry( "Measure", "/Ellipsoid", QString( "PARAMETER:%1:%2" )
556+
.arg( major, 0, 'g', 17 )
557+
.arg( minor, 0, 'g', 17 ) );
558+
}
559+
else
560+
{
561+
QgsProject::instance()->writeEntry( "Measure", "/Ellipsoid", mEllipsoidList[ mEllipsoidIndex ].acronym );
562+
}
563+
510564
//set the color for selections
511565
QColor myColor = pbnSelectionColor->color();
512566
QgsProject::instance()->writeEntry( "Gui", "/SelectionColorRedPart", myColor.red() );
@@ -773,6 +827,9 @@ void QgsProjectProperties::on_cbxProjectionEnabled_stateChanged( int state )
773827
mLayerSrsId = projectionSelector->selectedCrsId();
774828
projectionSelector->setSelectedCrsId( mProjectSrsId );
775829
}
830+
831+
// Enable/Disabel selector and update tool-tip
832+
updateEllipsoidUI( mEllipsoidIndex );
776833
}
777834

778835
void QgsProjectProperties::on_cbxWFSPublied_stateChanged( int aIdx )
@@ -1252,3 +1309,137 @@ void QgsProjectProperties::resetPythonMacros()
12521309
"def saveProject():\n pass\n\n" \
12531310
"def closeProject():\n pass\n" );
12541311
}
1312+
1313+
void QgsProjectProperties::populateEllipsoidList()
1314+
{
1315+
//
1316+
// Populate the ellipsoid list
1317+
//
1318+
sqlite3 *myDatabase;
1319+
const char *myTail;
1320+
sqlite3_stmt *myPreparedStatement;
1321+
int myResult;
1322+
EllipsoidDefs myItem, i;
1323+
1324+
myItem.acronym = GEO_NONE;
1325+
myItem.description = tr( GEO_NONE_DESC );
1326+
myItem.semiMajor = 0.0;
1327+
myItem.semiMinor = 0.0;
1328+
mEllipsoidList.append( myItem );
1329+
1330+
myItem.acronym = QString( "PARAMETER:6370997:6370997" );
1331+
myItem.description = tr( "Parameters :" );
1332+
myItem.semiMajor = 6370997.0;
1333+
myItem.semiMinor = 6370997.0;
1334+
mEllipsoidList.append( myItem );
1335+
1336+
//check the db is available
1337+
myResult = sqlite3_open_v2( QgsApplication::srsDbFilePath().toUtf8().data(), &myDatabase, SQLITE_OPEN_READONLY, NULL );
1338+
if ( myResult )
1339+
{
1340+
QgsDebugMsg( QString( "Can't open database: %1" ).arg( sqlite3_errmsg( myDatabase ) ) );
1341+
// XXX This will likely never happen since on open, sqlite creates the
1342+
// database if it does not exist.
1343+
Q_ASSERT( myResult == 0 );
1344+
}
1345+
1346+
// Set up the query to retrieve the projection information needed to populate the ELLIPSOID list
1347+
QString mySql = "select acronym, name, radius, parameter2 from tbl_ellipsoid order by name";
1348+
myResult = sqlite3_prepare( myDatabase, mySql.toUtf8(), mySql.toUtf8().length(), &myPreparedStatement, &myTail );
1349+
// XXX Need to free memory from the error msg if one is set
1350+
if ( myResult == SQLITE_OK )
1351+
{
1352+
while ( sqlite3_step( myPreparedStatement ) == SQLITE_ROW )
1353+
{
1354+
QString para1, para2;
1355+
myItem.acronym = ( const char * )sqlite3_column_text( myPreparedStatement, 0 );
1356+
myItem.description = ( const char * )sqlite3_column_text( myPreparedStatement, 1 );
1357+
1358+
// Copied from QgsDistanecArea. Should perhaps be moved there somehow?
1359+
// No error checking, this values are for show only, never used in calculations.
1360+
1361+
// Fall-back values
1362+
myItem.semiMajor = 0.0;
1363+
myItem.semiMinor = 0.0;
1364+
// Crash if no column?
1365+
para1 = ( const char * )sqlite3_column_text( myPreparedStatement, 2 );
1366+
para2 = ( const char * )sqlite3_column_text( myPreparedStatement, 3 );
1367+
myItem.semiMajor = para1.mid( 2 ).toDouble();
1368+
if ( para2.left( 2 ) == "b=" )
1369+
{
1370+
myItem.semiMinor = para2.mid( 2 ).toDouble();
1371+
}
1372+
else if ( para2.left( 3 ) == "rf=" )
1373+
{
1374+
double invFlattening = para2.mid( 3 ).toDouble();
1375+
if ( invFlattening != 0.0 )
1376+
{
1377+
myItem.semiMinor = myItem.semiMajor - ( myItem.semiMajor / invFlattening );
1378+
}
1379+
}
1380+
mEllipsoidList.append( myItem );
1381+
}
1382+
}
1383+
1384+
// close the sqlite3 statement
1385+
sqlite3_finalize( myPreparedStatement );
1386+
sqlite3_close( myDatabase );
1387+
1388+
// Add all items to selector
1389+
1390+
foreach ( i, mEllipsoidList )
1391+
{
1392+
cmbEllipsoid->addItem( i.description );
1393+
}
1394+
}
1395+
1396+
void QgsProjectProperties::updateEllipsoidUI( int newIndex )
1397+
{
1398+
// Called whenever settings change, adjusts the UI accordingly
1399+
// Pre-select current ellipsoid
1400+
1401+
// Check if CRS transformation is on, or else turn everything off
1402+
double myMajor = mEllipsoidList[ newIndex ].semiMajor;
1403+
double myMinor = mEllipsoidList[ newIndex ].semiMinor;
1404+
1405+
// If user has modified the radii (only possible if parametric!), before
1406+
// changing ellipsoid, save the modified coordinates
1407+
if ( leSemiMajor->isModified() || leSemiMinor->isModified() )
1408+
{
1409+
QgsDebugMsg( "Saving major/minor" );
1410+
mEllipsoidList[ mEllipsoidIndex ].semiMajor = QLocale::system().toDouble( leSemiMajor->text() );
1411+
mEllipsoidList[ mEllipsoidIndex ].semiMinor = QLocale::system().toDouble( leSemiMinor->text() );
1412+
}
1413+
1414+
mEllipsoidIndex = newIndex;
1415+
leSemiMajor->setEnabled( false );
1416+
leSemiMinor->setEnabled( false );
1417+
leSemiMajor->setText( "" );
1418+
leSemiMinor->setText( "" );
1419+
if ( cbxProjectionEnabled->isChecked() )
1420+
{
1421+
cmbEllipsoid->setEnabled( true );
1422+
cmbEllipsoid->setToolTip( "" );
1423+
if ( mEllipsoidList[ mEllipsoidIndex ].acronym.startsWith( "PARAMETER:" ) )
1424+
{
1425+
leSemiMajor->setEnabled( true );
1426+
leSemiMinor->setEnabled( true );
1427+
}
1428+
else
1429+
{
1430+
leSemiMajor->setToolTip( QString( "Select %1 from pull-down menu to adjust radii" ).arg( tr( "Parameters:" ) ) );
1431+
leSemiMinor->setToolTip( QString( "Select %1 from pull-down menu to adjust radii" ).arg( tr( "Parameters:" ) ) );
1432+
}
1433+
cmbEllipsoid->setCurrentIndex( mEllipsoidIndex ); // Not always necessary
1434+
if ( mEllipsoidList[ mEllipsoidIndex ].acronym != GEO_NONE )
1435+
{
1436+
leSemiMajor->setText( QLocale::system().toString( myMajor, 'f', 3 ) );
1437+
leSemiMinor->setText( QLocale::system().toString( myMinor, 'f', 3 ) );
1438+
}
1439+
}
1440+
else
1441+
{
1442+
cmbEllipsoid->setEnabled( false );
1443+
cmbEllipsoid->setToolTip( tr( "Can only use ellipsoidal calculations when CRS transformation is enabled" ) );
1444+
}
1445+
}

src/app/qgsprojectproperties.h

+23
Original file line numberDiff line numberDiff line change
@@ -153,6 +153,12 @@ class QgsProjectProperties : public QDialog, private Ui::QgsProjectPropertiesBas
153153
*/
154154
void setMapUnitsToCurrentProjection();
155155

156+
/* Update ComboBox accorindg to the selected new index
157+
* Also sets the new selected Ellipsoid.
158+
* @note added in 2.0
159+
*/
160+
void updateEllipsoidUI( int newIndex );
161+
156162
signals:
157163
//! Signal used to inform listeners that the mouse display precision may have changed
158164
void displayPrecisionChanged();
@@ -188,4 +194,21 @@ class QgsProjectProperties : public QDialog, private Ui::QgsProjectPropertiesBas
188194

189195
long mProjectSrsId;
190196
long mLayerSrsId;
197+
198+
// List for all ellispods, also None and Custom
199+
struct EllipsoidDefs
200+
{
201+
QString acronym;
202+
QString description;
203+
double semiMajor;
204+
double semiMinor;
205+
};
206+
QList<EllipsoidDefs> mEllipsoidList;
207+
int mEllipsoidIndex;
208+
209+
//! Populates list with ellipsoids from Sqlite3 db
210+
void populateEllipsoidList();
211+
212+
static const char * GEO_NONE_DESC;
213+
191214
};

src/ui/qgsprojectpropertiesbase.ui

+42-3
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,45 @@
197197
</widget>
198198
</item>
199199
<item row="1" column="0">
200+
<widget class="QGroupBox" name="btnGrpMeasureEllipsoid">
201+
<property name="title">
202+
<string>Measure tool</string>
203+
</property>
204+
<layout class="QGridLayout" name="gridLayoutMeasureTool">
205+
<item row="1" column="0" rowspan="2">
206+
<widget class="QLabel" name="textLabel1_8">
207+
<property name="text">
208+
<string>Ellipsoid for distance calculations</string>
209+
</property>
210+
</widget>
211+
</item>
212+
<item row="1" column="1" colspan="4">
213+
<widget class="QComboBox" name="cmbEllipsoid"/>
214+
</item>
215+
<item row="2" column="4">
216+
<widget class="QLineEdit" name="leSemiMinor"/>
217+
</item>
218+
<item row="2" column="3">
219+
<widget class="QLabel" name="label_42">
220+
<property name="text">
221+
<string>Semi-minor</string>
222+
</property>
223+
</widget>
224+
</item>
225+
<item row="2" column="2">
226+
<widget class="QLineEdit" name="leSemiMajor"/>
227+
</item>
228+
<item row="2" column="1">
229+
<widget class="QLabel" name="label_41">
230+
<property name="text">
231+
<string>Semi-major</string>
232+
</property>
233+
</widget>
234+
</item>
235+
</layout>
236+
</widget>
237+
</item>
238+
<item row="2" column="0">
200239
<widget class="QGroupBox" name="btnGrpMapUnits">
201240
<property name="toolTip">
202241
<string>Used when CRS transformation is turned off</string>
@@ -232,7 +271,7 @@
232271
</layout>
233272
</widget>
234273
</item>
235-
<item row="2" column="0">
274+
<item row="3" column="0">
236275
<widget class="QGroupBox" name="btnGrpDegreeDisplay">
237276
<property name="title">
238277
<string>Degree display</string>
@@ -262,7 +301,7 @@
262301
</layout>
263302
</widget>
264303
</item>
265-
<item row="3" column="0">
304+
<item row="4" column="0">
266305
<widget class="QGroupBox" name="btnGrpPrecision">
267306
<property name="title">
268307
<string>Precision</string>
@@ -326,7 +365,7 @@
326365
</layout>
327366
</widget>
328367
</item>
329-
<item row="4" column="0">
368+
<item row="5" column="0">
330369
<widget class="QGroupBox" name="grpProjectScales">
331370
<property name="title">
332371
<string>Project scales</string>

0 commit comments

Comments
 (0)