Exemple #1
0
    def getCrs(self, srid):
        if not self.has_spatial:
            return QgsCoordinateReferenceSystem()

        try:
            c = self._execute(None, "SELECT proj4text FROM spatial_ref_sys WHERE srid = '%d'" % srid)
        except DbError:
            return QgsCoordinateReferenceSystem()
        res = self._fetchone(c)
        self._close_cursor(c)
        if res is None:
            return QgsCoordinateReferenceSystem()

        proj4text = res[0]
        crs = QgsCoordinateReferenceSystem.fromProj(proj4text)
        return crs
Exemple #2
0
    def _recompute_area_radius_centroid(self):
        geometry = self.geometry
        crs = QgsCoordinateReferenceSystem.fromProj(self.crs)
        distance_area_calculator = QgsDistanceArea()
        distance_area_calculator.setSourceCrs(crs, QgsCoordinateTransformContext())
        if not crs.isGeographic():
            # we want to keep the same units as the coordinates
            # (and setEllipsoid will make measureArea return meters)
            distance_area_calculator.setEllipsoid("WGS84")

        # recompute area
        self._area = distance_area_calculator.measureArea(geometry)

        # recompute radius
        if self._area == 0:
            self._radius = 0
        else:
            self._radius = math.sqrt(self._area / math.pi)

        # recompute centroid
        centroid = geometry.centroid().asPoint()
        self._cx = centroid.x()
        self._cy = centroid.y()
