Skip to content

Commit 3d1b8ae

Browse files
committed
Implement logic for calculating datum transforms to use
1 parent 7af5545 commit 3d1b8ae

File tree

2 files changed

+62
-0
lines changed

2 files changed

+62
-0
lines changed

src/core/qgscoordinatetransformcontext.cpp

+16
Original file line numberDiff line numberDiff line change
@@ -129,5 +129,21 @@ bool QgsCoordinateTransformContext::addSourceDestinationDatumTransform( const Qg
129129

130130
QPair<int, int> QgsCoordinateTransformContext::calculateDatumTransforms( const QgsCoordinateReferenceSystem &source, const QgsCoordinateReferenceSystem &destination ) const
131131
{
132+
QString srcKey = source.authid();
133+
QString destKey = destination.authid();
132134

135+
d->mLock.lockForRead();
136+
// highest priority is exact match for source/dest pair
137+
QPair< int, int > res = d->mSourceDestDatumTransforms.value( qMakePair( srcKey, destKey ), qMakePair( -1, -1 ) );
138+
if ( res.first != -1 && res.second != -1 )
139+
{
140+
d->mLock.unlock();
141+
return res;
142+
}
143+
144+
// fallback to checking src and dest separately
145+
int srcTransform = d->mSourceDatumTransforms.value( srcKey, -1 );
146+
int destTransform = d->mDestDatumTransforms.value( destKey, -1 );
147+
d->mLock.unlock();
148+
return qMakePair( srcTransform, destTransform );
133149
}

tests/src/python/test_qgscoordinatetransformcontext.py

+46
Original file line numberDiff line numberDiff line change
@@ -134,6 +134,52 @@ def testSourceDestinationDatumTransforms(self):
134134
context.clear()
135135
self.assertEqual(context.sourceDestinationDatumTransforms(), {})
136136

137+
def testCalculate(self):
138+
context = QgsCoordinateTransformContext()
139+
140+
#empty context
141+
self.assertEqual(context.calculateDatumTransforms(QgsCoordinateReferenceSystem('EPSG:3111'),
142+
QgsCoordinateReferenceSystem('EPSG:4283')),
143+
(-1, -1))
144+
145+
#add src transform
146+
context.addSourceDatumTransform(QgsCoordinateReferenceSystem('EPSG:28356'), 1)
147+
self.assertEqual(context.calculateDatumTransforms(QgsCoordinateReferenceSystem('EPSG:3111'),
148+
QgsCoordinateReferenceSystem('EPSG:4283')),
149+
(-1, -1))
150+
self.assertEqual(context.calculateDatumTransforms(QgsCoordinateReferenceSystem('EPSG:28356'),
151+
QgsCoordinateReferenceSystem('EPSG:4283')),
152+
(1, -1))
153+
self.assertEqual(context.calculateDatumTransforms(QgsCoordinateReferenceSystem('EPSG:4283'),
154+
QgsCoordinateReferenceSystem('EPSG:28356')),
155+
(-1, -1))
156+
157+
#add dest transform
158+
context.addDestinationDatumTransform(QgsCoordinateReferenceSystem('EPSG:4283'), 2)
159+
self.assertEqual(context.calculateDatumTransforms(QgsCoordinateReferenceSystem('EPSG:3111'),
160+
QgsCoordinateReferenceSystem('EPSG:4326')),
161+
(-1, -1))
162+
self.assertEqual(context.calculateDatumTransforms(QgsCoordinateReferenceSystem('EPSG:3111'),
163+
QgsCoordinateReferenceSystem('EPSG:4283')),
164+
(-1, 2))
165+
self.assertEqual(context.calculateDatumTransforms(QgsCoordinateReferenceSystem('EPSG:4283'),
166+
QgsCoordinateReferenceSystem('EPSG:3111')),
167+
(-1, -1))
168+
169+
#add specific source/dest pair - should take precedence
170+
context.addSourceDestinationDatumTransform(QgsCoordinateReferenceSystem('EPSG:28356'),
171+
QgsCoordinateReferenceSystem('EPSG:4283'),
172+
3, 4)
173+
self.assertEqual(context.calculateDatumTransforms(QgsCoordinateReferenceSystem('EPSG:28356'),
174+
QgsCoordinateReferenceSystem('EPSG:4283')),
175+
(3, 4))
176+
self.assertEqual(context.calculateDatumTransforms(QgsCoordinateReferenceSystem('EPSG:3111'),
177+
QgsCoordinateReferenceSystem('EPSG:4283')),
178+
(-1, 2))
179+
self.assertEqual(context.calculateDatumTransforms(QgsCoordinateReferenceSystem('EPSG:28356'),
180+
QgsCoordinateReferenceSystem('EPSG:3111')),
181+
(1, -1))
182+
137183

138184
if __name__ == '__main__':
139185
unittest.main()

0 commit comments

Comments
 (0)