예제 #1
0
    def testStepSize(self):
        ml = QgsMeshLayer(
            os.path.join(unitTestDataPath(), '3d', 'elev_mesh.2dm'), 'mdal',
            'mdal')
        self.assertTrue(ml.isValid())
        ml.setCrs(QgsCoordinateReferenceSystem('EPSG:27700'))

        curve = QgsLineString()
        curve.fromWkt(
            'LineString (-348095.18706532847136259 6633687.0235139261931181, -347271.57799367723055184 6633093.13086318597197533, -346140.60267287614988163 6632697.89590711053460836, -345777.013075890194159 6631575.50219972990453243)'
        )
        req = QgsProfileRequest(curve)
        # set a smaller step size then would be automatically calculated
        req.setStepDistance(10)

        # set correct crs for linestring and re-try
        req.setCrs(QgsCoordinateReferenceSystem('EPSG:3857'))
        generator = ml.createProfileGenerator(req)
        self.assertTrue(generator.generateProfile())

        r = generator.takeResults()
        results = r.distanceToHeightMap()
        self.assertEqual(len(results), 216)
        first_point = min(results.keys())
        last_point = max(results.keys())
        self.assertAlmostEqual(results[first_point], 152.87405434310168, 0)
        self.assertAlmostEqual(results[last_point], 98.78085001573021, 0)

        self.assertAlmostEqual(r.zRange().lower(), 80, 2)
        self.assertAlmostEqual(r.zRange().upper(), 152.874, 0)
    def testIdentify(self):
        ml = QgsMeshLayer(os.path.join(unitTestDataPath(), '3d', 'elev_mesh.2dm'), 'mdal', 'mdal')
        self.assertTrue(ml.isValid())
        ml.setCrs(QgsCoordinateReferenceSystem('EPSG:27700'))

        curve = QgsLineString()
        curve.fromWkt('LineString (321621.3770066662109457 129734.87810317709227093, 321894.21278918092139065 129858.49142702402605209)')
        req = QgsProfileRequest(curve)

        generator = ml.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(), ml)
        self.assertEqual(res[0].results(), [{'distance': 0.0, 'elevation': 71.8236528075051}])

        context.maximumSurfaceDistanceDelta = 0
        context.maximumSurfaceElevationDelta = 5
        res = r.identify(QgsProfilePoint(200, 79), context)
        self.assertEqual(len(res), 1)
        self.assertEqual(res[0].layer(), ml)
        self.assertEqual(res[0].results(), [{'distance': 200.0, 'elevation': 75.84131736154015}])

        res = r.identify(QgsProfilePoint(200, 85), context)
        self.assertFalse(res)
    def testSnapping(self):
        ml = QgsMeshLayer(os.path.join(unitTestDataPath(), '3d', 'elev_mesh.2dm'), 'mdal', 'mdal')
        self.assertTrue(ml.isValid())
        ml.setCrs(QgsCoordinateReferenceSystem('EPSG:27700'))

        curve = QgsLineString()
        curve.fromWkt('LineString (321621.3770066662109457 129734.87810317709227093, 321894.21278918092139065 129858.49142702402605209)')
        req = QgsProfileRequest(curve)

        generator = ml.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.assertAlmostEqual(res.snappedPoint.elevation(), 71.8, 0)

        context.maximumSurfaceDistanceDelta = 0
        context.maximumSurfaceElevationDelta = 5
        res = r.snapPoint(QgsProfilePoint(200, 79), context)
        self.assertTrue(res.isValid())
        self.assertEqual(res.snappedPoint.distance(), 200)
        self.assertAlmostEqual(res.snappedPoint.elevation(), 75.841, 1)

        res = r.snapPoint(QgsProfilePoint(200, 85), context)
        self.assertFalse(res.isValid())
예제 #4
0
    def testMeshProvider(self):
        """
        Test QgsMeshTerrainProvider
        """
        provider = QgsMeshTerrainProvider()
        self.assertEqual(provider.type(), 'mesh')

        # without layer assigned
        self.assertFalse(provider.crs().isValid())
        self.assertTrue(math.isnan(provider.heightAt(1, 2)))

        # add mesh layer to project
        p = QgsProject()
        mesh_layer = QgsMeshLayer(
            os.path.join(unitTestDataPath(), '3d', 'elev_mesh.2dm'), 'mdal',
            'mdal')
        mesh_layer.setCrs(QgsCoordinateReferenceSystem('EPSG:27700'))
        self.assertTrue(mesh_layer.isValid())
        p.addMapLayer(mesh_layer)

        provider.setLayer(mesh_layer)
        self.assertEqual(provider.layer(), mesh_layer)
        self.assertEqual(provider.crs().authid(), 'EPSG:27700')

        self.assertTrue(math.isnan(provider.heightAt(1, 2)))
        self.assertAlmostEqual(provider.heightAt(321695.2, 129990.5),
                               89.49743150684921, 5)

        provider.setOffset(5)
        self.assertEqual(provider.offset(), 5)
        provider.setScale(3)
        self.assertEqual(provider.scale(), 3)

        clone = provider.clone()
        self.assertIsInstance(clone, QgsMeshTerrainProvider)
        self.assertEqual(clone.layer(), mesh_layer)
        self.assertEqual(clone.offset(), 5)
        self.assertEqual(clone.scale(), 3)

        # via xml
        doc = QDomDocument("testdoc")

        context = QgsReadWriteContext()
        parent_elem = doc.createElement('test')
        element = provider.writeXml(doc, context)
        parent_elem.appendChild(element)

        from_xml = QgsMeshTerrainProvider()
        self.assertTrue(from_xml.readXml(parent_elem, context))

        self.assertEqual(from_xml.offset(), 5)
        self.assertEqual(from_xml.scale(), 3)

        # layer won't be resolved till we resolve references from project
        self.assertFalse(from_xml.layer())
        from_xml.resolveReferences(p)
        self.assertEqual(from_xml.layer(), mesh_layer)

        # test equals
        provider1 = QgsMeshTerrainProvider()
        provider2 = QgsMeshTerrainProvider()
        self.assertTrue(provider1.equals(provider2))
        self.assertFalse(provider1.equals(QgsFlatTerrainProvider()))
        provider1.setOffset(1)
        self.assertFalse(provider1.equals(provider2))
        provider2.setOffset(1)
        self.assertTrue(provider1.equals(provider2))
        provider1.setScale(11)
        self.assertFalse(provider1.equals(provider2))
        provider2.setScale(11)
        self.assertTrue(provider1.equals(provider2))
        provider1.setLayer(mesh_layer)
        self.assertFalse(provider1.equals(provider2))
        provider2.setLayer(mesh_layer)
        self.assertTrue(provider1.equals(provider2))