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)
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)
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()