Exemple #3
0
    def testCreateMemoryLayer(self):
        """
        Test QgsMemoryProviderUtils.createMemoryLayer()
        """

        # no fields
        layer = QgsMemoryProviderUtils.createMemoryLayer(
            'my name', QgsFields())
        self.assertTrue(layer.isValid())
        self.assertEqual(layer.name(), 'my name')
        self.assertTrue(layer.fields().isEmpty())

        # similar layers should have unique sources
        layer2 = QgsMemoryProviderUtils.createMemoryLayer(
            'my name', QgsFields())
        self.assertNotEqual(layer.source(), layer2.source())

        # geometry type
        layer = QgsMemoryProviderUtils.createMemoryLayer(
            'my name', QgsFields(), QgsWkbTypes.Point)
        self.assertTrue(layer.isValid())
        self.assertEqual(layer.wkbType(), QgsWkbTypes.Point)
        layer = QgsMemoryProviderUtils.createMemoryLayer(
            'my name', QgsFields(), QgsWkbTypes.PolygonZM)
        self.assertTrue(layer.isValid())
        self.assertEqual(layer.wkbType(), QgsWkbTypes.PolygonZM)

        # crs
        layer = QgsMemoryProviderUtils.createMemoryLayer(
            'my name', QgsFields(), QgsWkbTypes.PolygonZM,
            QgsCoordinateReferenceSystem.fromEpsgId(3111))
        self.assertTrue(layer.isValid())
        self.assertEqual(layer.wkbType(), QgsWkbTypes.PolygonZM)
        self.assertTrue(layer.crs().isValid())
        self.assertEqual(layer.crs().authid(), 'EPSG:3111')

        # custom CRS
        crs = QgsCoordinateReferenceSystem.fromProj(
            '+proj=qsc +lat_0=0 +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +units=m +no_defs'
        )
        layer = QgsMemoryProviderUtils.createMemoryLayer(
            'my name', QgsFields(), QgsWkbTypes.PolygonZM, crs)
        self.assertTrue(layer.isValid())
        self.assertTrue(layer.crs().isValid())
        self.assertEqual(
            layer.crs().toProj(),
            '+proj=qsc +lat_0=0 +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +units=m +no_defs +type=crs'
        )

        # clone it, just to check
        layer2 = layer.clone()
        self.assertEqual(
            layer2.crs().toProj(),
            '+proj=qsc +lat_0=0 +lon_0=0 +x_0=0 +y_0=0 +ellps=WGS84 +units=m +no_defs +type=crs'
        )

        # fields
        fields = QgsFields()
        fields.append(QgsField("string", QVariant.String))
        fields.append(QgsField("long", QVariant.LongLong))
        fields.append(QgsField("double", QVariant.Double))
        fields.append(QgsField("integer", QVariant.Int))
        fields.append(QgsField("date", QVariant.Date))
        fields.append(QgsField("datetime", QVariant.DateTime))
        fields.append(QgsField("time", QVariant.Time))
        fields.append(QgsField("#complex_name", QVariant.String))
        fields.append(QgsField("complex/name", QVariant.String))
        fields.append(QgsField("binaryfield", QVariant.ByteArray))
        fields.append(QgsField("boolfield", QVariant.Bool))
        fields.append(QgsField("vallist", QVariant.List, subType=QVariant.Int))
        fields.append(
            QgsField("stringlist",
                     QVariant.StringList,
                     subType=QVariant.String))
        fields.append(
            QgsField("stringlist2", QVariant.List, subType=QVariant.String))
        fields.append(
            QgsField("reallist", QVariant.List, subType=QVariant.Double))
        fields.append(
            QgsField("longlist", QVariant.List, subType=QVariant.LongLong))
        fields.append(QgsField("dict", QVariant.Map))

        layer = QgsMemoryProviderUtils.createMemoryLayer('my name', fields)
        self.assertTrue(layer.isValid())
        self.assertFalse(layer.fields().isEmpty())
        self.assertEqual(len(layer.fields()), len(fields))
        for i in range(len(fields)):
            self.assertEqual(layer.fields()[i].name(), fields[i].name())
            if layer.fields()[i].name() != 'stringlist2':
                self.assertEqual(layer.fields()[i].type(), fields[i].type())
            else:
                # we automatically convert List with String subtype to StringList, to match other data providers
                self.assertEqual(layer.fields()[i].type(), QVariant.StringList)
            self.assertEqual(layer.fields()[i].length(), fields[i].length())
            self.assertEqual(layer.fields()[i].precision(),
                             fields[i].precision(), fields[i].name())

        # unsupported field type
        fields = QgsFields()
        fields.append(QgsField("rect", QVariant.RectF))
        layer = QgsMemoryProviderUtils.createMemoryLayer('my name', fields)
        self.assertTrue(layer.isValid())
        self.assertFalse(layer.fields().isEmpty())
        self.assertEqual(layer.fields()[0].name(), 'rect')
        self.assertEqual(layer.fields()[0].type(),
                         QVariant.String)  # should be mapped to string

        # field precision
        fields = QgsFields()
        fields.append(QgsField("string", QVariant.String, len=10))
        fields.append(QgsField("long", QVariant.LongLong, len=6))
        fields.append(QgsField("double", QVariant.Double, len=10, prec=7))
        fields.append(QgsField("double2", QVariant.Double, len=-1, prec=-1))
        layer = QgsMemoryProviderUtils.createMemoryLayer('my name', fields)
        self.assertTrue(layer.isValid())
        self.assertFalse(layer.fields().isEmpty())
        self.assertEqual(len(layer.fields()), len(fields))
        for i in range(len(fields)):
            self.assertEqual(layer.fields()[i].name(), fields[i].name())
            self.assertEqual(layer.fields()[i].type(), fields[i].type())
            self.assertEqual(layer.fields()[i].length(), fields[i].length())
            self.assertEqual(layer.fields()[i].precision(),
                             fields[i].precision())
    def testWriteReadXmlProj6(self):
        # setup a context
        context = QgsCoordinateTransformContext()

        proj_1 = '+proj=pipeline +step +proj=axisswap +order=2,1 +step +proj=unitconvert +xy_in=deg +xy_out=rad +step +proj=push +v_3 +step +proj=cart +ellps=intl +step +proj=helmert +x=-18.944 +y=-379.364 +z=-24.063 +rx=-0.04 +ry=0.764 +rz=-6.431 +s=3.657 +convention=coordinate_frame +step +inv +proj=cart +ellps=WGS84 +step +proj=pop +v_3 +step +proj=unitconvert +xy_in=rad +xy_out=deg +step +proj=axisswap +order=2,1'
        proj_2 = '+proj=pipeline +step +proj=axisswap +order=2,1 +step +proj=unitconvert +xy_in=deg +xy_out=rad +step +proj=push +v_3 +step +proj=cart +ellps=intl +step +proj=helmert +x=-150 +y=-250 +z=-1 +step +inv +proj=cart +ellps=WGS84 +step +proj=pop +v_3 +step +proj=unitconvert +xy_in=rad +xy_out=deg +step +proj=axisswap +order=2,1'
        proj_3 = '+proj=pipeline +step +proj=axisswap +order=2,1'

        self.assertTrue(
            context.addCoordinateOperation(
                QgsCoordinateReferenceSystem('EPSG:4204'),
                QgsCoordinateReferenceSystem('EPSG:4326'), proj_1, True))
        self.assertTrue(
            context.addCoordinateOperation(
                QgsCoordinateReferenceSystem('EPSG:4205'),
                QgsCoordinateReferenceSystem('EPSG:4326'), proj_2, False))

        # also insert a crs with no authid available
        self.assertTrue(
            context.addCoordinateOperation(
                QgsCoordinateReferenceSystem.fromProj(
                    "+proj=longlat +a=6378137 +rf=298.25722356300003 +no_defs"
                ), QgsCoordinateReferenceSystem('EPSG:4326'), proj_3, False))

        self.assertEqual(
            context.coordinateOperations(), {
                ('EPSG:4204', 'EPSG:4326'): proj_1,
                ('EPSG:4205', 'EPSG:4326'): proj_2,
                ('', 'EPSG:4326'): proj_3
            })

        # 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.coordinateOperations(), {
                ('EPSG:4204', 'EPSG:4326'): proj_1,
                ('EPSG:4205', 'EPSG:4326'): proj_2,
                ('', 'EPSG:4326'): proj_3
            })
        self.assertEqual(
            context2.calculateCoordinateOperation(
                QgsCoordinateReferenceSystem.fromProj(
                    "+proj=longlat +a=6378137 +rf=298.25722356300003 +no_defs"
                ), QgsCoordinateReferenceSystem('EPSG:4326')),
            '+proj=pipeline +step +proj=axisswap +order=2,1')
        self.assertFalse(
            context2.mustReverseCoordinateOperation(
                QgsCoordinateReferenceSystem.fromProj(
                    "+proj=longlat +a=6378137 +rf=298.25722356300003 +no_defs"
                ), QgsCoordinateReferenceSystem('EPSG:4326')))
        self.assertEqual(
            context2.calculateCoordinateOperation(
                QgsCoordinateReferenceSystem('EPSG:4326'),
                QgsCoordinateReferenceSystem.fromProj(
                    "+proj=longlat +a=6378137 +rf=298.25722356300003 +no_defs")
            ), '+proj=pipeline +step +proj=axisswap +order=2,1')
        self.assertTrue(
            context2.mustReverseCoordinateOperation(
                QgsCoordinateReferenceSystem('EPSG:4326'),
                QgsCoordinateReferenceSystem.fromProj(
                    "+proj=longlat +a=6378137 +rf=298.25722356300003 +no_defs")
            ))
        self.assertTrue(
            context2.allowFallbackTransform(
                QgsCoordinateReferenceSystem('EPSG:4204'),
                QgsCoordinateReferenceSystem('EPSG:4326')))
        self.assertFalse(
            context2.allowFallbackTransform(
                QgsCoordinateReferenceSystem('EPSG:4205'),
                QgsCoordinateReferenceSystem('EPSG:4326')))