QList< QList< int > > QgsCoordinateTransform::datumTransformations( const QgsCoordinateReferenceSystem& srcCRS, const QgsCoordinateReferenceSystem& destCRS ) { QList< QList< int > > transformations; QString srcGeoId = srcCRS.geographicCRSAuthId(); QString destGeoId = destCRS.geographicCRSAuthId(); if ( srcGeoId.isEmpty() || destGeoId.isEmpty() ) { return transformations; } QStringList srcSplit = srcGeoId.split( ":" ); QStringList destSplit = destGeoId.split( ":" ); if ( srcSplit.size() < 2 || destSplit.size() < 2 ) { return transformations; } int srcAuthCode = srcSplit.at( 1 ).toInt(); int destAuthCode = destSplit.at( 1 ).toInt(); if ( srcAuthCode == destAuthCode ) { return transformations; //crs have the same datum } QList<int> directTransforms; searchDatumTransform( QString( "SELECT coord_op_code FROM tbl_datum_transform WHERE source_crs_code = %1 AND target_crs_code = %2" ).arg( srcAuthCode ).arg( destAuthCode ), directTransforms ); QList<int> srcToWgs84; searchDatumTransform( QString( "SELECT coord_op_code FROM tbl_datum_transform WHERE ( source_crs_code = %1 AND target_crs_code = %2 ) OR ( source_crs_code = %2 AND target_crs_code = %1 )" ).arg( srcAuthCode ).arg( 4326 ), srcToWgs84 ); QList<int> destToWgs84; searchDatumTransform( QString( "SELECT coord_op_code FROM tbl_datum_transform WHERE ( source_crs_code = %1 AND target_crs_code = %2 ) OR ( source_crs_code = %2 AND target_crs_code = %1 )" ).arg( destAuthCode ).arg( 4326 ), destToWgs84 ); //add direct datum transformations QList<int>::const_iterator directIt = directTransforms.constBegin(); for ( ; directIt != directTransforms.constEnd(); ++directIt ) { transformations.push_back( QList<int>() << *directIt << -1 ); } QList<int>::const_iterator srcWgsIt = srcToWgs84.constBegin(); for ( ; srcWgsIt != srcToWgs84.constEnd(); ++srcWgsIt ) { QList<int>::const_iterator dstWgsIt = destToWgs84.constBegin(); for ( ; dstWgsIt != destToWgs84.constEnd(); ++dstWgsIt ) { transformations.push_back( QList<int>() << *srcWgsIt << *dstWgsIt ); } } return transformations; }
QList< QList< int > > QgsCoordinateTransform::datumTransformations( const QgsCoordinateReferenceSystem& srcCRS, const QgsCoordinateReferenceSystem& destCRS ) { QList< QList< int > > transformations; QString srcGeoId = srcCRS.geographicCRSAuthId(); QString destGeoId = destCRS.geographicCRSAuthId(); if ( srcGeoId.isEmpty() || destGeoId.isEmpty() ) { return transformations; } QStringList srcSplit = srcGeoId.split( ":" ); QStringList destSplit = destGeoId.split( ":" ); if ( srcSplit.size() < 2 || destSplit.size() < 2 ) { return transformations; } int srcAuthCode = srcSplit.at( 1 ).toInt(); int destAuthCode = destSplit.at( 1 ).toInt(); if ( srcAuthCode == destAuthCode || srcAuthCode == 0 || destAuthCode == 0) { return transformations; //crs have the same datum or no datum } QList<int> directTransforms; searchDatumTransform( QString( "SELECT coord_op_code FROM tbl_datum_transform WHERE source_crs_code=%1 AND target_crs_code=%2" ).arg( srcAuthCode ).arg( destAuthCode ), directTransforms ); QList<int> reverseDirectTransforms; searchDatumTransform( QString( "SELECT coord_op_code FROM tbl_datum_transform WHERE source_crs_code = %1 AND target_crs_code=%2" ).arg( destAuthCode ).arg( srcAuthCode ), reverseDirectTransforms ); //concatenated tranforms QList< QList< int > > concatenatedTransforms; searchDatumTransform2( QString( "SELECT src.coord_op_code, dest.coord_op_code FROM ") + QString( "(SELECT coord_op_code, target_crs_code FROM tbl_datum_transform WHERE source_crs_code=%1) as src " ).arg( srcAuthCode ) + QString( "INNER JOIN ") + QString( "(SELECT coord_op_code, target_crs_code FROM tbl_datum_transform WHERE source_crs_code=%2) as dest " ).arg( destAuthCode ) + QString( "ON src.target_crs_code=dest.target_crs_code ;" ), concatenatedTransforms ); //add direct datum transformations QList<int>::const_iterator directIt = directTransforms.constBegin(); for ( ; directIt != directTransforms.constEnd(); ++directIt ) { transformations.push_back( QList<int>() << *directIt << -1 ); } //add direct datum transformations directIt = reverseDirectTransforms.constBegin(); for ( ; directIt != reverseDirectTransforms.constEnd(); ++directIt ) { transformations.push_back( QList<int>() << -1 << *directIt ); } //append concatenated datum transformations transformations.append( concatenatedTransforms ); return transformations; }