def testGenerationWithStepSize(self): rl = QgsRasterLayer(os.path.join(unitTestDataPath(), '3d', 'dtm.tif'), 'DTM') self.assertTrue(rl.isValid()) curve = QgsLineString() curve.fromWkt('LineString (-348095.18706532847136259 6633687.0235139261931181, -347271.57799367723055184 6633093.13086318597197533, -346140.60267287614988163 6632697.89590711053460836, -345777.013075890194159 6631575.50219972990453243)') req = QgsProfileRequest(curve) req.setStepDistance(10) generator = rl.createProfileGenerator(req) # not enabled for elevation self.assertIsNone(generator) rl.elevationProperties().setEnabled(True) generator = rl.createProfileGenerator(req) self.assertIsNotNone(generator) # the request did not have the crs of the linestring set, so the whole linestring falls outside the raster extent self.assertFalse(generator.generateProfile()) # set correct crs for linestring and re-try req.setCrs(QgsCoordinateReferenceSystem('EPSG:3857')) generator = rl.createProfileGenerator(req) self.assertTrue(generator.generateProfile()) r = generator.takeResults() results = r.distanceToHeightMap() self.assertEqual(len(results), 341) first_point = min(results.keys()) last_point = max(results.keys()) self.assertEqual(results[first_point], 154) self.assertEqual(results[last_point], 99) self.assertEqual(r.zRange().lower(), 74) self.assertEqual(r.zRange().upper(), 154)
def testIdentify(self): rl = QgsRasterLayer(os.path.join(unitTestDataPath(), '3d', 'dtm.tif'), 'DTM') self.assertTrue(rl.isValid()) rl.elevationProperties().setEnabled(True) curve = QgsLineString() curve.fromWkt('LineString (321621.3770066662109457 129734.87810317709227093, 321894.21278918092139065 129858.49142702402605209)') req = QgsProfileRequest(curve) generator = rl.createProfileGenerator(req) self.assertTrue(generator.generateProfile()) r = generator.takeResults() # try identifying context = QgsProfileIdentifyContext() res = r.identify(QgsProfilePoint(-10, -10), context) self.assertFalse(res) context.maximumSurfaceDistanceDelta = 0 context.maximumSurfaceElevationDelta = 3 context.maximumPointDistanceDelta = 0 context.maximumPointElevationDelta = 0 res = r.identify(QgsProfilePoint(0, 70), context) self.assertEqual(len(res), 1) self.assertEqual(res[0].layer(), rl) self.assertEqual(res[0].results(), [{'distance': 0.0, 'elevation': 72.0}]) context.maximumSurfaceDistanceDelta = 0 context.maximumSurfaceElevationDelta = 5 res = r.identify(QgsProfilePoint(200, 79), context) self.assertEqual(len(res), 1) self.assertEqual(res[0].layer(), rl) self.assertEqual(res[0].results(), [{'distance': 200.0, 'elevation': 75.0}]) res = r.identify(QgsProfilePoint(200, 85), context) self.assertFalse(res)
def testSnapping(self): rl = QgsRasterLayer(os.path.join(unitTestDataPath(), '3d', 'dtm.tif'), 'DTM') self.assertTrue(rl.isValid()) rl.elevationProperties().setEnabled(True) curve = QgsLineString() curve.fromWkt('LineString (321621.3770066662109457 129734.87810317709227093, 321894.21278918092139065 129858.49142702402605209)') req = QgsProfileRequest(curve) generator = rl.createProfileGenerator(req) self.assertTrue(generator.generateProfile()) r = generator.takeResults() # try snapping some points context = QgsProfileSnapContext() res = r.snapPoint(QgsProfilePoint(-10, -10), context) self.assertFalse(res.isValid()) context.maximumSurfaceDistanceDelta = 0 context.maximumSurfaceElevationDelta = 3 context.maximumPointDistanceDelta = 0 context.maximumPointElevationDelta = 0 res = r.snapPoint(QgsProfilePoint(0, 70), context) self.assertTrue(res.isValid()) self.assertEqual(res.snappedPoint.distance(), 0) self.assertEqual(res.snappedPoint.elevation(), 72) context.maximumSurfaceDistanceDelta = 0 context.maximumSurfaceElevationDelta = 5 res = r.snapPoint(QgsProfilePoint(200, 79), context) self.assertTrue(res.isValid()) self.assertEqual(res.snappedPoint.distance(), 200) self.assertEqual(res.snappedPoint.elevation(), 75) res = r.snapPoint(QgsProfilePoint(200, 85), context) self.assertFalse(res.isValid())