Skip to content

Commit fae9256

Browse files
authoredSep 11, 2018
Merge pull request #7844 from m-kuhn/conversionFactor
QgsCoordinateTransform::scaleFactor()
2 parents d65bd5f + cf82c13 commit fae9256

File tree

5 files changed

+72
-8
lines changed

5 files changed

+72
-8
lines changed
 

‎python/core/auto_generated/qgscoordinatetransform.sip.in

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -356,6 +356,17 @@ This should be called whenever the srs database has
356356
been modified in order to ensure that outdated CRS transforms are not created.
357357

358358
.. versionadded:: 3.0
359+
%End
360+
361+
double scaleFactor( const QgsRectangle &referenceExtent ) const;
362+
%Docstring
363+
Computes an *estimated* conversion factor between source and destination units:
364+
365+
sourceUnits * scaleFactor = destinationUnits
366+
367+
:param referenceExtent: A reference extent based on which to perform the computation
368+
369+
.. versionadded:: 3.4
359370
%End
360371

361372
};

‎src/core/qgscoordinatetransform.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -798,3 +798,14 @@ void QgsCoordinateTransform::invalidateCache()
798798
sTransforms.clear();
799799
sCacheLock.unlock();
800800
}
801+
802+
double QgsCoordinateTransform::scaleFactor( const QgsRectangle &ReferenceExtent ) const
803+
{
804+
QgsPointXY source1( ReferenceExtent.xMinimum(), ReferenceExtent.yMinimum() );
805+
QgsPointXY source2( ReferenceExtent.xMaximum(), ReferenceExtent.yMaximum() );
806+
double distSourceUnits = std::sqrt( source1.sqrDist( source2 ) );
807+
QgsPointXY dest1 = transform( source1 );
808+
QgsPointXY dest2 = transform( source2 );
809+
double distDestUnits = std::sqrt( dest1.sqrDist( dest2 ) );
810+
return distDestUnits / distSourceUnits;
811+
}

‎src/core/qgscoordinatetransform.h

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,17 @@ class CORE_EXPORT QgsCoordinateTransform
405405
*/
406406
static void invalidateCache();
407407

408+
/**
409+
* Computes an *estimated* conversion factor between source and destination units:
410+
*
411+
* sourceUnits * scaleFactor = destinationUnits
412+
*
413+
* \param referenceExtent A reference extent based on which to perform the computation
414+
*
415+
* \since QGIS 3.4
416+
*/
417+
double scaleFactor( const QgsRectangle &referenceExtent ) const;
418+
408419
private:
409420

410421
mutable QExplicitlySharedDataPointer<QgsCoordinateTransformPrivate> d;

‎src/core/qgsmapsettings.cpp

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -396,14 +396,7 @@ QgsCoordinateTransform QgsMapSettings::layerTransform( const QgsMapLayer *layer
396396

397397
double QgsMapSettings::layerToMapUnits( const QgsMapLayer *layer, const QgsRectangle &referenceExtent ) const
398398
{
399-
QgsRectangle extent = referenceExtent.isEmpty() ? layer->extent() : referenceExtent;
400-
QgsPointXY l1( extent.xMinimum(), extent.yMinimum() );
401-
QgsPointXY l2( extent.xMaximum(), extent.yMaximum() );
402-
double distLayerUnits = std::sqrt( l1.sqrDist( l2 ) );
403-
QgsPointXY m1 = layerToMapCoordinates( layer, l1 );
404-
QgsPointXY m2 = layerToMapCoordinates( layer, l2 );
405-
double distMapUnits = std::sqrt( m1.sqrDist( m2 ) );
406-
return distMapUnits / distLayerUnits;
399+
return layerTransform( layer ).scaleFactor( referenceExtent );
407400
}
408401

409402

‎tests/src/core/testqgscoordinatetransform.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,8 @@ class TestQgsCoordinateTransform: public QObject
3636
void isValid();
3737
void isShortCircuited();
3838
void contextShared();
39+
void scaleFactor();
40+
void scaleFactor_data();
3941

4042
private:
4143

@@ -213,6 +215,42 @@ void TestQgsCoordinateTransform::contextShared()
213215
QCOMPARE( copy2.sourceDestinationDatumTransforms(), expected );
214216
}
215217

218+
void TestQgsCoordinateTransform::scaleFactor()
219+
{
220+
QFETCH( QgsCoordinateReferenceSystem, sourceCrs );
221+
QFETCH( QgsCoordinateReferenceSystem, destCrs );
222+
QFETCH( QgsRectangle, rect );
223+
QFETCH( double, factor );
224+
225+
QgsCoordinateTransform ct( sourceCrs, destCrs, QgsProject::instance() );
226+
227+
// qDebug() << QString::number(ct.scaleFactor( rect ), 'g', 17) ;
228+
QVERIFY( qgsDoubleNear( ct.scaleFactor( rect ), factor ) );
229+
}
230+
231+
void TestQgsCoordinateTransform::scaleFactor_data()
232+
{
233+
QTest::addColumn<QgsCoordinateReferenceSystem>( "sourceCrs" );
234+
QTest::addColumn<QgsCoordinateReferenceSystem>( "destCrs" );
235+
QTest::addColumn<QgsRectangle>( "rect" );
236+
QTest::addColumn<double>( "factor" );
237+
238+
QTest::newRow( "Different map units" )
239+
<< QgsCoordinateReferenceSystem::fromEpsgId( 2056 )
240+
<< QgsCoordinateReferenceSystem::fromEpsgId( 4326 )
241+
<< QgsRectangle( 2550000, 1200000, 2550100, 1200100 )
242+
<< 1.1223316038381985e-5;
243+
QTest::newRow( "Same map units" )
244+
<< QgsCoordinateReferenceSystem::fromEpsgId( 2056 )
245+
<< QgsCoordinateReferenceSystem::fromEpsgId( 21781 )
246+
<< QgsRectangle( 2550000, 1200000, 2550100, 1200100 )
247+
<< 1.0000000000248837;
248+
QTest::newRow( "Same CRS" )
249+
<< QgsCoordinateReferenceSystem::fromEpsgId( 2056 )
250+
<< QgsCoordinateReferenceSystem::fromEpsgId( 2056 )
251+
<< QgsRectangle( 2550000, 1200000, 2550100, 1200100 )
252+
<< 1.0;
253+
}
216254

217255
void TestQgsCoordinateTransform::transformBoundingBox()
218256
{

0 commit comments

Comments
 (0)
Please sign in to comment.