def testCalculateSourceDest(self):
        context = QgsCoordinateTransformContext()

        #empty context
        self.assertEqual(
            context.calculateDatumTransforms(
                QgsCoordinateReferenceSystem('EPSG:3111'),
                QgsCoordinateReferenceSystem('EPSG:4283')),
            QgsCoordinateTransform.TransformPair(-1, -1))

        #add specific source/dest pair - should take precedence
        context.addSourceDestinationDatumTransform(
            QgsCoordinateReferenceSystem('EPSG:28356'),
            QgsCoordinateReferenceSystem('EPSG:4283'), 3, 4)
        self.assertEqual(
            context.calculateDatumTransforms(
                QgsCoordinateReferenceSystem('EPSG:28356'),
                QgsCoordinateReferenceSystem('EPSG:4283')),
            QgsCoordinateTransform.TransformPair(3, 4))
        self.assertEqual(
            context.calculateDatumTransforms(
                QgsCoordinateReferenceSystem('EPSG:3111'),
                QgsCoordinateReferenceSystem('EPSG:4283')),
            QgsCoordinateTransform.TransformPair(-1, -1))
        self.assertEqual(
            context.calculateDatumTransforms(
                QgsCoordinateReferenceSystem('EPSG:28356'),
                QgsCoordinateReferenceSystem('EPSG:3111')),
            QgsCoordinateTransform.TransformPair(-1, -1))
        # check that reverse transforms are automatically supported
        self.assertEqual(
            context.calculateDatumTransforms(
                QgsCoordinateReferenceSystem('EPSG:4283'),
                QgsCoordinateReferenceSystem('EPSG:28356')),
            QgsCoordinateTransform.TransformPair(4, 3))
    def testReadWriteSettings(self):
        context = QgsCoordinateTransformContext()
        context.readSettings()

        source_id_1 = QgsCoordinateTransform.datumTransformations(
            QgsCoordinateReferenceSystem(4204),
            QgsCoordinateReferenceSystem(4326))[0].sourceTransformId
        dest_id_1 = QgsCoordinateTransform.datumTransformations(
            QgsCoordinateReferenceSystem(4204),
            QgsCoordinateReferenceSystem(4326))[0].destinationTransformId

        source_id_2 = QgsCoordinateTransform.datumTransformations(
            QgsCoordinateReferenceSystem(4205),
            QgsCoordinateReferenceSystem(4326))[0].sourceTransformId
        dest_id_2 = QgsCoordinateTransform.datumTransformations(
            QgsCoordinateReferenceSystem(4205),
            QgsCoordinateReferenceSystem(4326))[0].destinationTransformId

        # should be empty
        self.assertEqual(context.sourceDestinationDatumTransforms(), {})

        self.assertTrue(
            context.addSourceDestinationDatumTransform(
                QgsCoordinateReferenceSystem('EPSG:4204'),
                QgsCoordinateReferenceSystem('EPSG:4326'), source_id_1,
                dest_id_1))
        self.assertTrue(
            context.addSourceDestinationDatumTransform(
                QgsCoordinateReferenceSystem('EPSG:4205'),
                QgsCoordinateReferenceSystem(4326), source_id_2, dest_id_2))

        self.assertEqual(
            context.sourceDestinationDatumTransforms(), {
                ('EPSG:4204', 'EPSG:4326'):
                QgsCoordinateTransform.TransformPair(source_id_1, dest_id_1),
                ('EPSG:4205', 'EPSG:4326'):
                QgsCoordinateTransform.TransformPair(source_id_2, dest_id_2)
            })

        # save to settings
        context.writeSettings()

        # restore from settings
        context2 = QgsCoordinateTransformContext()
        self.assertEqual(context2.sourceDestinationDatumTransforms(), {})
        context2.readSettings()

        # check result
        self.assertEqual(
            context2.sourceDestinationDatumTransforms(), {
                ('EPSG:4204', 'EPSG:4326'):
                QgsCoordinateTransform.TransformPair(source_id_1, dest_id_1),
                ('EPSG:4205', 'EPSG:4326'):
                QgsCoordinateTransform.TransformPair(source_id_2, dest_id_2)
            })
    def testWriteReadXml(self):
        # setup a context
        context = QgsCoordinateTransformContext()

        source_id_1 = QgsCoordinateTransform.datumTransformations(
            QgsCoordinateReferenceSystem(4204),
            QgsCoordinateReferenceSystem(4326))[0].sourceTransformId
        dest_id_1 = QgsCoordinateTransform.datumTransformations(
            QgsCoordinateReferenceSystem(4204),
            QgsCoordinateReferenceSystem(4326))[0].destinationTransformId

        source_id_2 = QgsCoordinateTransform.datumTransformations(
            QgsCoordinateReferenceSystem(4205),
            QgsCoordinateReferenceSystem(4326))[0].sourceTransformId
        dest_id_2 = QgsCoordinateTransform.datumTransformations(
            QgsCoordinateReferenceSystem(4205),
            QgsCoordinateReferenceSystem(4326))[0].destinationTransformId

        self.assertTrue(
            context.addSourceDestinationDatumTransform(
                QgsCoordinateReferenceSystem(4204),
                QgsCoordinateReferenceSystem(4326), source_id_1, dest_id_1))
        self.assertTrue(
            context.addSourceDestinationDatumTransform(
                QgsCoordinateReferenceSystem(4205),
                QgsCoordinateReferenceSystem(4326), source_id_2, dest_id_2))

        self.assertEqual(
            context.sourceDestinationDatumTransforms(), {
                ('EPSG:4204', 'EPSG:4326'):
                QgsCoordinateTransform.TransformPair(source_id_1, dest_id_1),
                ('EPSG:4205', 'EPSG:4326'):
                QgsCoordinateTransform.TransformPair(source_id_2, dest_id_2)
            })

        # save to xml
        doc = QDomDocument("testdoc")
        elem = doc.createElement("test")
        context.writeXml(elem, QgsReadWriteContext())

        # restore from xml
        context2 = QgsCoordinateTransformContext()
        context2.readXml(elem, QgsReadWriteContext())

        # check result
        self.assertEqual(
            context2.sourceDestinationDatumTransforms(), {
                ('EPSG:4204', 'EPSG:4326'):
                QgsCoordinateTransform.TransformPair(source_id_1, dest_id_1),
                ('EPSG:4205', 'EPSG:4326'):
                QgsCoordinateTransform.TransformPair(source_id_2, dest_id_2)
            })
 def testProject(self):
     """
     Test project's transform context
     """
     project = QgsProject()
     context_changed_spy = QSignalSpy(project.transformContextChanged)
     context = project.transformContext()
     context.addSourceDestinationDatumTransform(
         QgsCoordinateReferenceSystem('EPSG:3111'),
         QgsCoordinateReferenceSystem('EPSG:4283'), 1, 2)
     project.setTransformContext(context)
     self.assertEqual(len(context_changed_spy), 1)
     self.assertEqual(
         project.transformContext().sourceDestinationDatumTransforms(), {
             ('EPSG:3111', 'EPSG:4283'):
             QgsCoordinateTransform.TransformPair(1, 2)
         })
    def testSourceDestinationDatumTransforms(self):
        context = QgsCoordinateTransformContext()
        self.assertEqual(context.sourceDestinationDatumTransforms(), {})
        self.assertFalse(
            context.hasTransform(QgsCoordinateReferenceSystem('EPSG:3111'),
                                 QgsCoordinateReferenceSystem('EPSG:4283')))
        self.assertTrue(
            context.addSourceDestinationDatumTransform(
                QgsCoordinateReferenceSystem('EPSG:3111'),
                QgsCoordinateReferenceSystem('EPSG:4283'), 1, 2))
        self.assertTrue(
            context.hasTransform(QgsCoordinateReferenceSystem('EPSG:3111'),
                                 QgsCoordinateReferenceSystem('EPSG:4283')))
        self.assertFalse(
            context.hasTransform(QgsCoordinateReferenceSystem('EPSG:3111'),
                                 QgsCoordinateReferenceSystem('EPSG:4326')))
        self.assertFalse(
            context.hasTransform(QgsCoordinateReferenceSystem('EPSG:3113'),
                                 QgsCoordinateReferenceSystem('EPSG:4283')))
        self.assertEqual(context.sourceDestinationDatumTransforms(), {
            ('EPSG:3111', 'EPSG:4283'):
            QgsCoordinateTransform.TransformPair(1, 2)
        })
        self.assertTrue(
            context.addSourceDestinationDatumTransform(
                QgsCoordinateReferenceSystem('EPSG:28356'),
                QgsCoordinateReferenceSystem(4283), 3, 4))
        self.assertEqual(
            context.sourceDestinationDatumTransforms(), {
                ('EPSG:3111', 'EPSG:4283'):
                QgsCoordinateTransform.TransformPair(1, 2),
                ('EPSG:28356', 'EPSG:4283'):
                QgsCoordinateTransform.TransformPair(3, 4)
            })
        self.assertTrue(
            context.addSourceDestinationDatumTransform(
                QgsCoordinateReferenceSystem('EPSG:28356'),
                QgsCoordinateReferenceSystem(28357), 7, 8))
        self.assertEqual(
            context.sourceDestinationDatumTransforms(), {
                ('EPSG:3111', 'EPSG:4283'):
                QgsCoordinateTransform.TransformPair(1, 2),
                ('EPSG:28356', 'EPSG:4283'):
                QgsCoordinateTransform.TransformPair(3, 4),
                ('EPSG:28356', 'EPSG:28357'):
                QgsCoordinateTransform.TransformPair(7, 8)
            })
        self.assertTrue(
            context.addSourceDestinationDatumTransform(
                QgsCoordinateReferenceSystem('EPSG:28356'),
                QgsCoordinateReferenceSystem('EPSG:28357'), 9, 11))
        self.assertEqual(
            context.sourceDestinationDatumTransforms(), {
                ('EPSG:3111', 'EPSG:4283'):
                QgsCoordinateTransform.TransformPair(1, 2),
                ('EPSG:28356', 'EPSG:4283'):
                QgsCoordinateTransform.TransformPair(3, 4),
                ('EPSG:28356', 'EPSG:28357'):
                QgsCoordinateTransform.TransformPair(9, 11)
            })

        # invalid additions
        self.assertFalse(
            context.addSourceDestinationDatumTransform(
                QgsCoordinateReferenceSystem(),
                QgsCoordinateReferenceSystem('EPSG:28357'), 9, 11))
        self.assertEqual(
            context.sourceDestinationDatumTransforms(), {
                ('EPSG:3111', 'EPSG:4283'):
                QgsCoordinateTransform.TransformPair(1, 2),
                ('EPSG:28356', 'EPSG:4283'):
                QgsCoordinateTransform.TransformPair(3, 4),
                ('EPSG:28356', 'EPSG:28357'):
                QgsCoordinateTransform.TransformPair(9, 11)
            })
        self.assertFalse(
            context.addSourceDestinationDatumTransform(
                QgsCoordinateReferenceSystem('EPSG:3111'),
                QgsCoordinateReferenceSystem(), 9, 11))
        self.assertEqual(
            context.sourceDestinationDatumTransforms(), {
                ('EPSG:3111', 'EPSG:4283'):
                QgsCoordinateTransform.TransformPair(1, 2),
                ('EPSG:28356', 'EPSG:4283'):
                QgsCoordinateTransform.TransformPair(3, 4),
                ('EPSG:28356', 'EPSG:28357'):
                QgsCoordinateTransform.TransformPair(9, 11)
            })

        # indicate no transform required
        self.assertTrue(
            context.addSourceDestinationDatumTransform(
                QgsCoordinateReferenceSystem(28357),
                QgsCoordinateReferenceSystem(28356), -1, -1))
        self.assertEqual(
            context.sourceDestinationDatumTransforms(), {
                ('EPSG:3111', 'EPSG:4283'):
                QgsCoordinateTransform.TransformPair(1, 2),
                ('EPSG:28356', 'EPSG:4283'):
                QgsCoordinateTransform.TransformPair(3, 4),
                ('EPSG:28356', 'EPSG:28357'):
                QgsCoordinateTransform.TransformPair(9, 11),
                ('EPSG:28357', 'EPSG:28356'):
                QgsCoordinateTransform.TransformPair(-1, -1)
            })
        self.assertTrue(
            context.addSourceDestinationDatumTransform(
                QgsCoordinateReferenceSystem(3111),
                QgsCoordinateReferenceSystem(28356), 17, -1))
        self.assertEqual(
            context.sourceDestinationDatumTransforms(), {
                ('EPSG:3111', 'EPSG:4283'):
                QgsCoordinateTransform.TransformPair(1, 2),
                ('EPSG:28356', 'EPSG:4283'):
                QgsCoordinateTransform.TransformPair(3, 4),
                ('EPSG:28356', 'EPSG:28357'):
                QgsCoordinateTransform.TransformPair(9, 11),
                ('EPSG:28357', 'EPSG:28356'):
                QgsCoordinateTransform.TransformPair(-1, -1),
                ('EPSG:3111', 'EPSG:28356'):
                QgsCoordinateTransform.TransformPair(17, -1)
            })
        self.assertTrue(
            context.addSourceDestinationDatumTransform(
                QgsCoordinateReferenceSystem(3113),
                QgsCoordinateReferenceSystem(28356), -1, 18))
        self.assertEqual(
            context.sourceDestinationDatumTransforms(), {
                ('EPSG:3111', 'EPSG:4283'):
                QgsCoordinateTransform.TransformPair(1, 2),
                ('EPSG:28356', 'EPSG:4283'):
                QgsCoordinateTransform.TransformPair(3, 4),
                ('EPSG:28356', 'EPSG:28357'):
                QgsCoordinateTransform.TransformPair(9, 11),
                ('EPSG:28357', 'EPSG:28356'):
                QgsCoordinateTransform.TransformPair(-1, -1),
                ('EPSG:3111', 'EPSG:28356'):
                QgsCoordinateTransform.TransformPair(17, -1),
                ('EPSG:3113', 'EPSG:28356'):
                QgsCoordinateTransform.TransformPair(-1, 18)
            })
        # remove non-existing
        context.removeSourceDestinationDatumTransform(
            QgsCoordinateReferenceSystem(3113),
            QgsCoordinateReferenceSystem(3111))
        self.assertEqual(
            context.sourceDestinationDatumTransforms(), {
                ('EPSG:3111', 'EPSG:4283'):
                QgsCoordinateTransform.TransformPair(1, 2),
                ('EPSG:28356', 'EPSG:4283'):
                QgsCoordinateTransform.TransformPair(3, 4),
                ('EPSG:28356', 'EPSG:28357'):
                QgsCoordinateTransform.TransformPair(9, 11),
                ('EPSG:28357', 'EPSG:28356'):
                QgsCoordinateTransform.TransformPair(-1, -1),
                ('EPSG:3111', 'EPSG:28356'):
                QgsCoordinateTransform.TransformPair(17, -1),
                ('EPSG:3113', 'EPSG:28356'):
                QgsCoordinateTransform.TransformPair(-1, 18)
            })

        # remove existing
        context.removeSourceDestinationDatumTransform(
            QgsCoordinateReferenceSystem(3111),
            QgsCoordinateReferenceSystem(4283))
        self.assertEqual(
            context.sourceDestinationDatumTransforms(), {
                ('EPSG:28356', 'EPSG:4283'):
                QgsCoordinateTransform.TransformPair(3, 4),
                ('EPSG:28356', 'EPSG:28357'):
                QgsCoordinateTransform.TransformPair(9, 11),
                ('EPSG:28357', 'EPSG:28356'):
                QgsCoordinateTransform.TransformPair(-1, -1),
                ('EPSG:3111', 'EPSG:28356'):
                QgsCoordinateTransform.TransformPair(17, -1),
                ('EPSG:3113', 'EPSG:28356'):
                QgsCoordinateTransform.TransformPair(-1, 18)
            })
        context.removeSourceDestinationDatumTransform(
            QgsCoordinateReferenceSystem(3111),
            QgsCoordinateReferenceSystem(28356))
        self.assertEqual(
            context.sourceDestinationDatumTransforms(), {
                ('EPSG:28356', 'EPSG:4283'):
                QgsCoordinateTransform.TransformPair(3, 4),
                ('EPSG:28356', 'EPSG:28357'):
                QgsCoordinateTransform.TransformPair(9, 11),
                ('EPSG:28357', 'EPSG:28356'):
                QgsCoordinateTransform.TransformPair(-1, -1),
                ('EPSG:3113', 'EPSG:28356'):
                QgsCoordinateTransform.TransformPair(-1, 18)
            })

        context.clear()
        self.assertEqual(context.sourceDestinationDatumTransforms(), {})