Exemple #1
0
    def testTrueNorth(self):
        """ test calculating bearing to true north"""

        # short circuit - already a geographic crs
        crs = QgsCoordinateReferenceSystem.fromEpsgId(4326)
        transformContext = QgsCoordinateTransformContext()

        self.assertEqual(QgsBearingUtils.bearingTrueNorth(crs, transformContext, QgsPointXY(0, 0)), 0)
        self.assertEqual(QgsBearingUtils.bearingTrueNorth(crs, transformContext, QgsPointXY(44, 0)), 0)
        self.assertEqual(QgsBearingUtils.bearingTrueNorth(crs, transformContext, QgsPointXY(44, -43)), 0)
        self.assertEqual(QgsBearingUtils.bearingTrueNorth(crs, transformContext, QgsPointXY(44, 43)), 0)

        self.assertEqual(QgsBearingUtils.bearingTrueNorth(crs, transformContext, QgsPointXY(44, 200)), 0)
        self.assertEqual(QgsBearingUtils.bearingTrueNorth(crs, transformContext, QgsPointXY(44, -200)), 0)

        # no short circuit
        crs = QgsCoordinateReferenceSystem.fromEpsgId(3111)
        self.assertAlmostEqual(QgsBearingUtils.bearingTrueNorth(crs, transformContext, QgsPointXY(2508807, 2423425)), 0.06, 2)

        # try a south-up crs
        crs = QgsCoordinateReferenceSystem.fromEpsgId(2053)
        self.assertAlmostEqual(QgsBearingUtils.bearingTrueNorth(crs, transformContext, QgsPointXY(29, -27.55)), -180.0, 1)

        # try a north pole crs
        crs = QgsCoordinateReferenceSystem.fromEpsgId(3575)
        self.assertAlmostEqual(QgsBearingUtils.bearingTrueNorth(crs, transformContext, QgsPointXY(-780770, 652329)), 129.9, 1)
        self.assertAlmostEqual(QgsBearingUtils.bearingTrueNorth(crs, transformContext, QgsPointXY(513480, 873173)), -149.5, 1)
Exemple #2
0
    def testTrueNorth(self):
        """ test calculating bearing to true north"""

        # short circuit - already a geographic crs
        crs = QgsCoordinateReferenceSystem.fromEpsgId(4326)
        self.assertEqual(QgsBearingUtils.bearingTrueNorth(crs, QgsPoint(0, 0)), 0)
        self.assertEqual(QgsBearingUtils.bearingTrueNorth(crs, QgsPoint(44, 0)), 0)
        self.assertEqual(QgsBearingUtils.bearingTrueNorth(crs, QgsPoint(44, -43)), 0)
        self.assertEqual(QgsBearingUtils.bearingTrueNorth(crs, QgsPoint(44, 43)), 0)

        self.assertEqual(QgsBearingUtils.bearingTrueNorth(crs, QgsPoint(44, 200)), 0)
        self.assertEqual(QgsBearingUtils.bearingTrueNorth(crs, QgsPoint(44, -200)), 0)

        # no short circuit
        crs = QgsCoordinateReferenceSystem.fromEpsgId(3111)
        self.assertAlmostEqual(QgsBearingUtils.bearingTrueNorth(crs, QgsPoint(2508807, 2423425)), 0.06, 2)

        # try a south-up crs
        crs = QgsCoordinateReferenceSystem.fromEpsgId(2053)
        self.assertAlmostEqual(QgsBearingUtils.bearingTrueNorth(crs, QgsPoint(29, -27.55)), -180.0, 1)

        # try a north pole crs
        crs = QgsCoordinateReferenceSystem.fromEpsgId(3575)
        self.assertAlmostEqual(QgsBearingUtils.bearingTrueNorth(crs, QgsPoint(-780770, 652329)), 129.9, 1)
        self.assertAlmostEqual(QgsBearingUtils.bearingTrueNorth(crs, QgsPoint(513480, 873173)), -149.5, 1)
Exemple #3
0
    def paint(self, painter, xxx, xxx2):
        """Paint north arrow on painter"""
        if self.svg.isValid():
            pos = self.set_position(self.corner,
                                    painter.device().width(),
                                    painter.device().height())

            rotation = QgsBearingUtils.bearingTrueNorth(
                self.canvas.mapSettings().destinationCrs(),
                self.canvas.mapSettings().transformContext(),
                self.canvas.extent().center())
            rotation += self.canvas.rotation()

            painter.save()
            painter.rotate(-rotation)  # To translate correctly
            painter.translate(pos.x(), pos.y())
            painter.rotate(
                rotation
            )  # To rotate north arrow along with canvas, always pointing north

            # do the drawing, and draw a smooth north arrow even when rotated
            rectangle = QRectF(-self.size.width() / 2, -self.size.height() / 2,
                               self.size.width(), self.size.height())
            self.svg.render(painter, rectangle)

            painter.restore()