Skip to content

Commit 3187352

Browse files
committedDec 15, 2017
Add method to retrieve datum transform ID from a proj string
1 parent 43d8a6b commit 3187352

File tree

6 files changed

+107
-1
lines changed

6 files changed

+107
-1
lines changed
 

‎python/core/qgscoordinatetransform.sip

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,9 +281,19 @@ Default constructor, creates an invalid QgsCoordinateTransform.
281281
Returns a proj string representing the specified ``datumTransformId`` datum transform ID.
282282
.. seealso:: :py:func:`datumTransformations()`
283283
.. seealso:: :py:func:`datumTransformInfo()`
284+
.. seealso:: :py:func:`projStringToDatumTransformId()`
284285
:rtype: str
285286
%End
286287

288+
static int projStringToDatumTransformId( const QString &string );
289+
%Docstring
290+
Returns the datum transform ID corresponding to a specified proj ``string``.
291+
Returns -1 if matching datum ID was not found.
292+
.. seealso:: :py:func:`datumTransformToProj()`
293+
.. versionadded:: 3.0
294+
:rtype: int
295+
%End
296+
287297
struct TransformInfo
288298
{
289299
int datumTransformId;

‎src/core/qgscoordinatetransform.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -816,6 +816,11 @@ QString QgsCoordinateTransform::datumTransformToProj( int datumTransform )
816816
return QgsCoordinateTransformPrivate::datumTransformString( datumTransform );
817817
}
818818

819+
int QgsCoordinateTransform::projStringToDatumTransformId( const QString &string )
820+
{
821+
return QgsCoordinateTransformPrivate::transformIdFromString( string );
822+
}
823+
819824
QgsCoordinateTransform::TransformInfo QgsCoordinateTransform::datumTransformInfo( int datumTransform )
820825
{
821826
TransformInfo info;

‎src/core/qgscoordinatetransform.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -363,9 +363,18 @@ class CORE_EXPORT QgsCoordinateTransform
363363
* Returns a proj string representing the specified \a datumTransformId datum transform ID.
364364
* \see datumTransformations()
365365
* \see datumTransformInfo()
366+
* \see projStringToDatumTransformId()
366367
*/
367368
static QString datumTransformToProj( int datumTransformId );
368369

370+
/**
371+
* Returns the datum transform ID corresponding to a specified proj \a string.
372+
* Returns -1 if matching datum ID was not found.
373+
* \see datumTransformToProj()
374+
* \since QGIS 3.0
375+
*/
376+
static int projStringToDatumTransformId( const QString &string );
377+
369378
/**
370379
* Contains datum transform information.
371380
* \since QGIS 3.0

‎src/core/qgscoordinatetransform_p.cpp

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,62 @@ QString QgsCoordinateTransformPrivate::datumTransformString( int datumTransform
341341
return transformString;
342342
}
343343

344+
int QgsCoordinateTransformPrivate::transformIdFromString( const QString &string )
345+
{
346+
sqlite3_database_unique_ptr database;
347+
int openResult = database.open_v2( QgsApplication::srsDatabaseFilePath(), SQLITE_OPEN_READONLY, nullptr );
348+
if ( openResult != SQLITE_OK )
349+
{
350+
return -1;
351+
}
352+
353+
sqlite3_statement_unique_ptr statement;
354+
QString sql = QStringLiteral( "SELECT coord_op_method_code,p1,p2,p3,p4,p5,p6,p7,coord_op_code FROM tbl_datum_transform" );
355+
int prepareRes;
356+
statement = database.prepare( sql, prepareRes );
357+
if ( prepareRes != SQLITE_OK )
358+
{
359+
return -1;
360+
}
361+
362+
while ( statement.step() == SQLITE_ROW )
363+
{
364+
QString transformString;
365+
//coord_op_methode_code
366+
int methodCode = statement.columnAsInt64( 0 );
367+
if ( methodCode == 9615 ) //ntv2
368+
{
369+
transformString = "+nadgrids=" + statement.columnAsText( 1 );
370+
}
371+
else if ( methodCode == 9603 || methodCode == 9606 || methodCode == 9607 )
372+
{
373+
transformString += QLatin1String( "+towgs84=" );
374+
double p1 = statement.columnAsDouble( 1 );
375+
double p2 = statement.columnAsDouble( 2 );
376+
double p3 = statement.columnAsDouble( 3 );
377+
double p4 = statement.columnAsDouble( 4 );
378+
double p5 = statement.columnAsDouble( 5 );
379+
double p6 = statement.columnAsDouble( 6 );
380+
double p7 = statement.columnAsDouble( 7 );
381+
if ( methodCode == 9603 ) //3 parameter transformation
382+
{
383+
transformString += QStringLiteral( "%1,%2,%3" ).arg( QString::number( p1 ), QString::number( p2 ), QString::number( p3 ) );
384+
}
385+
else //7 parameter transformation
386+
{
387+
transformString += QStringLiteral( "%1,%2,%3,%4,%5,%6,%7" ).arg( QString::number( p1 ), QString::number( p2 ), QString::number( p3 ), QString::number( p4 ), QString::number( p5 ), QString::number( p6 ), QString::number( p7 ) );
388+
}
389+
}
390+
391+
if ( transformString.compare( string, Qt::CaseInsensitive ) == 0 )
392+
{
393+
return statement.columnAsInt64( 8 );
394+
}
395+
}
396+
397+
return -1;
398+
}
399+
344400
void QgsCoordinateTransformPrivate::addNullGridShifts( QString &srcProjString, QString &destProjString,
345401
int sourceDatumTransform, int destinationDatumTransform ) const
346402
{

‎src/core/qgscoordinatetransform_p.h

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,20 @@ class QgsCoordinateTransformPrivate : public QSharedData
135135
QReadWriteLock mProjLock;
136136
QMap < uintptr_t, QPair< projPJ, projPJ > > mProjProjections;
137137

138-
static QString datumTransformString( int datumTransform );
138+
/**
139+
* Returns the proj transform string corresponding to a
140+
* datum transform ID.
141+
* \see transformIdFromString()
142+
*/
143+
static QString datumTransformString( int transformId );
144+
145+
/**
146+
* Attempts to match a proj datum transform string to a datum ID.
147+
* Returns -1 if datum ID was not found.
148+
* \see datumTransformString()
149+
* \since QGIS 3.0
150+
*/
151+
static int transformIdFromString( const QString &string );
139152

140153
private:
141154

‎tests/src/python/test_qgscoordinatetransform.py

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -218,6 +218,19 @@ def testTransformInfo(self):
218218
self.assertIn('EPSG:4326', [QgsCoordinateTransform.datumTransformInfo(t.destinationTransformId).destinationCrsAuthId for t in
219219
transforms])
220220

221+
def testStringToTransformId(self):
222+
"""
223+
Test converting proj strings to corresponding datum IDs
224+
"""
225+
self.assertEqual(QgsCoordinateTransform.projStringToDatumTransformId(''), -1)
226+
self.assertEqual(QgsCoordinateTransform.projStringToDatumTransformId('not'), -1)
227+
test_string = '+towgs84=-403,684,41'
228+
id = QgsCoordinateTransform.projStringToDatumTransformId(test_string)
229+
self.assertNotEqual(id, -1)
230+
string = QgsCoordinateTransform.datumTransformToProj(id)
231+
self.assertEqual(string, test_string)
232+
self.assertEqual(QgsCoordinateTransform.projStringToDatumTransformId(test_string.upper()), id)
233+
221234

222235
if __name__ == '__main__':
223236
unittest.main()

0 commit comments

Comments
 (0)
Please sign in to comment.