Пример #1
0
    def testPartCount(self):
        # Create rulebased style
        sym1 = QgsFillSymbol.createSimple({
            'color': '#fdbf6f',
            'outline_color': 'black'
        })

        renderer = QgsSingleSymbolRenderer(sym1)
        renderer.symbols(
            QgsRenderContext())[0].symbolLayers()[0].setDataDefinedProperty(
                QgsSymbolLayer.PropertyFillColor,
                QgsProperty.fromExpression(
                    'color_rgb( (@geometry_part_count - 1) * 200, 0, 0 )'))
        self.layer.setRenderer(renderer)

        # Setup rendering check
        renderchecker = QgsMultiRenderChecker()
        renderchecker.setMapSettings(self.mapsettings)
        renderchecker.setControlName('expected_geometry_part_count')
        result = renderchecker.runTest('part_geometry_part_count')

        self.assertTrue(result)
Пример #2
0
    def testSymbolColor(self):
        # Create rulebased style
        sym1 = QgsFillSymbol.createSimple({
            'color': '#ff0000',
            'outline_color': 'black'
        })

        renderer = QgsSingleSymbolRenderer(sym1)
        renderer.symbols(
            QgsRenderContext())[0].symbolLayers()[0].setDataDefinedProperty(
                QgsSymbolLayer.PropertyFillColor,
                QgsProperty.fromExpression(
                    'set_color_part( @symbol_color, \'value\', "Value" * 4)'))
        self.layer.setRenderer(renderer)

        # Setup rendering check
        renderchecker = QgsMultiRenderChecker()
        renderchecker.setMapSettings(self.mapsettings)
        renderchecker.setControlName('expected_symbol_color_variable')
        result = renderchecker.runTest('symbol_color_variable', 50)

        self.assertTrue(result)
Пример #3
0
    def testGettersSetters(self):
        """
        Basic getter/setter tests
        """
        c = QgsRenderContext()

        c.setTextRenderFormat(QgsRenderContext.TextFormatAlwaysText)
        self.assertEqual(c.textRenderFormat(),
                         QgsRenderContext.TextFormatAlwaysText)
        c.setTextRenderFormat(QgsRenderContext.TextFormatAlwaysOutlines)
        self.assertEqual(c.textRenderFormat(),
                         QgsRenderContext.TextFormatAlwaysOutlines)

        c.setMapExtent(QgsRectangle(1, 2, 3, 4))
        self.assertEqual(c.mapExtent(), QgsRectangle(1, 2, 3, 4))

        self.assertTrue(c.zRange().isInfinite())
        c.setZRange(QgsDoubleRange(1, 10))
        self.assertEqual(c.zRange(), QgsDoubleRange(1, 10))

        self.assertEqual(c.symbologyReferenceScale(), -1)
        c.setSymbologyReferenceScale(1000)
        self.assertEqual(c.symbologyReferenceScale(), 1000)

        self.assertTrue(c.outputSize().isEmpty())
        c.setOutputSize(QSize(100, 200))
        self.assertEqual(c.outputSize(), QSize(100, 200))

        self.assertEqual(c.devicePixelRatio(), 1)
        c.setDevicePixelRatio(2)
        self.assertEqual(c.devicePixelRatio(), 2)
        self.assertEqual(c.deviceOutputSize(), QSize(200, 400))

        c.setImageFormat(QImage.Format_Alpha8)
        self.assertEqual(c.imageFormat(), QImage.Format_Alpha8)

        # should have an invalid mapToPixel by default
        self.assertFalse(c.mapToPixel().isValid())
Пример #4
0
 def __select(self):
     """
     To select objects in multiples layers inside a selection rectangle
     """
     searchRect = QgsRectangle(self.first, self.last)
     for layer in self.canvas().layers():
         if not self.identified or layer.id() not in self.disabled():
             if layer.type(
             ) == QgsMapLayer.VectorLayer and layer.geometryType(
             ) in self.types:
                 renderer = layer.rendererV2()
                 context = QgsRenderContext()
                 if renderer:
                     renderer.startRender(context, layer.pendingFields())
                     self.request = QgsFeatureRequest()
                     self.request.setFilterRect(searchRect)
                     self.request.setFlags(QgsFeatureRequest.ExactIntersect)
                     fIds = []
                     for feature in layer.getFeatures(self.request):
                         try:
                             will = renderer.willRenderFeature(
                                 feature, context)
                         except:
                             try:
                                 will = renderer.willRenderFeature(feature)
                             except:
                                 self.__iface.messageBar().pushMessage(
                                     QCoreApplication.translate(
                                         "VDLTools", "Error"),
                                     "will renderer still not working",
                                     level=QgsMessageBar.CRITICAL,
                                     duration=0)
                                 return
                         if will:
                             fIds.append(feature.id())
                     renderer.stopRender(context)
                     layer.selectByIds(fIds)
     self.selectedSignal.emit()
Пример #5
0
    def testCalculateFeatureIntersectionGeometry(self):
        region = QgsMapClippingRegion(QgsGeometry.fromWkt('Polygon((0 0, 1 0, 1 1, 0 1, 0 0))'))
        region.setFeatureClip(QgsMapClippingRegion.FeatureClippingType.ClipToIntersection)
        region2 = QgsMapClippingRegion(QgsGeometry.fromWkt('Polygon((0 0, 0.1 0, 0.1 2, 0 2, 0 0))'))
        region2.setFeatureClip(QgsMapClippingRegion.FeatureClippingType.NoClipping)
        region3 = QgsMapClippingRegion(QgsGeometry.fromWkt('Polygon((0 0, 0.1 0, 0.1 2, 0 2, 0 0))'))
        region3.setFeatureClip(QgsMapClippingRegion.FeatureClippingType.ClipToIntersection)

        rc = QgsRenderContext()

        geom, should_clip = QgsMapClippingUtils.calculateFeatureIntersectionGeometry([], rc)
        self.assertFalse(should_clip)
        self.assertTrue(geom.isNull())

        geom, should_clip = QgsMapClippingUtils.calculateFeatureIntersectionGeometry([region], rc)
        geom.normalize()
        self.assertTrue(should_clip)
        self.assertEqual(geom.asWkt(1), 'Polygon ((0 0, 0 1, 1 1, 1 0, 0 0))')

        # region2 is a Intersects type clipping region, should not apply here
        geom, should_clip = QgsMapClippingUtils.calculateFeatureIntersectionGeometry([region2], rc)
        self.assertFalse(should_clip)
        self.assertTrue(geom.isNull())

        geom, should_clip = QgsMapClippingUtils.calculateFeatureIntersectionGeometry([region, region2], rc)
        self.assertTrue(should_clip)
        self.assertEqual(geom.asWkt(1), 'Polygon ((0 0, 1 0, 1 1, 0 1, 0 0))')

        geom, should_clip = QgsMapClippingUtils.calculateFeatureIntersectionGeometry([region, region2, region3], rc)
        geom.normalize()
        self.assertTrue(should_clip)
        self.assertEqual(geom.asWkt(1), 'Polygon ((0 0, 0 1, 0.1 1, 0.1 0, 0 0))')

        rc.setCoordinateTransform(QgsCoordinateTransform(QgsCoordinateReferenceSystem('EPSG:3857'), QgsCoordinateReferenceSystem('EPSG:4326'), QgsProject.instance()))
        geom, should_clip = QgsMapClippingUtils.calculateFeatureIntersectionGeometry([region, region3], rc)
        geom.normalize()
        self.assertTrue(should_clip)
        self.assertEqual(geom.asWkt(0), 'Polygon ((0 0, 0 111325, 11132 111325, 11132 0, 0 0))')
Пример #6
0
    def testSetPainterFlags(self):
        rc = QgsRenderContext()
        p = QPainter()
        im = QImage(1000, 600, QImage.Format_RGB32)
        p.begin(im)
        rc.setPainterFlagsUsingContext(p)
        self.assertFalse(p.testRenderHint(QPainter.Antialiasing))
        try:
            self.assertFalse(p.testRenderHint(QPainter.LosslessImageRendering))
        except AttributeError:
            pass

        rc.setPainter(p)
        rc.setFlag(QgsRenderContext.Antialiasing, True)
        rc.setFlag(QgsRenderContext.LosslessImageRendering, True)
        rc.setPainterFlagsUsingContext(p)
        self.assertTrue(p.testRenderHint(QPainter.Antialiasing))
        try:
            self.assertTrue(p.testRenderHint(QPainter.LosslessImageRendering))
        except AttributeError:
            pass

        p.end()
Пример #7
0
    def testGettersSetters(self):
        """
        Basic getter/setter tests
        """
        c = QgsRenderContext()

        c.setTextRenderFormat(QgsRenderContext.TextFormatAlwaysText)
        self.assertEqual(c.textRenderFormat(),
                         QgsRenderContext.TextFormatAlwaysText)
        c.setTextRenderFormat(QgsRenderContext.TextFormatAlwaysOutlines)
        self.assertEqual(c.textRenderFormat(),
                         QgsRenderContext.TextFormatAlwaysOutlines)

        c.setMapExtent(QgsRectangle(1, 2, 3, 4))
        self.assertEqual(c.mapExtent(), QgsRectangle(1, 2, 3, 4))

        self.assertTrue(c.zRange().isInfinite())
        c.setZRange(QgsDoubleRange(1, 10))
        self.assertEqual(c.zRange(), QgsDoubleRange(1, 10))

        self.assertEqual(c.symbologyReferenceScale(), -1)
        c.setSymbologyReferenceScale(1000)
        self.assertEqual(c.symbologyReferenceScale(), 1000)
Пример #8
0
    def testItemsInBounds(self):
        layer = QgsAnnotationLayer(
            'test',
            QgsAnnotationLayer.LayerOptions(
                QgsProject.instance().transformContext()))
        self.assertTrue(layer.isValid())

        item1uuid = layer.addItem(
            QgsAnnotationPolygonItem(
                QgsPolygon(
                    QgsLineString([
                        QgsPoint(12, 13),
                        QgsPoint(14, 13),
                        QgsPoint(14, 15),
                        QgsPoint(12, 13)
                    ]))))
        item2uuid = layer.addItem(
            QgsAnnotationLineItem(
                QgsLineString(
                    [QgsPoint(11, 13),
                     QgsPoint(12, 13),
                     QgsPoint(12, 150)])))
        item3uuid = layer.addItem(QgsAnnotationMarkerItem(QgsPoint(120, 13)))

        rc = QgsRenderContext()
        self.assertFalse(layer.itemsInBounds(QgsRectangle(-10, -10, -9, 9),
                                             rc))
        self.assertCountEqual(
            layer.itemsInBounds(QgsRectangle(12, 13, 14, 15), rc),
            [item1uuid, item2uuid])
        self.assertCountEqual(
            layer.itemsInBounds(QgsRectangle(12, 130, 14, 150), rc),
            [item2uuid])
        self.assertCountEqual(
            layer.itemsInBounds(QgsRectangle(110, 0, 120, 20), rc),
            [item3uuid])
Пример #9
0
    def on_click_Inici(self):
        llistaErrors = self.controlErrorsValida()
        if len(llistaErrors) != 0:
            llista = "Llista d'errors:\n\n"
            for i in range(0, len(llistaErrors)):
                llista += ("- " + llistaErrors[i] + '\n')
            QMessageBox.information(None, "Error", llista)
            return

        textBox = 'INICI DEL PROCÉS DE VALIDACIÓ:\n'
        textBox += 'Elminació dels vertex:'
        self.dlg.text_info.setText(textBox)
        self.MouText()
        QApplication.processEvents()
        conta_errors = 0
        self.barraEstat_processant()
        drop = 'DROP TABLE IF EXISTS "GTC_Update"."UpdateGTC_vertices_pgr";'
        try:
            cur.execute(drop)
            conn.commit()
        except Exception as e:
            print("ERROR drop vertexs GTC per actualitzar")
            self.barraEstat_connectat()
            print(e.message, e.args)
        textBox += '...OK\n'
        textBox += 'Creació d\'una nova topologia'
        self.dlg.text_info.setText(textBox)
        self.MouText()
        QApplication.processEvents()

        create = 'select pgr_createTopology(\'GTC_Update.UpdateGTC\', 0.001,clean:=true);'
        try:
            cur.execute(create)
            vec = cur.fetchall()
            conn.commit()
            if vec[0][0] != 'OK':
                QMessageBox.information(
                    None, "Error", "No s'ha creat la topologia correctament.")
                print(vec)
                return
        except Exception as e:
            self.barraEstat_connectat()
            print("ERROR create vertexs GTC per actualitzar")
            print(e.message, e.args)

        textBox += '...OK\n'
        textBox += 'Comprovació de la nova topologia'
        self.dlg.text_info.setText(textBox)
        self.MouText()
        QApplication.processEvents()

        create = 'SELECT pgr_analyzeGraph(\'GTC_Update.UpdateGTC\', 0.001);'
        try:
            cur.execute(create)
            vec = cur.fetchall()
            conn.commit()
            if vec[0][0] != 'OK':
                QMessageBox.information(
                    None, "Error", "S'ha detectat un error a la topologia.")
                self.barraEstat_connectat()
                return
        except Exception as e:
            self.barraEstat_connectat()
            print("ERROR create vertexs GTC per actualitzar")
            print(e.message, e.args)

        textBox += '...OK\n'
        textBox += 'Comprovació dels punts amb possibles errors: '
        self.dlg.text_info.setText(textBox)
        self.MouText()
        QApplication.processEvents()

        select = 'SELECT * FROM "GTC_Update"."UpdateGTC_vertices_pgr" WHERE chk = 1;'
        try:
            cur.execute(select)
            vec = cur.fetchall()
            conn.commit()
            if (len(vec) != 0):
                uri = QgsDataSourceUri()
                try:
                    uri.setConnection(host1, port1, nomBD1, usuari1, contra1)
                except:
                    print("Error a la connexio")

                select = 'SELECT * FROM "GTC_Update"."UpdateGTC_vertices_pgr" WHERE chk = 1'
                QApplication.processEvents()
                uri.setDataSource("", "(" + select + ")", "the_geom", "", "id")
                QApplication.processEvents()
                '''
                #    13.2 Es prepara el titol de la capa que apareixerà a la llegenda
                '''
                titol = "Nodes a revisar"
                vlayer = QgsVectorLayer(uri.uri(False), titol, "postgres")
                QApplication.processEvents()

                if vlayer.isValid():
                    symbols = vlayer.renderer().symbols(QgsRenderContext())
                    symbol = symbols[0]
                    '''S'afegeix el color a la nova entitat'''
                    symbol.setColor(QColor.fromRgb(255, 0, 0))
                    QgsProject.instance().addMapLayer(vlayer, False)
                    root = QgsProject.instance().layerTreeRoot()
                    myLayerNode = QgsLayerTreeLayer(vlayer)
                    root.insertChildNode(0, myLayerNode)
                    myLayerNode.setCustomProperty("showFeatureCount", False)
                    QApplication.processEvents()
                    ''''S'afegeix la capa a la pantalla'''
                    iface.mapCanvas().refresh()
                    #qgis.utils.iface.legendInterface().refreshLayerSymbology(vlayer)
                else:
                    print("No s'ha carregat la capa de punts")
                self.barraEstat_connectat()
                QApplication.processEvents()
                textBox += 'S\'ha(n) detectat ' + str(
                    len(vec)) + ' punt(s) amb possibles errades.\n'
                self.dlg.text_info.setText(textBox)
                self.MouText()
                QApplication.processEvents()
                return
        except Exception as e:
            self.barraEstat_connectat()
            print("ERROR create vertexs GTC per actualitzar")
            print(e.message[0].decode('utf8'), e.args)
            return

        textBox += 'No s\'han detectat errades.\n'
        textBox += 'Detecció de trams aïllats: '
        self.dlg.text_info.setText(textBox)
        self.MouText()
        QApplication.processEvents()

        select = 'SELECT a.* FROM "GTC_Update"."UpdateGTC" a, "GTC_Update"."UpdateGTC_vertices_pgr" b, "GTC_Update"."UpdateGTC_vertices_pgr" c WHERE a.source=b.id AND b.cnt=1 AND a.target=c.id AND c.cnt=1;'
        try:
            cur.execute(select)
            vec = cur.fetchall()
            conn.commit()
            if (len(vec) != 0):
                uri = QgsDataSourceUri()
                try:
                    uri.setConnection(host1, port1, nomBD1, usuari1, contra1)
                except:
                    print("Error a la connexio")

                select = 'SELECT a.* FROM "GTC_Update"."UpdateGTC" a, "GTC_Update"."UpdateGTC_vertices_pgr" b, "GTC_Update"."UpdateGTC_vertices_pgr" c WHERE a.source=b.id AND b.cnt=1 AND a.target=c.id AND c.cnt=1'
                QApplication.processEvents()
                uri.setDataSource("", "(" + select + ")", "the_geom", "", "id")
                QApplication.processEvents()
                '''
                #    13.2 Es prepara el titol de la capa que apareixerà a la llegenda
                '''
                titol = "Trams sense connectivitat a revisar"
                vlayer = QgsVectorLayer(uri.uri(False), titol, "postgres")
                QApplication.processEvents()

                if vlayer.isValid():
                    symbols = vlayer.renderer().symbols(QgsRenderContext())
                    symbol = symbols[0]
                    '''S'afegeix el color a la nova entitat'''
                    symbol.setColor(QColor.fromRgb(255, 0, 0))
                    symbol.setWidth(1)
                    QgsProject.instance().addMapLayer(vlayer, False)
                    root = QgsProject.instance().layerTreeRoot()
                    myLayerNode = QgsLayerTreeLayer(vlayer)
                    root.insertChildNode(0, myLayerNode)
                    myLayerNode.setCustomProperty("showFeatureCount", False)
                    QApplication.processEvents()
                    ''''S'afegeix la capa a la pantalla'''
                    iface.mapCanvas().refresh()
                    #qgis.utils.iface.legendInterface().refreshLayerSymbology(vlayer)
                else:
                    print("No s'ha carregat la capa de segments aïllats")
                self.barraEstat_connectat()
                QApplication.processEvents()
                textBox += 'S\'ha(n) detectat ' + str(
                    len(vec)) + ' tram(s) aïllat(s).\n'
                self.dlg.text_info.setText(textBox)
                self.MouText()
                QApplication.processEvents()
                return
        except Exception as e:
            self.barraEstat_connectat()
            print("ERROR Segments aillats")
            print(e.message, e.args)
            return

        textBox += 'No s\'han detectat segments aïllats.\n'
        self.dlg.text_info.setText(textBox)
        self.MouText()
        QApplication.processEvents()

        #==============================================
        #    1. LINIES AMB DOS PUNTS I CAMP SOURCE
        #==============================================
        self.barraEstat_processant()
        sql_xarxa = 'select distinct(R.id) id,R.source Vertex, camp from (select S."the_geom",S."id",st_x(st_startpoint(S."the_geom")),S."source",\'S\' camp from "GTC_Update"."UpdateGTC" S where (st_x(st_startpoint(S."the_geom")) not in (select st_x("GTC_Update"."UpdateGTC_vertices_pgr"."the_geom") from "GTC_Update"."UpdateGTC_vertices_pgr")) union '
        sql_xarxa += 'select S."the_geom",S."id",st_x(st_endpoint(S."the_geom")),S."target", \'T\' camp from "GTC_Update"."UpdateGTC" S where (st_x(st_endpoint(S."the_geom")) not in (select st_x("GTC_Update"."UpdateGTC_vertices_pgr"."the_geom") from "GTC_Update"."UpdateGTC_vertices_pgr" )) union '
        sql_xarxa += 'select S."the_geom",S."id",st_y(st_startpoint(S."the_geom")),S."source",\'S\' camp from "GTC_Update"."UpdateGTC" S where (st_y(st_startpoint(S."the_geom")) not in (select st_y("GTC_Update"."UpdateGTC_vertices_pgr"."the_geom") from "GTC_Update"."UpdateGTC_vertices_pgr" )) union '
        sql_xarxa += 'select S."the_geom",S."id",st_y(st_endpoint(S."the_geom")),S."target",\'T\' camp from "GTC_Update"."UpdateGTC" S where (st_y(st_endpoint(S."the_geom")) not in (select st_y("GTC_Update"."UpdateGTC_vertices_pgr"."the_geom") from "GTC_Update"."UpdateGTC_vertices_pgr" )))R where (ST_NPoints(R.the_geom)=2 and R.camp=\'S\') order by R.id,R.source;'
        #print sql_xarxa
        try:
            cur.execute(sql_xarxa)
            vec = cur.fetchall()
            conta_errors += len(vec)
            #print str(len(vec))
            for x in range(0, len(vec)):
                sql_1 = 'select "source","target" from "GTC_Update"."UpdateGTC" where "id"=' + str(
                    vec[x][0]) + ';'
                cur.execute(sql_1)
                vec2 = cur.fetchall()
                update = 'UPDATE "GTC_Update"."UpdateGTC" SET the_geom = ST_AddPoint(the_geom, (select "the_geom" from "GTC_Update"."UpdateGTC_vertices_pgr" where id=' + str(
                    vec2[0][1]) + '),1) WHERE "id"=' + str(vec[x][0]) + ';'
                cur.execute(update)
                conn.commit()
                update = 'UPDATE "GTC_Update"."UpdateGTC" SET the_geom = ST_RemovePoint(the_geom, 0) WHERE "id"=' + str(
                    vec[x][0]) + ';'
                cur.execute(update)
                conn.commit()
                update = 'UPDATE "GTC_Update"."UpdateGTC" SET the_geom = ST_AddPoint(the_geom, (select "the_geom" from "GTC_Update"."UpdateGTC_vertices_pgr" where id=' + str(
                    vec2[0][0]) + '),0) WHERE "id"=' + str(vec[x][0]) + ';'
                cur.execute(update)
                conn.commit()
                update = 'UPDATE "GTC_Update"."UpdateGTC" SET the_geom = ST_RemovePoint(the_geom, ST_NPoints(the_geom) - 1) WHERE "id"=' + str(
                    vec[x][0]) + ';'
                cur.execute(update)
                conn.commit()
        except Exception as e:
            print(e.message, e.args)
            print("ERROR SQL_XARXA")
        #==============================================
        #    2. LINIES AMB DOS PUNTS I CAMP TARGET
        #==============================================
        sql_xarxa = 'select distinct(R.id) id,R.source Vertex, camp from (select S."the_geom",S."id",st_x(st_startpoint(S."the_geom")),S."source",\'S\' camp from "GTC_Update"."UpdateGTC" S where (st_x(st_startpoint(S."the_geom")) not in (select st_x("GTC_Update"."UpdateGTC_vertices_pgr"."the_geom") from "GTC_Update"."UpdateGTC_vertices_pgr")) union '
        sql_xarxa += 'select S."the_geom",S."id",st_x(st_endpoint(S."the_geom")),S."target", \'T\' camp from "GTC_Update"."UpdateGTC" S where (st_x(st_endpoint(S."the_geom")) not in (select st_x("GTC_Update"."UpdateGTC_vertices_pgr"."the_geom") from "GTC_Update"."UpdateGTC_vertices_pgr" )) union '
        sql_xarxa += 'select S."the_geom",S."id",st_y(st_startpoint(S."the_geom")),S."source",\'S\' camp from "GTC_Update"."UpdateGTC" S where (st_y(st_startpoint(S."the_geom")) not in (select st_y("GTC_Update"."UpdateGTC_vertices_pgr"."the_geom") from "GTC_Update"."UpdateGTC_vertices_pgr" )) union '
        sql_xarxa += 'select S."the_geom",S."id",st_y(st_endpoint(S."the_geom")),S."target",\'T\' camp from "GTC_Update"."UpdateGTC" S where (st_y(st_endpoint(S."the_geom")) not in (select st_y("GTC_Update"."UpdateGTC_vertices_pgr"."the_geom") from "GTC_Update"."UpdateGTC_vertices_pgr" )))R where (ST_NPoints(R.the_geom)=2 and R.camp=\'T\') order by R.id,R.source;'
        #print sql_xarxa
        try:
            cur.execute(sql_xarxa)
            vec = cur.fetchall()
            conta_errors += len(vec)
            #print str(len(vec))
            for x in range(0, len(vec)):
                sql_1 = 'select "source","target" from "GTC_Update"."UpdateGTC" where "id"=' + str(
                    vec[x][0]) + ';'
                cur.execute(sql_1)
                vec2 = cur.fetchall()
                update = 'UPDATE "GTC_Update"."UpdateGTC" SET the_geom = ST_AddPoint(the_geom, (select "the_geom" from "GTC_Update"."UpdateGTC_vertices_pgr" where id=' + str(
                    vec2[0][0]) + '),0) WHERE "id"=' + str(vec[x][0]) + ';'
                cur.execute(update)
                conn.commit()
                update = 'UPDATE "GTC_Update"."UpdateGTC" SET the_geom = ST_RemovePoint(the_geom, ST_NPoints(the_geom) - 1) WHERE "id"=' + str(
                    vec[x][0]) + ';'
                cur.execute(update)
                conn.commit()
                update = 'UPDATE "GTC_Update"."UpdateGTC" SET the_geom = ST_AddPoint(the_geom, (select "the_geom" from "GTC_Update"."UpdateGTC_vertices_pgr" where id=' + str(
                    vec2[0][1]) + '),ST_NPoints(the_geom)) WHERE "id"=' + str(
                        vec[x][0]) + ';'
                cur.execute(update)
                conn.commit()
                update = 'UPDATE "GTC_Update"."UpdateGTC" SET the_geom = ST_RemovePoint(the_geom, 0) WHERE "id"=' + str(
                    vec[x][0]) + ';'
                cur.execute(update)
                conn.commit()
        except Exception as e:
            print(e.message, e.args)
            print("ERROR SQL_XARXA")

        #==============================================
        #    3. LINIES AMB MES DE DOS PUNTS I CAMP SOURCE
        #==============================================

        sql_xarxa = 'select distinct(R.id) id,R.source Vertex, camp from (select S."the_geom",S."id",st_x(st_startpoint(S."the_geom")),S."source",\'S\' camp from "GTC_Update"."UpdateGTC" S where (st_x(st_startpoint(S."the_geom")) not in (select st_x("GTC_Update"."UpdateGTC_vertices_pgr"."the_geom") from "GTC_Update"."UpdateGTC_vertices_pgr")) union '
        sql_xarxa += 'select S."the_geom",S."id",st_x(st_endpoint(S."the_geom")),S."target", \'T\' camp from "GTC_Update"."UpdateGTC" S where (st_x(st_endpoint(S."the_geom")) not in (select st_x("GTC_Update"."UpdateGTC_vertices_pgr"."the_geom") from "GTC_Update"."UpdateGTC_vertices_pgr" )) union '
        sql_xarxa += 'select S."the_geom",S."id",st_y(st_startpoint(S."the_geom")),S."source",\'S\' camp from "GTC_Update"."UpdateGTC" S where (st_y(st_startpoint(S."the_geom")) not in (select st_y("GTC_Update"."UpdateGTC_vertices_pgr"."the_geom") from "GTC_Update"."UpdateGTC_vertices_pgr" )) union '
        sql_xarxa += 'select S."the_geom",S."id",st_y(st_endpoint(S."the_geom")),S."target",\'T\' camp from "GTC_Update"."UpdateGTC" S where (st_y(st_endpoint(S."the_geom")) not in (select st_y("GTC_Update"."UpdateGTC_vertices_pgr"."the_geom") from "GTC_Update"."UpdateGTC_vertices_pgr" )))R where (ST_NPoints(R.the_geom)<>2 and R.camp=\'S\') order by R.id,R.source;'
        #print sql_xarxa
        try:
            cur.execute(sql_xarxa)
            vec = cur.fetchall()
            conta_errors += len(vec)
            #print str(len(vec))
            for x in range(0, len(vec)):
                sql_1 = 'select "source","target" from "GTC_Update"."UpdateGTC" where "id"=' + str(
                    vec[x][0]) + ';'
                cur.execute(sql_1)
                vec2 = cur.fetchall()
                update = 'UPDATE "GTC_Update"."UpdateGTC" SET the_geom = ST_RemovePoint(the_geom, 0) WHERE "id"=' + str(
                    vec[x][0]) + ';'
                cur.execute(update)
                conn.commit()
                update = 'UPDATE "GTC_Update"."UpdateGTC" SET the_geom = ST_AddPoint(the_geom, (select "the_geom" from "GTC_Update"."UpdateGTC_vertices_pgr" where id=' + str(
                    vec2[0][0]) + '),0) WHERE "id"=' + str(vec[x][0]) + ';'
                cur.execute(update)
                conn.commit()
        except Exception as e:
            print(e.message, e.args)
            print("ERROR SQL_XARXA")

        #==============================================
        #    4. LINIES AMB MES DE DOS PUNTS I CAMP TARGET
        #==============================================
        sql_xarxa = 'select distinct(R.id) id,R.source Vertex, camp from (select S."the_geom",S."id",st_x(st_startpoint(S."the_geom")),S."source",\'S\' camp from "GTC_Update"."UpdateGTC" S where (st_x(st_startpoint(S."the_geom")) not in (select st_x("GTC_Update"."UpdateGTC_vertices_pgr"."the_geom") from "GTC_Update"."UpdateGTC_vertices_pgr")) union '
        sql_xarxa += 'select S."the_geom",S."id",st_x(st_endpoint(S."the_geom")),S."target", \'T\' camp from "GTC_Update"."UpdateGTC" S where (st_x(st_endpoint(S."the_geom")) not in (select st_x("GTC_Update"."UpdateGTC_vertices_pgr"."the_geom") from "GTC_Update"."UpdateGTC_vertices_pgr" )) union '
        sql_xarxa += 'select S."the_geom",S."id",st_y(st_startpoint(S."the_geom")),S."source",\'S\' camp from "GTC_Update"."UpdateGTC" S where (st_y(st_startpoint(S."the_geom")) not in (select st_y("GTC_Update"."UpdateGTC_vertices_pgr"."the_geom") from "GTC_Update"."UpdateGTC_vertices_pgr" )) union '
        sql_xarxa += 'select S."the_geom",S."id",st_y(st_endpoint(S."the_geom")),S."target",\'T\' camp from "GTC_Update"."UpdateGTC" S where (st_y(st_endpoint(S."the_geom")) not in (select st_y("GTC_Update"."UpdateGTC_vertices_pgr"."the_geom") from "GTC_Update"."UpdateGTC_vertices_pgr" )))R where (ST_NPoints(R.the_geom)<>2 and R.camp=\'T\') order by R.id,R.source;'
        #print sql_xarxa
        try:
            cur.execute(sql_xarxa)
            vec = cur.fetchall()
            conta_errors += len(vec)
            #print str(len(vec))
            for x in range(0, len(vec)):
                sql_1 = 'select "source","target" from "GTC_Update"."UpdateGTC" where "id"=' + str(
                    vec[x][0]) + ';'
                cur.execute(sql_1)
                vec2 = cur.fetchall()
                update = 'UPDATE "GTC_Update"."UpdateGTC" SET the_geom = ST_RemovePoint(the_geom, ST_NPoints(the_geom) - 1) WHERE "id"=' + str(
                    vec[x][0]) + ';'
                cur.execute(update)
                conn.commit()
                update = 'UPDATE "GTC_Update"."UpdateGTC" SET the_geom = ST_AddPoint(the_geom, (select "the_geom" from "GTC_Update"."UpdateGTC_vertices_pgr" where id=' + str(
                    vec2[0][1]) + '),ST_NPoints(the_geom)) WHERE "id"=' + str(
                        vec[x][0]) + ';'
                cur.execute(update)
                conn.commit()

        except Exception as e:
            print(e.message, e.args)
            print("ERROR SQL_XARXA")

        if conta_errors != 0:
            llista = "Errors trobats i reparats:"
            llista += (' ' + str(conta_errors) + '\n')
        else:
            llista = "No s'han detectat errors\n"
        textBox += llista
        self.dlg.text_info.setText(textBox)
        self.MouText()

        #UPDATE CAMPS DE CONTROL
        update = 'UPDATE "GTC_Update"."ControlActualitzacio" set modificant = false, modificat=true, "horaModificacio" = NULL, "usuariModificador" = NULL;'

        try:
            cur.execute(update)
            conn.commit()
            html = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN" "http://www.w3.org/TR/REC-html40/strict.dtd"><html><head><meta name="qrichtext" content="1" /><style type="text/css">p, li { white-space: pre-wrap; }</style></head><body style=" font-family:\'MS Shell Dlg 2\'; font-size:10pt; font-weight:400; font-style:normal;"><div style=\"align:center\"><span style=\"background:#00FF00;font-size:14pt\">GRAF VALIDAT!<\span><\div></body></html>'
            self.dlg.text_info.insertHtml(html)
            self.MouText()
        except Exception as e:
            print(e.message, e.args)
            print(
                "ERROR update Control (modificant,modificat, paraula clau, timestamp"
            )

        self.barraEstat_connectat()
Пример #10
0
    def on_click_Carregar(self):
        global cur
        global conn
        global nomBD1
        global contra1
        global host1
        global port1
        global usuari1

        llistaErrors = self.controlErrorsCarrega()
        if len(llistaErrors) != 0:
            llista = "Llista d'errors:\n\n"
            for i in range(0, len(llistaErrors)):
                llista += ("- " + llistaErrors[i] + '\n')
            QMessageBox.information(None, "Error", llista)
            return

        select = 'select * from "GTC_Update"."ControlActualitzacio";'
        try:
            cur.execute(select)
            vec = cur.fetchall()
            conn.commit()
        except Exception as e:
            print(e.message, e.args)
            print("ERROR select Control")

        if (vec[0][0]):
            label = "Actualment s'està modificant el GTC.\nIntrodueix la paraula clau per carregar la capa."
            val = self.on_click_CarregarAux(label)
            if val == '':
                return
            comprovarParaulaClau = vec[0][3]
            if (comprovarParaulaClau != val):
                QMessageBox.information(None, "Error",
                                        "La paraula clau no és la correcta.")
                return
        else:
            label = "Actualment NO s'està modificant el GTC.\nIntrodueix la paraula clau per carregar la capa."
            val = self.on_click_CarregarAux(label)
            if val == '':
                return
            update = 'update "GTC_Update"."ControlActualitzacio" set "modificant" = true;\n'
            update += 'update "GTC_Update"."ControlActualitzacio" set "usuariModificador" = \'' + val + '\';\n'
            update += 'update "GTC_Update"."ControlActualitzacio" set "horaModificacio" = CURRENT_TIMESTAMP;'
            try:
                cur.execute(update)
                conn.commit()
            except Exception as e:
                print(e.message, e.args)
                print("ERROR update Control (modificant, paraula clau)")

            if (not vec[0][1]):
                create = 'drop table if exists "GTC_Update"."UpdateGTC";\n'
                create += 'create table "GTC_Update"."UpdateGTC" as (select * from "SegmentsXarxaCarrers" order by id);\n'
                create += 'ALTER TABLE "GTC_Update"."UpdateGTC" DROP COLUMN id;\n'
                create += 'ALTER TABLE "GTC_Update"."UpdateGTC" ADD COLUMN id serial;\n'
                create += 'ALTER TABLE "GTC_Update"."UpdateGTC" ADD PRIMARY KEY (id);\n'
                try:
                    cur.execute(create)
                    conn.commit()
                except Exception as e:
                    print("ERROR create GTC per actualitzar")
                    print(e.message.encode('utf8', 'strict'),
                          e.args.encode('utf8', 'strict'))

        select = 'select to_char("horaModificacio", \'DD/MM/YY HH24:MI\') from "GTC_Update"."ControlActualitzacio";'
        try:
            cur.execute(select)
            vec = cur.fetchall()
            conn.commit()
        except Exception as e:
            print(e.message, e.args)
            print("ERROR select Control")
        self.dlg.text_info.setText("Data de l'inici de la modificació: " +
                                   vec[0][0])

        uri = QgsDataSourceUri()
        try:
            uri.setConnection(host1, port1, nomBD1, usuari1, contra1)
        except Exception as e:
            print(e.message, e.args)
            print("Error a la connexió")

        sql_total = 'select * from "GTC_Update"."UpdateGTC" order by id'
        QApplication.processEvents()
        uri.setDataSource("GTC_Update", "UpdateGTC", "the_geom", "", "")
        QApplication.processEvents()
        '''
        #    13.2 Es prepara el titol de la capa que apareixerà a la llegenda
        '''
        titol = "UpdateGTC"
        vlayer = QgsVectorLayer(uri.uri(False), titol, "postgres")
        QApplication.processEvents()

        if vlayer.isValid():
            symbols = vlayer.renderer().symbols(QgsRenderContext())
            symbol = symbols[0]
            '''S'afegeix el color a la nova entitat'''
            symbol.setColor(QColor.fromRgb(0, 0, 0))
            QgsProject.instance().addMapLayer(vlayer, False)
            root = QgsProject.instance().layerTreeRoot()
            myLayerNode = QgsLayerTreeLayer(vlayer)
            root.insertChildNode(0, myLayerNode)
            myLayerNode.setCustomProperty("showFeatureCount", False)
            QApplication.processEvents()
            ''''S'afegeix la capa a la pantalla'''
            iface.mapCanvas().refresh()
            #qgis.utils.iface.legendInterface().refreshLayerSymbology(vlayer)
        else:
            print("No s'ha carregat la capa")
Пример #11
0
 def testTemporalState(self):
     rc = QgsRenderContext()
     self.assertEqual(rc.isTemporal(), False)
     self.assertIsNotNone(rc.temporalRange())
Пример #12
0
    def setGraduadedPalette(self, layer, field, setRender, nameLayer):
        renderer = layer.renderer()
        prop = QgsProperty()
        # Set arrows and node icon visibility (only when layer is opened)
        # Links icon visibility are assigned when style is applied in Utils
        if setRender:  # Just opened a layer
            # SimpleSymbol (first time)
            symbol = renderer.symbol()
            if symbol.type() == 1:  # line
                self.setArrowsVisibility(symbol, layer, prop, field)
            else:  # point
                self.setNodesVisibility(prop, symbol)
        else:
            # GraduatedSymbol (other times)
            symbols = renderer.symbols(QgsRenderContext())
            for symbol in symbols:
                if symbol.type() == 1:  # line
                    self.setArrowsVisibility(symbol, layer, prop, field)

        if "Flow" in layer.name():
            field = "abs(" + field + ")"

        # Set graduated colors
        if setRender:  # Just opened a layer
            # Has previous render saved?
            hasRender = False
            dictRend = self.Renders.get(self.Scenario)
            if dictRend is None:
                dictRend = self.Renders.get("Base")  # default
                if dictRend is not None:
                    ranges = dictRend.get(
                        self.getLayerPath(layer).replace(
                            "_" + self.Scenario + "_", "_Base_"))
                    if ranges is not None:
                        hasRender = True
            else:
                ranges = dictRend.get(self.getLayerPath(layer))
                if ranges is not None:
                    hasRender = True
                else:
                    dictRend = self.Renders.get("Base")  # default
                    if dictRend is not None:
                        ranges = dictRend.get(
                            self.getLayerPath(layer).replace(
                                "_" + self.Scenario + "_", "_Base_"))
                        if ranges is not None:
                            hasRender = True

            # Apply render
            if hasRender:
                renderer = QgsGraduatedSymbolRenderer(field, ranges)
            else:
                ranges = self.getColorClasses(symbol, nameLayer)
                if len(ranges) > 0:
                    renderer = QgsGraduatedSymbolRenderer(field, ranges)
                else:
                    mode = QgsGraduatedSymbolRenderer.EqualInterval  # Quantile
                    classes = 5
                    ramp = {
                        'color1':
                        '0,0,255,255',
                        'color2':
                        '255,0,0,255',
                        'stops':
                        '0.25;0,255,255,255:0.50;0,255,0,255:0.75;255,255,0,255'
                    }
                    colorRamp = QgsVectorGradientColorRamp.create(ramp)
                    self.iface.setActiveLayer(layer)
                    renderer = QgsGraduatedSymbolRenderer.createRenderer(
                        layer, field, classes, mode, symbol, colorRamp)
                    myFormat = renderer.labelFormat()
                    myFormat.setPrecision(2)
                    myFormat.setTrimTrailingZeroes(True)
                    renderer.setLabelFormat(myFormat, True)
        else:
            renderer.setClassAttribute(field)

        layer.setRenderer(renderer)
        layer.triggerRepaint()
Пример #13
0
 def updateLayerAttributes(self):
     no_layer = False
     self.update_attributtes = False
     # get selected layer
     layer = self.dlg.getCurrentLayer()
     if layer not in ("", "Open a vector layer with numeric fields", "Select layer to explore..."):
         if self.current_layer is None or self.current_layer.name() != layer:
             self.update_attributtes = True
             # disconnect eventual slots with the previous layer
             if self.current_layer:
                 try:
                     self.current_layer.selectionChanged.disconnect(self.updateStats)
                 except:
                     pass
                 try:
                     self.current_layer.selectionChanged.disconnect(self.changedMapSelection)
                 except:
                     pass
             # fixme: throws NoneType error occasionally when adding/removing layers. trapping it for now.
             try:
                 self.current_layer = lfh.getLegendLayerByName(self.iface, layer)
                 if self.dlg.getCurrentTab() == 1:
                     self.current_layer.selectionChanged.connect(self.updateStats)
                 elif self.dlg.getCurrentTab() == 2:
                     self.current_layer.selectionChanged.connect(self.changedMapSelection)
             except:
                 self.current_layer = None
     # get layer attributes
     if self.current_layer and self.update_attributtes:
         node = QgsProject.instance().layerTreeRoot().findLayer(self.current_layer.id())
         if not node.isVisible():
             node.setItemVisibilityChecked(True)
         if self.current_layer.type() == 0:  # VectorLayer
             # fixme: throws NoneType error occasionally when adding/removing layers. trapping it for now.
             try:
                 numeric_fields, numeric_field_indices = lfh.getNumericFieldNames(self.current_layer)
             except:
                 numeric_fields = []
                 numeric_field_indices = []
             if len(numeric_fields) > 0:
                 # set min and max values of attributes
                 # set this layer's default display attributes
                 self.layer_display_settings = []
                 self.layer_attributes = []
                 for i, index in enumerate(numeric_field_indices):
                     max_value = self.current_layer.maximumValue(index)
                     min_value = self.current_layer.minimumValue(index)
                     # exclude columns with only NULL values
                     if max_value != NULL and min_value != NULL:
                         # set the layer's attribute info
                         attribute_info = dict()
                         attribute_info['id'] = index
                         attribute_info['name'] = numeric_fields[i]
                         attribute_info['max'] = max_value
                         attribute_info['min'] = min_value
                         self.layer_attributes.append(attribute_info)
                         # set default display settings
                         attribute_display = dict(attribute="", colour_range=0, line_width=0.25, invert_colour=0,
                                                  display_order=0,
                                                  intervals=10, interval_type=0, top_percent=100, top_value=0.0,
                                                  bottom_percent=0, bottom_value=0.0)
                         # update the top and bottom value of the defaults
                         attribute_display['attribute'] = numeric_fields[i]
                         attribute_display['top_value'] = max_value
                         attribute_display['bottom_value'] = min_value
                         if self.current_layer.geometryType() == 0:
                             attribute_display['line_width'] = 2.5
                         self.layer_display_settings.append(attribute_display)
                 # get the current display attribute
                 attributes = self.current_layer.renderer().usedAttributes(QgsRenderContext())
                 if len(attributes) > 0:
                     display_attribute = next(iter(attributes))
                     if display_attribute in numeric_fields:
                         current_attribute = numeric_fields.index(display_attribute)
                     else:
                         current_attribute = 0
                 else:
                     current_attribute = 0
                 # check for saved display settings for the given layer
                 self.getProjectSettings()
                 # update the dialog with this info
                 self.dlg.lockTabs(False)
                 self.dlg.setAttributesList(self.layer_attributes)
                 self.dlg.setAttributesSymbology(self.layer_display_settings)
                 self.dlg.setCurrentAttribute(current_attribute)
                 # self.updateSymbology()
             else:
                 no_layer = True
         else:
             no_layer = True
     else:
         no_layer = True
     if no_layer:
         # disconnect eventual slots with the previous layer
         if self.current_layer:
             try:
                 self.current_layer.selectionChanged.disconnect(self.updateStats)
             except:
                 pass
             try:
                 self.current_layer.selectionChanged.disconnect(self.changedMapSelection)
             except:
                 pass
         self.current_layer = None  # QgsVectorLayer()
         self.dlg.setAttributesList([])
         self.dlg.setAttributesSymbology([])
         self.dlg.setCurrentAttribute(-1)
         self.dlg.lockTabs(True)
Пример #14
0
    def showRequestResult(self, items, append, last, message):
        # print("showRequestResult")
        if items is None or len(items) == 0:
            QApplication.restoreOverrideCursor()
            self.__show_status_label(StatusMessageType.LOAD_FINISHED)
            self.getDataButton.setEnabled(True)

            if message is None or len(message) == 0:
                message = "По указанным параметрам ничего не найдено"

            self._show_message(self, "Загузка завершена", message)
            return

        color = QColor(237, 28, 36, 200)
        pjt = QgsProject.instance()
        layersList = pjt.mapLayersByName(self.resultsLayerName)

        if not append:
            if layersList is not None and len(layersList) > 0:
                pjt.removeMapLayer(layersList[0])
                # print("remove results")
            layersList.clear()
        if not append or layersList is None or len(layersList) == 0:
            # print("create layer")
            layer = QgsVectorLayer("Point?crs=EPSG:4326"
                                   "&field=coordinatesWKT:string(255)&field=shootingDateTime:string(255)"
                                   "&field=temperature:double(7)&field=pixelSizeInDirection:double(5)"
                                   "&field=pixelSizeAcross:double(5)&field=thermalPower:double(5)"
                                   "&field=baseResourceId:string(255)&field=id:string(255)&field=updated:string(255)"
                                   "&field=satellite:string(10)",
                                   self.resultsLayerName, "memory")
        else:
            layer = layersList[0]

        symbol = QgsSymbol.defaultSymbol(layer.geometryType())
        svg_marker = QgsSvgMarkerSymbolLayer(":/plugins/thermal_anomaly/fire.svg")
        svg_marker.setSize(6.0)
        symbol.changeSymbolLayer(0, svg_marker)
        layer.renderer().setSymbol(symbol)

        layer.startEditing()
        print("all items=", len(items))
        poly = QgsGeometry.fromWkt(self.polygon)

        for point in items:
            symbols = layer.renderer().symbols(QgsRenderContext())  # todo which context ?
            symbols[0].setColor(color)
            feature = QgsFeature()
            coord = QgsGeometry.fromWkt(point["coordinatesWKT"])
            feature.setGeometry(coord)
            feature.setAttributes([point["coordinatesWKT"], point["shootingDateTime"], point["temperature"],
                                   point["pixelSizeInDirection"], point["pixelSizeAcross"], point["thermalPower"],
                                   point["baseResourceId"], point["id"], point["updated"], point["satellite"]])
            layer.dataProvider().addFeatures([feature])

            # if not poly.contains(coord):
            #     print("point out of poly: id =", point["id"], "coord =", point["coordinatesWKT"])
        layer.commitChanges()

        if not append:
            pjt.addMapLayer(layer, False)
            if pjt.layerTreeRoot().findGroup(self.tr(self.groupName)) is None:
                pjt.layerTreeRoot().insertChildNode(0, QgsLayerTreeGroup(self.tr(self.groupName)))
            group = pjt.layerTreeRoot().findGroup(self.tr(self.groupName))
            group.insertLayer(0, layer)
        self.iface.layerTreeView().refreshLayerSymbology(layer.id())
        self.iface.mapCanvas().refresh()
        if last:
            QApplication.restoreOverrideCursor()
            self.__show_status_label(StatusMessageType.LOAD_FINISHED)
            self.getDataButton.setEnabled(True)
        else:
            self.__show_status_label(StatusMessageType.LOAD_STARTED, message)
    def testQgsGraduatedSymbolRendererV2_1(self):
        """Test QgsGraduatedSymbolRendererV2: Basic get/set functions """

        # Create a renderer
        renderer = QgsGraduatedSymbolRendererV2()

        symbol = createMarkerSymbol()
        renderer.setSourceSymbol(symbol.clone())
        self.assertEqual(symbol.dump(),
                         renderer.sourceSymbol().dump(),
                         "Get/set renderer source symbol")

        attr = '"value"*"value"'
        renderer.setClassAttribute(attr)
        self.assertEqual(attr, renderer.classAttribute(),
                         "Get/set renderer class attribute")

        for m in (
                QgsGraduatedSymbolRendererV2.Custom,
                QgsGraduatedSymbolRendererV2.EqualInterval,
                QgsGraduatedSymbolRendererV2.Quantile,
                QgsGraduatedSymbolRendererV2.Jenks,
                QgsGraduatedSymbolRendererV2.Pretty,
                QgsGraduatedSymbolRendererV2.StdDev,
        ):
            renderer.setMode(m)
            self.assertEqual(m, renderer.mode(), "Get/set renderer mode")

        format = createLabelFormat()
        renderer.setLabelFormat(format)
        self.assertEqual(dumpLabelFormat(format),
                         dumpLabelFormat(renderer.labelFormat()),
                         "Get/set renderer label format")

        ramp = createColorRamp()
        renderer.setSourceColorRamp(ramp)
        self.assertEqual(dumpColorRamp(ramp),
                         dumpColorRamp(renderer.sourceColorRamp()),
                         "Get/set renderer color ramp")

        renderer.setInvertedColorRamp(True)
        self.assertTrue(renderer.invertedColorRamp(),
                        "Get/set renderer inverted color ramp")
        renderer.setInvertedColorRamp(False)
        self.assertFalse(renderer.invertedColorRamp(),
                         "Get/set renderer inverted color ramp")

        value = '"value"*2'
        exp = QgsSymbolLayerV2Utils.fieldOrExpressionToExpression(value)
        valuestr = QgsSymbolLayerV2Utils.fieldOrExpressionFromExpression(exp)
        renderer.setRotationField(value)
        self.assertEqual(valuestr, renderer.rotationField(),
                         "Get/set renderer rotation field")

        value = '"value"*3'
        exp = QgsSymbolLayerV2Utils.fieldOrExpressionToExpression(value)
        valuestr = QgsSymbolLayerV2Utils.fieldOrExpressionFromExpression(exp)
        renderer.setSizeScaleField(value)
        self.assertEqual(valuestr, renderer.sizeScaleField(),
                         "Get/set renderer size scale field")

        renderer.setSourceColorRamp(ramp)
        self.assertEqual(dumpColorRamp(ramp),
                         dumpColorRamp(renderer.sourceColorRamp()),
                         "Get/set renderer color ramp")

        for sm in (
                QgsSymbolV2.ScaleArea,
                QgsSymbolV2.ScaleDiameter,
        ):
            renderer.setScaleMethod(sm)
            self.assertEqual(str(sm), str(renderer.scaleMethod()),
                             "Get/set renderer scale method")
        # test for classificatio with varying size
        renderer.setGraduatedMethod(QgsGraduatedSymbolRendererV2.GraduatedSize)
        renderer.setSourceColorRamp(None)
        renderer.addClassLowerUpper(0, 2)
        renderer.addClassLowerUpper(2, 4)
        renderer.addClassLowerUpper(4, 6)
        renderer.setSymbolSizes(2, 13)
        self.assertEqual(renderer.maxSymbolSize(), 13)
        self.assertEqual(renderer.minSymbolSize(), 2)
        refSizes = [2, (13 + 2) * .5, 13]
        ctx = QgsRenderContext()
        for idx, symbol in enumerate(renderer.symbols(ctx)):
            self.assertEqual(symbol.size(), refSizes[idx])
Пример #16
0
    def testPainterClipPath(self):
        region = QgsMapClippingRegion(
            QgsGeometry.fromWkt('Polygon((0 0, 1 0, 1 1, 0 1, 0 0))'))
        region.setFeatureClip(
            QgsMapClippingRegion.FeatureClippingType.ClipPainterOnly)
        region2 = QgsMapClippingRegion(
            QgsGeometry.fromWkt('Polygon((0 0, 0.1 0, 0.1 2, 0 2, 0 0))'))
        region2.setFeatureClip(
            QgsMapClippingRegion.FeatureClippingType.NoClipping)
        region3 = QgsMapClippingRegion(
            QgsGeometry.fromWkt('Polygon((0 0, 0.1 0, 0.1 2, 0 2, 0 0))'))
        region3.setFeatureClip(
            QgsMapClippingRegion.FeatureClippingType.ClipPainterOnly)

        rc = QgsRenderContext()

        for t in [
                QgsMapLayerType.VectorLayer, QgsMapLayerType.RasterLayer,
                QgsMapLayerType.MeshLayer, QgsMapLayerType.VectorTileLayer
        ]:
            path, should_clip = QgsMapClippingUtils.calculatePainterClipRegion(
                [], rc, t)
            self.assertFalse(should_clip)
            self.assertEqual(path.elementCount(), 0)

        for t in [
                QgsMapLayerType.VectorLayer, QgsMapLayerType.RasterLayer,
                QgsMapLayerType.MeshLayer, QgsMapLayerType.VectorTileLayer
        ]:
            path, should_clip = QgsMapClippingUtils.calculatePainterClipRegion(
                [region], rc, t)
            self.assertTrue(should_clip)
            self.assertEqual(
                QgsGeometry.fromQPolygonF(path.toFillPolygon()).asWkt(1),
                'Polygon ((0 1, 1 1, 1 0, 0 0, 0 1))')

        # region2 is a Intersects type clipping region, should not apply for vector layers
        path, should_clip = QgsMapClippingUtils.calculatePainterClipRegion(
            [region2], rc, QgsMapLayerType.VectorLayer)
        self.assertFalse(should_clip)
        self.assertEqual(path.elementCount(), 0)

        for t in [
                QgsMapLayerType.RasterLayer, QgsMapLayerType.MeshLayer,
                QgsMapLayerType.VectorTileLayer
        ]:
            path, should_clip = QgsMapClippingUtils.calculatePainterClipRegion(
                [region2], rc, t)
            self.assertTrue(should_clip)
            self.assertEqual(
                QgsGeometry.fromQPolygonF(path.toFillPolygon()).asWkt(1),
                'Polygon ((0 1, 0.1 1, 0.1 -1, 0 -1, 0 1))')

        for t in [
                QgsMapLayerType.VectorLayer, QgsMapLayerType.RasterLayer,
                QgsMapLayerType.MeshLayer, QgsMapLayerType.VectorTileLayer
        ]:
            path, should_clip = QgsMapClippingUtils.calculatePainterClipRegion(
                [region, region2, region3], rc, t)
            self.assertTrue(should_clip)
            self.assertEqual(
                QgsGeometry.fromQPolygonF(path.toFillPolygon()).asWkt(1),
                'Polygon ((0.1 1, 0 1, 0 0, 0.1 0, 0.1 1))')

        rc.setMapToPixel(QgsMapToPixel(5, 10, 11, 200, 150, 0))
        for t in [
                QgsMapLayerType.VectorLayer, QgsMapLayerType.RasterLayer,
                QgsMapLayerType.MeshLayer, QgsMapLayerType.VectorTileLayer
        ]:
            path, should_clip = QgsMapClippingUtils.calculatePainterClipRegion(
                [region, region3], rc, t)
            self.assertTrue(should_clip)
            self.assertEqual(
                QgsGeometry.fromQPolygonF(path.toFillPolygon()).asWkt(0),
                'Polygon ((98 77, 98 77, 98 77, 98 77, 98 77))')
Пример #17
0
    def testQgsGraduatedSymbolRenderer_1(self):
        """Test QgsGraduatedSymbolRenderer: Basic get/set functions """

        # Create a renderer
        renderer = QgsGraduatedSymbolRenderer()

        symbol = createMarkerSymbol()
        renderer.setSourceSymbol(symbol.clone())
        self.assertEqual(symbol.dump(), renderer.sourceSymbol().dump(), "Get/set renderer source symbol")

        attr = '"value"*"value"'
        renderer.setClassAttribute(attr)
        self.assertEqual(attr, renderer.classAttribute(), "Get/set renderer class attribute")

        for m in (
            QgsGraduatedSymbolRenderer.Custom,
            QgsGraduatedSymbolRenderer.EqualInterval,
            QgsGraduatedSymbolRenderer.Quantile,
            QgsGraduatedSymbolRenderer.Jenks,
            QgsGraduatedSymbolRenderer.Pretty,
            QgsGraduatedSymbolRenderer.StdDev,
        ):
            renderer.setMode(m)
            self.assertEqual(m, renderer.mode(), "Get/set renderer mode")

        format = createLabelFormat()
        renderer.setLabelFormat(format)
        self.assertEqual(
            dumpLabelFormat(format),
            dumpLabelFormat(renderer.labelFormat()),
            "Get/set renderer label format")

        ramp = createColorRamp()
        renderer.setSourceColorRamp(ramp)
        self.assertEqual(
            dumpColorRamp(ramp),
            dumpColorRamp(renderer.sourceColorRamp()),
            "Get/set renderer color ramp")

        renderer.setInvertedColorRamp(True)
        self.assertTrue(renderer.invertedColorRamp(),
                        "Get/set renderer inverted color ramp")
        renderer.setInvertedColorRamp(False)
        self.assertFalse(renderer.invertedColorRamp(),
                         "Get/set renderer inverted color ramp")

        renderer.setSourceColorRamp(ramp)
        self.assertEqual(
            dumpColorRamp(ramp),
            dumpColorRamp(renderer.sourceColorRamp()),
            "Get/set renderer color ramp")

        # test for classificatio with varying size
        renderer.setGraduatedMethod(QgsGraduatedSymbolRenderer.GraduatedSize)
        renderer.setSourceColorRamp(None)
        renderer.addClassLowerUpper(0, 2)
        renderer.addClassLowerUpper(2, 4)
        renderer.addClassLowerUpper(4, 6)
        renderer.setSymbolSizes(2, 13)
        self.assertEqual(renderer.maxSymbolSize(), 13)
        self.assertEqual(renderer.minSymbolSize(), 2)
        refSizes = [2, (13 + 2) * .5, 13]
        ctx = QgsRenderContext()
        for idx, symbol in enumerate(renderer.symbols(ctx)):
            self.assertEqual(symbol.size(), refSizes[idx])
Пример #18
0
    def test_transfer_results(self):
        results = QgsRenderedItemResults()
        self.assertFalse(
            results.renderedAnnotationItemsInBounds(
                QgsRectangle(-100000000, -100000000, 100000000, 100000000)))

        rc = QgsRenderContext()
        details1 = QgsRenderedAnnotationItemDetails('layer_id', 'item_id_1')
        details1.setBoundingBox(QgsRectangle(1, 1, 10, 10))

        details2 = QgsRenderedAnnotationItemDetails('layer_id2', 'item_id_2')
        details2.setBoundingBox(QgsRectangle(1, 1, 5, 5))

        details3 = QgsRenderedAnnotationItemDetails('layer_id3', 'item_id_3')
        details3.setBoundingBox(QgsRectangle(4, 4, 7, 7))

        results.appendResults([details1, details2, details3], rc)

        results2 = QgsRenderedItemResults()
        # transfer some results to results2
        # first no layers specified => nothing should be transferred
        results2.transferResults(results, [])
        self.assertCountEqual(
            [(i.layerId(), i.itemId())
             for i in results.renderedAnnotationItemsInBounds(
                 QgsRectangle(0, 0, 10, 10))], [('layer_id', 'item_id_1'),
                                                ('layer_id2', 'item_id_2'),
                                                ('layer_id3', 'item_id_3')])
        self.assertFalse(
            results2.renderedAnnotationItemsInBounds(QgsRectangle(
                0, 0, 10, 10)))

        results2.transferResults(results, ['layer_id2', 'layer_id3'])
        self.assertEqual([(i.layerId(), i.itemId())
                          for i in results.renderedItems()],
                         [('layer_id', 'item_id_1')])
        self.assertCountEqual(
            [(i.layerId(), i.itemId())
             for i in results2.renderedAnnotationItemsInBounds(
                 QgsRectangle(0, 0, 10, 10))], [('layer_id2', 'item_id_2'),
                                                ('layer_id3', 'item_id_3')])
        # same layers, nothing should happen
        results2.transferResults(results, ['layer_id2', 'layer_id3'])
        self.assertEqual([(i.layerId(), i.itemId())
                          for i in results.renderedItems()],
                         [('layer_id', 'item_id_1')])
        self.assertCountEqual(
            [(i.layerId(), i.itemId())
             for i in results2.renderedAnnotationItemsInBounds(
                 QgsRectangle(0, 0, 10, 10))], [('layer_id2', 'item_id_2'),
                                                ('layer_id3', 'item_id_3')])
        # remaining layer
        results2.transferResults(results, ['layer_id'])
        self.assertFalse([(i.layerId(), i.itemId())
                          for i in results.renderedItems()])
        self.assertCountEqual(
            [(i.layerId(), i.itemId())
             for i in results2.renderedAnnotationItemsInBounds(
                 QgsRectangle(0, 0, 10, 10))], [('layer_id', 'item_id_1'),
                                                ('layer_id2', 'item_id_2'),
                                                ('layer_id3', 'item_id_3')])

        # transfer all results
        results3 = QgsRenderedItemResults()
        # nothing should happen -- no results in results3 to transfer
        results2.transferResults(results3)
        self.assertFalse(
            results3.renderedAnnotationItemsInBounds(QgsRectangle(
                0, 0, 10, 10)))
        self.assertCountEqual(
            [(i.layerId(), i.itemId())
             for i in results2.renderedAnnotationItemsInBounds(
                 QgsRectangle(0, 0, 10, 10))], [('layer_id', 'item_id_1'),
                                                ('layer_id2', 'item_id_2'),
                                                ('layer_id3', 'item_id_3')])

        # transfer all results from results2 to results3
        results3.transferResults(results2)
        self.assertFalse(results2.renderedItems())
        self.assertCountEqual(
            [(i.layerId(), i.itemId())
             for i in results3.renderedAnnotationItemsInBounds(
                 QgsRectangle(0, 0, 10, 10))], [('layer_id', 'item_id_1'),
                                                ('layer_id2', 'item_id_2'),
                                                ('layer_id3', 'item_id_3')])
Пример #19
0
    def updateRenderer(self, layer, attribute_vals, settings):
        """
        Creates a renderer for the layer based on this, and applies it
        The renderer uses GradientColourRamp to calculate the symbol colours

        @param layer: the selected QgsVectorLayer object
        """
        geometry = layer.geometryType()
        # create a colour ramp based on colour range type, inverting symbols if required
        ramp_type = int(settings['colour_range'])
        invert = int(settings['invert_colour'])
        ramp = self.getColourRamp(ramp_type, invert)
        line_width = float(settings['line_width'])
        # calculate ranges: EqualInterval = 0; Quantile  = 1; Jenks = 2; StdDev = 3; Pretty = 4; Custom = 5
        intervals = int(settings['intervals'])
        mode = int(settings['interval_type'])
        attribute = attribute_vals['name']
        renderer = None
        if mode < 3:
            # set symbol type and line width
            symbol = QgsSymbol.defaultSymbol(geometry)
            if symbol:
                if symbol.type() == 1:  # line
                    symbol.setWidth(line_width)
                elif symbol.type() == 2:  # line
                    symbol = QgsFillSymbol.createSimple({
                        'style':
                        'solid',
                        'color':
                        'black',
                        'width_border':
                        '%s' % line_width
                    })
                elif symbol.type() == 0:  # point
                    symbol.setSize(line_width)
                renderer = QgsGraduatedSymbolRenderer.createRenderer(
                    layer, attribute, intervals, mode, symbol, ramp)
                renderer.setMode(mode)
                renderer.setSourceColorRamp(ramp)
        else:
            # calculate range values individually based on custom settings
            ranges = []
            max_value = float(attribute_vals['max'])
            min_value = float(attribute_vals['min'])
            top_value = float(settings['top_value'])
            bottom_value = float(settings['bottom_value'])
            # calculate number of ranges depending on top/bottom difference from max/min:
            # is there really a range there? Otherwise this will calculate 1 or even 2 ranges less
            calc_intervals = intervals + 1
            if top_value != max_value:
                calc_intervals -= 1
            if bottom_value != min_value:
                calc_intervals -= 1
            range_steps = [
                r for r in np.linspace(bottom_value, top_value, calc_intervals)
            ]
            if top_value != max_value:
                range_steps.append(max_value)
            if bottom_value != min_value:
                range_steps.insert(0, min_value)
            for i in range(0, len(range_steps) - 1):
                symbol = QgsSymbol.defaultSymbol(geometry)
                if symbol:
                    new_colour = ramp.color(
                        i / (float(len(range_steps)) - 2)).getRgb()
                    symbol.setColor(QColor(*new_colour))
                    symbol.setWidth(line_width)
                    label = "%s - %s" % (range_steps[i], range_steps[i + 1])
                    this_range = QgsRendererRange(range_steps[i],
                                                  range_steps[i + 1], symbol,
                                                  label)
                    ranges.append(this_range)
            if ranges:
                renderer = QgsGraduatedSymbolRenderer(attribute, ranges)
                # renderer.setMode(5)
                renderer.setSourceColorRamp(ramp)
        # configure symbol levels to display in specific order
        # the classic "reds on top" from space syntax, or the reverse
        if renderer:
            display_order = int(settings['display_order'])
            renderer.setUsingSymbolLevels(True)
            render_pass = 0
            if display_order == 0:
                for symbol in renderer.symbols(QgsRenderContext()):
                    for i in range(0, symbol.symbolLayerCount()):
                        symbol.symbolLayer(i).setRenderingPass(render_pass)
                        render_pass += 1
            else:
                for symbol in reversed(renderer.symbols(QgsRenderContext())):
                    for i in range(0, symbol.symbolLayerCount()):
                        symbol.symbolLayer(i).setRenderingPass(render_pass)
                        render_pass += 1
        # set the symbols for monochrome ramp
        # varying line width, point size or polygon pattern density
        # doesn't use data column because it's not scaled according to line width values
        # the width is calculated linearly between min and given value
        if renderer:
            if ramp_type == 3:
                new_width = np.linspace(0.1, line_width, intervals)
                step = intervals / 8.0  # this is usd for fill patterns
                # color = QColor(ramp.color(0).getRgb())  # same as above
                for i in range(0, intervals):
                    symbol = renderer.symbols(QgsRenderContext())[i]
                    if invert:
                        if symbol.type() == 1:  # line
                            symbol.setWidth(new_width[(intervals - 1) - i])
                        elif symbol.type() == 0:  # point
                            symbol.setSize(new_width[(intervals - 1) - i])
                        elif symbol.type() == 2:  # polygon
                            dense = int(i / step)
                            if dense == 0:
                                style = 'solid'
                            else:
                                style = 'dense%s' % dense
                            symbol = QgsFillSymbol.createSimple({
                                'style':
                                style,
                                'color':
                                'black',
                                'width_border':
                                '%s' % new_width[(intervals - 1) - i]
                            })
                    else:
                        if symbol.type() == 1:  # line
                            symbol.setWidth(new_width[i])
                        elif symbol.type() == 0:  # point
                            symbol.setSize(new_width[i])
                        elif symbol.type() == 2:  # polygon
                            dense = int(i / step)
                            if dense == 7:
                                style = 'solid'
                            else:
                                style = 'dense%s' % (7 - dense)
                            symbol = QgsFillSymbol.createSimple({
                                'style':
                                style,
                                'color':
                                'black',
                                'width_border':
                                '%s' % new_width[i]
                            })
                    renderer.updateRangeSymbol(i, symbol)
        return renderer
Пример #20
0
    def processPointsLayer(self, feedback, layer, mapAttr, resultProj):
        feedback.setProgressText("Publishing map: " +
                                 UTILS.normalizeName(layer.name()))
        clonedLayer = layer.clone()
        layerRenderer = clonedLayer.renderer()
        renderContext = QgsRenderContext()
        renderContext.setUseAdvancedEffects(True)
        renderContext.setFlags(QgsRenderContext.Flag.Antialiasing)
        imageList = list()
        iconField = QgsField(
            'icon_url', QVariant.String,
            'text')  #Danilo não vou verificar se o mapa ja tem esse atributo
        feedback.setProgressText("Adding a column 'icon_url'")
        clonedLayer.startEditing()
        addedField = clonedLayer.addAttribute(iconField)
        if (addedField == False):
            feedback.pushConsoleInfo(
                "Warning: " + layer.name() +
                " canceled failed to create a column to store the point symbol."
            )
            return False
        clonedLayer.commitChanges()
        clonedLayer.startEditing()
        feedback.setProgressText("Rendering symbologies")
        for feature in clonedLayer.getFeatures():
            layerRenderer.startRender(renderContext, clonedLayer.fields())
            symbol = layerRenderer.originalSymbolsForFeature(
                feature, renderContext)
            if len(symbol) <= 0:
                continue
            else:
                if len(symbol) > 1:
                    feedback.pushConsoleInfo(
                        "Warning: Only one symbol for symbology, the others will be ignored."
                    )
                symbol = symbol[0]
            layerRenderer.stopRender(renderContext)
            curImage = symbol.asImage(QSize(24, 24))
            try:
                imgIndex = imageList.index(curImage)
            except Exception as e:
                imageList.append(curImage)
                imgIndex = len(imageList) - 1
            feature.setAttribute("icon_url", './' + str(imgIndex) + ".png")
            clonedLayer.updateFeature(feature)
        clonedLayer.commitChanges()

        layerCsvFolder = self.getPathForMap(layer.name(), mapAttr, 'csv')
        feedback.setProgressText("Saving results")
        os.makedirs(layerCsvFolder, exist_ok=True)
        savedCsv = QgsVectorFileWriter.writeAsVectorFormat(
            clonedLayer,
            os.path.join(layerCsvFolder, 'point_layer.csv'),
            'utf-8',
            resultProj,
            'CSV',
            layerOptions=['GEOMETRY=AS_XY'])
        #Saving symbology
        for index in range(len(imageList)):
            imageList[index].save(
                os.path.join(layerCsvFolder,
                             str(index) + '.png'))
        return savedCsv and len(imageList) > 0
Пример #21
0
from builtins import object
from PyQt5.QtCore import QSettings, QTranslator, qVersion, QCoreApplication, Qt
from PyQt5.QtWidgets import QAction, QGraphicsScene, QFileDialog
from PyQt5.QtGui import QIcon, QImage, QPainter, QColor, QPixmap, QTransform
# Initialize Qt resources from file resources.py
from .resources import *

# Import QGIS components
from qgis.gui import QgsMessageBar, QgsBlendModeComboBox
from qgis.core import QgsMapLayerProxyModel, QgsRenderContext

# Import the code for the DockWidget
from .bivariate_legend_dockwidget import BivariateLegendDockWidget
import os.path

renderContext = QgsRenderContext()


class BivariateLegend(object):
    """QGIS Plugin Implementation."""
    def __init__(self, iface):
        """Constructor.

        :param iface: An interface instance that will be passed to this class
            which provides the hook by which you can manipulate the QGIS
            application at run time.
        :type iface: QgsInterface
        """
        # Save reference to the QGIS interface
        self.iface = iface
Пример #22
0
    def apply_masks(self, layer_bound):
        layers = QgsProject.instance().mapLayers().values()
        mask_dict = {}

        #Creating symbol layer reference list
        grid_symbol_ref_list = []
        renderer = layer_bound.renderer()
        grid_symbol_rule_id = renderer.rootRule().children()[0].ruleKey()
        layer_id = layer_bound.id()
        symbol_list = renderer.symbols(QgsRenderContext())
        symbol_layer_list = symbol_list[0].symbolLayers()
        for smb in range(1, len(symbol_layer_list)):
            idx_list = []
            idx_list.append(smb)
            idx_list.append(0)
            symbol_id = QgsSymbolLayerId(grid_symbol_rule_id, idx_list)
            temp = QgsSymbolLayerReference(layer_id, symbol_id)
            grid_symbol_ref_list.append(temp)

        #Listing available label masks
        for layer in layers:
            if not layer.type() == QgsMapLayer.VectorLayer:
                continue
            labels = layer.labeling()
            if not labels:
                continue
            providers = []
            if isinstance(labels, QgsVectorLayerSimpleLabeling):
                providers.append('--SINGLE--RULE--')
            if isinstance(labels, QgsRuleBasedLabeling):
                providers = [x.ruleKey() for x in labels.rootRule().children()]

            for provider in providers:
                if provider == '--SINGLE--RULE--':
                    label_settings = labels.settings()
                else:
                    label_settings = labels.settings(provider)
                label_format = label_settings.format()
                masks = label_format.mask()
                if not masks.enabled():
                    continue

                #Applying available lable masks to grid layer symbology
                mask_symbol_list = masks.maskedSymbolLayers()
                new_symbol_mask = []
                for item in mask_symbol_list:
                    if item.layerId() == layer_id:
                        continue
                    new_symbol_mask.append(item)
                for item in grid_symbol_ref_list:
                    new_symbol_mask.append(item)

                masks.setMaskedSymbolLayers(new_symbol_mask)
                label_format.setMask(masks)
                label_settings.setFormat(label_format)
                if provider == '--SINGLE--RULE--':
                    labels.setSettings(label_settings)
                else:
                    labels.setSettings(label_settings, provider)

            layer.setLabeling(labels)

        return
    def testQgsGradientFillSymbolLayer(self):
        """Test setting and getting QgsGradientFillSymbolLayer properties.
        """
        mGradientLayer = QgsGradientFillSymbolLayer()

        mExpectedValue = type(QgsGradientFillSymbolLayer())
        mValue = type(mGradientLayer)
        mMessage = 'Expected "%s" got "%s"' % (mExpectedValue, mValue)
        assert mExpectedValue == mValue, mMessage

        mExpectedValue = QgsGradientFillSymbolLayer.Radial
        mGradientLayer.setGradientType(mExpectedValue)
        mValue = mGradientLayer.gradientType()
        mMessage = 'Expected "%s" got "%s"' % (mExpectedValue, mValue)
        assert mExpectedValue == mValue, mMessage

        mExpectedValue = QgsGradientFillSymbolLayer.ColorRamp
        mGradientLayer.setGradientColorType(mExpectedValue)
        mValue = mGradientLayer.gradientColorType()
        mMessage = 'Expected "%s" got "%s"' % (mExpectedValue, mValue)
        assert mExpectedValue == mValue, mMessage

        mExpectedValue = QColor('#55aaff')
        mGradientLayer.setColor2(mExpectedValue)
        mValue = mGradientLayer.color2()
        mMessage = 'Expected "%s" got "%s"' % (mExpectedValue, mValue)
        assert mExpectedValue == mValue, mMessage

        mExpectedValue = QgsGradientFillSymbolLayer.Viewport
        mGradientLayer.setCoordinateMode(mExpectedValue)
        mValue = mGradientLayer.coordinateMode()
        mMessage = 'Expected "%s" got "%s"' % (mExpectedValue, mValue)
        assert mExpectedValue == mValue, mMessage

        mExpectedValue = QgsGradientFillSymbolLayer.Reflect
        mGradientLayer.setGradientSpread(mExpectedValue)
        mValue = mGradientLayer.gradientSpread()
        mMessage = 'Expected "%s" got "%s"' % (mExpectedValue, mValue)
        assert mExpectedValue == mValue, mMessage

        mExpectedValue = QPointF(0.5, 0.8)
        mGradientLayer.setReferencePoint1(mExpectedValue)
        mValue = mGradientLayer.referencePoint1()
        mMessage = 'Expected "%s" got "%s"' % (mExpectedValue, mValue)
        assert mExpectedValue == mValue, mMessage

        mExpectedValue = True
        mGradientLayer.setReferencePoint1IsCentroid(mExpectedValue)
        mValue = mGradientLayer.referencePoint1IsCentroid()
        mMessage = 'Expected "%s" got "%s"' % (mExpectedValue, mValue)
        assert mExpectedValue == mValue, mMessage

        mExpectedValue = QPointF(0.2, 0.4)
        mGradientLayer.setReferencePoint2(mExpectedValue)
        mValue = mGradientLayer.referencePoint2()
        mMessage = 'Expected "%s" got "%s"' % (mExpectedValue, mValue)
        assert mExpectedValue == mValue, mMessage

        mExpectedValue = True
        mGradientLayer.setReferencePoint2IsCentroid(mExpectedValue)
        mValue = mGradientLayer.referencePoint2IsCentroid()
        mMessage = 'Expected "%s" got "%s"' % (mExpectedValue, mValue)
        assert mExpectedValue == mValue, mMessage

        mExpectedValue = 90
        mGradientLayer.setAngle(mExpectedValue)
        mValue = mGradientLayer.angle()
        mMessage = 'Expected "%s" got "%s"' % (mExpectedValue, mValue)
        assert mExpectedValue == mValue, mMessage

        mExpectedValue = QPointF(10, 20)
        mGradientLayer.setOffset(mExpectedValue)
        mValue = mGradientLayer.offset()
        mMessage = 'Expected "%s" got "%s"' % (mExpectedValue, mValue)
        assert mExpectedValue == mValue, mMessage

        mExpectedValue = QgsUnitTypes.RenderMapUnits
        mGradientLayer.setOffsetUnit(mExpectedValue)
        mValue = mGradientLayer.offsetUnit()
        mMessage = 'Expected "%s" got "%s"' % (mExpectedValue, mValue)
        assert mExpectedValue == mValue, mMessage

        ctx = QgsRenderContext()
        self.assertCountEqual(mGradientLayer.usedAttributes(ctx), {})
Пример #24
0
    def identifyLayer(self, point):
        self.results[:] = []

        if not self.layer.hasGeometryType():
            return False

        if (self.layer.hasScaleBasedVisibility() and
            (self.layer.minimumScale() > self.canvas.mapSettings().scale() or
             self.layer.maximumScale() <= self.canvas.mapSettings().scale())):
            print 'Out of scale limits'
            return False

        QApplication.setOverrideCursor(Qt.WaitCursor)

        featureCount = 0
        featureList = []

        try:
            searchRadius = self.searchRadiusMU(self.canvas)

            r = QgsRectangle()
            r.setXMinimum(point.x() - searchRadius)
            r.setXMaximum(point.x() + searchRadius)
            r.setYMinimum(point.y() - searchRadius)
            r.setYMaximum(point.y() + searchRadius)

            r = self.toLayerCoordinates(self.layer, r)

            req = QgsFeatureRequest()
            req.setFilterRect(r)
            req.setFlags(QgsFeatureRequest.ExactIntersect)
            for f in self.layer.getFeatures(req):
                featureList.append(QgsFeature(f))
        except QgsCsException as cse:
            print 'Caught CRS exception', cse.what()

        myFilter = False
        context = QgsRenderContext(
            QgsRenderContext.fromMapSettings(self.canvas.mapSettings()))
        renderer = self.layer.rendererV2()

        if (renderer is not None and
            (renderer.capabilities() | QgsFeatureRendererV2.ScaleDependent)):
            renderer.startRender(context, self.layer.pendingFields())
            myFilter = renderer.capabilities() and QgsFeatureRendererV2.Filter

        for f in featureList:
            if myFilter and not renderer.willRenderFeature(f):
                continue

            featureCount += 1
            self.results.append((self.layer, f))

        if (renderer is not None and
            (renderer.capabilities() | QgsFeatureRendererV2.ScaleDependent)):
            renderer.stopRender(context)

        print 'Feature count on identify:', featureCount

        QApplication.restoreOverrideCursor()

        return featureCount > 0
Пример #25
0
    def draw(self):
        rb = self.tool.rb
        g = rb.asGeometry()

        ok = True
        warning = False
        errBuffer_noAtt = False
        errBuffer_Vertices = False

        layer = self.iface.layerTreeView().currentLayer()
        if self.toolname == 'drawBuffer':
            if self.bGeom is None:
                warning = True
                errBuffer_noAtt = True
            else:
                perim, ok = QInputDialog.getDouble(
                    self.iface.mainWindow(),
                    self.tr('Perimeter'),
                    self.tr('Give a perimeter in m:') + '\n' +
                    self.tr('(works only with metric crs)'),
                    min=0)
                g = self.bGeom.buffer(perim, 40)
                rb.setToGeometry(
                    g,
                    QgsVectorLayer("Polygon?crs=" + layer.crs().authid(), "",
                                   "memory"))
                if g.length() == 0 and ok:
                    warning = True
                    errBuffer_Vertices = True

        if self.toolname == 'drawCopies':
            if g.length() < 0:
                warning = True
                errBuffer_noAtt = True

        if ok and not warning:
            name = ''
            ok = True
            add = False
            index = 0
            layers = []
            while not name.strip() and not add and ok:
                dlg = QDrawLayerDialog(self.iface, self.drawShape)
                name, add, index, layers, ok = dlg.getName(
                    self.iface, self.drawShape)
        if ok and not warning:
            layer = None
            if add:
                layer = layers[index]
                if self.drawShape in ['point', 'XYpoint']:
                    g = g.centroid()
            else:
                if self.drawShape == 'point':
                    layer = QgsVectorLayer(
                        "Point?crs=" + self.iface.mapCanvas().mapSettings(
                        ).destinationCrs().authid() + "&field=" +
                        self.tr('Drawings') + ":string(255)", name, "memory")
                    g = g.centroid()  # force geometry as point
                elif self.drawShape == 'XYpoint':
                    layer = QgsVectorLayer(
                        "Point?crs=" + self.XYcrs.authid() + "&field=" +
                        self.tr('Drawings') + ":string(255)", name, "memory")
                    g = g.centroid()
                elif self.drawShape == 'line':
                    layer = QgsVectorLayer(
                        "LineString?crs=" + self.iface.mapCanvas().mapSettings(
                        ).destinationCrs().authid() + "&field=" +
                        self.tr('Drawings') + ":string(255)", name, "memory")
                    # fix_print_with_import
                    print("LineString?crs=" + self.iface.mapCanvas(
                    ).mapSettings().destinationCrs().authid() + "&field=" +
                          self.tr('Drawings') + ":string(255)")
                else:
                    layer = QgsVectorLayer(
                        "Polygon?crs=" + self.iface.mapCanvas().mapSettings(
                        ).destinationCrs().authid() + "&field=" +
                        self.tr('Drawings') + ":string(255)", name, "memory")
            layer.startEditing()
            symbols = layer.renderer().symbols(
                QgsRenderContext())  # todo which context ?
            symbols[0].setColor(self.settings.getColor())
            feature = QgsFeature()
            feature.setGeometry(g)
            feature.setAttributes([name])
            layer.dataProvider().addFeatures([feature])
            layer.commitChanges()
            if not add:
                pjt = QgsProject.instance()
                pjt.addMapLayer(layer, False)
                if pjt.layerTreeRoot().findGroup(self.tr('Drawings')) is None:
                    pjt.layerTreeRoot().insertChildNode(
                        0, QgsLayerTreeGroup(self.tr('Drawings')))
                group = pjt.layerTreeRoot().findGroup(self.tr('Drawings'))
                group.insertLayer(0, layer)
            self.iface.layerTreeView().refreshLayerSymbology(layer.id())
            self.iface.mapCanvas().refresh()
        else:
            if warning:
                if errBuffer_noAtt:
                    self.iface.messageBar().pushWarning(
                        self.tr('Warning'),
                        self.tr('You didn\'t click on a layer\'s attribute !'))
                elif errBuffer_Vertices:
                    self.iface.messageBar().pushWarning(
                        self.tr('Warning'),
                        self.tr('You must give a non-null value for a \
                        point\'s or line\'s perimeter !'))
                else:
                    self.iface.messageBar().pushWarning(
                        self.tr('Warning'),
                        self.tr('There is no selected layer, or it is not \
                                vector nor visible !'))
        self.tool.reset()
        self.resetSB()
        self.bGeom = None
Пример #26
0
    def getDataButtonClicked(self):
        clId = self.leClientID.text()
        clSecret = self.leClientSecret.text()

        if len(clId) == 0 or len(clSecret) == 0:
            self._show_message("Некорректные данные", "Данные пользователя не могут быть пустыми")
            return

        dateTimeFrom = self.dateTimeEditFrom.dateTime()
        dateTimeTo = self.dateTimeEditTo.dateTime()
        if dateTimeFrom >= dateTimeTo:
            self._show_message("Некорректные данные", "Дата 'По' должна быть больше, чем дата 'С'")
            return

        pjt = QgsProject.instance()
        # clear results
        layersList = pjt.mapLayersByName(self.resultsLayerName)
        if layersList is not None and len(layersList) > 0:
            pjt.removeMapLayer(layersList[0])
            self.iface.mapCanvas().refresh()

        layersList = pjt.mapLayersByName(self.searchAreaLayerName)

        polygonGeometry = None
        if layersList is not None and len(layersList) > 0:
            feat = list(layersList[0].getFeatures())[0]
            if feat.hasGeometry():
                polygonGeometry = self.geomTransform(
                    feat.geometry(),
                    self.iface.mapCanvas().mapSettings().destinationCrs(),
                    QgsCoordinateReferenceSystem(4326))

        if polygonGeometry is None:
            self._show_message("Некорректные данные", "Необходимо задать полигон поиска")
            return

        availableAreaName = "available_area"
        shpLayer = QgsVectorLayer(os.path.dirname(__file__) + "/roi/ZRV.shp", availableAreaName, "ogr")
        if not shpLayer.isValid():
            self._show_message("Некорректные данные", "Некорректный файл с зоной охвата")
            return
        intersectionGeom = None
        for feature in shpLayer.getFeatures():
            if feature.geometry().intersects(polygonGeometry):
                intersectionGeom = feature.geometry().intersection(polygonGeometry)

        if intersectionGeom == None:
            layersList = pjt.mapLayersByName(availableAreaName)
            if layersList is not None and len(layersList) > 0:
                pjt.removeMapLayer(layersList[0])

            symbols = shpLayer.renderer().symbols(QgsRenderContext())
            symbols[0].setColor(QColor(76, 205, 53, 84))
            pjt.addMapLayer(shpLayer, False)
            if pjt.layerTreeRoot().findGroup(self.tr(self.groupName)) is None:
                pjt.layerTreeRoot().insertChildNode(0, QgsLayerTreeGroup(self.tr(self.groupName)))
            group = pjt.layerTreeRoot().findGroup(self.tr(self.groupName))
            group.addLayer(shpLayer)
            self.iface.layerTreeView().refreshLayerSymbology(shpLayer.id())
            geom = self.geomTransform(
                list(shpLayer.getFeatures())[0].geometry(),
                QgsCoordinateReferenceSystem(4326),
                self.iface.mapCanvas().mapSettings().destinationCrs())
            self.iface.mapCanvas().setExtent(geom.boundingBox())
            self.iface.mapCanvas().refresh()

            self._show_message("Некорректные данные", "Полигон поиска лежит за пределами зоны охвата")
            return

        self.polygon = intersectionGeom.asWkt()
        # print("polygon=", self.polygon)

        self.__toggle(False, True)
        self.getDataButton.setEnabled(False)
        QApplication.setOverrideCursor(Qt.WaitCursor)
        self.__show_status_label(StatusMessageType.LOAD_STARTED)
        self.dataRequest.dataRequest(clId, clSecret, dateTimeFrom, dateTimeTo, self.polygon)
Пример #27
0
    def btnLaunchAction(self):
        """btnLaunch action"""

        # Paramètres du web service IGN de calcul d'isochrone
        x = 2.424626
        y = 48.845793
        location = '{},{}'.format(x, y)
        method = 'time'  # time distance
        graphname = 'Voiture'  # Voiture Pieton
        time = 90 * 60  # si method time
        distance = 100000  # si method distance
        holes = False  # True False
        smoothing = True  # True False
        epsg = 4326
        apiKey = 'choisirgeoportail'

        # Paramètres de symbologie
        fillRed = QColor(251, 154, 153)
        fillBlue = QColor(166, 206, 227)
        fillGreen = QColor(178, 223, 138)
        fillColor = fillGreen
        strokeRed = QColor(251, 154, 153)
        strokeBlue = QColor(31, 120, 180)
        strokeGreen = QColor(51, 160, 44)
        strokeColor = strokeGreen
        borderWidth = 0.4
        opacity = 0.7

        # url du service de calcul
        if method == 'time':
            param = 'time={}'.format(time)
        elif method == 'distance':
            param = 'distance={}'.format(distance)

        url = '''
            https://wxs.ign.fr/{}/isochrone/isochrone.xml?location={}&method={}&graphName={}&exclusions=&{}&holes={}&smoothing={}
        '''.format(apiKey, location, method, graphname, param, holes,
                   smoothing)
        print(url)

        # Récupération du User-Agent QGIS
        s = QgsSettings()
        userAgent = s.value('/qgis/networkAndProxy/userAgent', 'Mozilla/5.0')
        headers = {'User-Agent': userAgent}

        # Appel du service
        #xmlResponse = requests.get(url, timeout=10)
        xmlResponse = requests.get(url, headers=headers)
        print(xmlResponse)

        # Décodage de la réponse et récupération de la géométrie
        root = ElementTree.fromstring(xmlResponse.content)
        wktGeometry = root.find('wktGeometry')
        #print(wktGeometry.text)
        if wktGeometry is not None:

            # Construction de la requête sql
            sql = '''
                select st_geomfromtext('{}', {}) geom
            '''.format(wktGeometry.text, epsg)
            #print(sql)

            # Construction de la couche virtuelle
            if method == 'time':
                libLayer = '{}_{}_minutes'.format(graphname, int(time / 60))
            elif method == 'distance':
                libLayer = '{}_{}_kilometres'.format(graphname,
                                                     int(distance / 1000))
            vLayer = QgsVectorLayer('?query={}'.format(sql), libLayer,
                                    'virtual')
            #symbol = QgsFillSymbol()
            #symbol.setColor(fillColor)
            symbolLayer = QgsSimpleFillSymbolLayer()
            symbolLayer.setStrokeWidth(borderWidth)
            symbolLayer.setStrokeColor(strokeColor)
            symbolLayer.setFillColor(fillColor)
            vLayer.renderer().symbols(QgsRenderContext())[0].changeSymbolLayer(
                0, symbolLayer)
            vLayer.setOpacity(opacity)  # Pour essai
            QgsProject.instance().addMapLayer(vLayer)

        else:
            print('Échec de l\'appel du service')
    def testMatchToSymbols(self):
        """
        Test QgsCategorizedSymbolRender.matchToSymbols
        """
        renderer = QgsCategorizedSymbolRenderer()
        renderer.setClassAttribute('x')

        symbol_a = createMarkerSymbol()
        symbol_a.setColor(QColor(255, 0, 0))
        renderer.addCategory(QgsRendererCategory('a', symbol_a, 'a'))
        symbol_b = createMarkerSymbol()
        symbol_b.setColor(QColor(0, 255, 0))
        renderer.addCategory(QgsRendererCategory('b', symbol_b, 'b'))
        symbol_c = createMarkerSymbol()
        symbol_c.setColor(QColor(0, 0, 255))
        renderer.addCategory(QgsRendererCategory('c ', symbol_c, 'c'))

        matched, unmatched_cats, unmatched_symbols = renderer.matchToSymbols(
            None, QgsSymbol.Marker)
        self.assertEqual(matched, 0)

        style = QgsStyle()
        symbol_a = createMarkerSymbol()
        symbol_a.setColor(QColor(255, 10, 10))
        self.assertTrue(style.addSymbol('a', symbol_a))
        symbol_B = createMarkerSymbol()
        symbol_B.setColor(QColor(10, 255, 10))
        self.assertTrue(style.addSymbol('B ', symbol_B))
        symbol_b = createFillSymbol()
        symbol_b.setColor(QColor(10, 255, 10))
        self.assertTrue(style.addSymbol('b', symbol_b))
        symbol_C = createLineSymbol()
        symbol_C.setColor(QColor(10, 255, 10))
        self.assertTrue(style.addSymbol('C', symbol_C))
        symbol_C = createMarkerSymbol()
        symbol_C.setColor(QColor(10, 255, 10))
        self.assertTrue(style.addSymbol(' ----c/- ', symbol_C))

        # non-matching symbol type
        matched, unmatched_cats, unmatched_symbols = renderer.matchToSymbols(
            style, QgsSymbol.Line)
        self.assertEqual(matched, 0)
        self.assertEqual(unmatched_cats, ['a', 'b', 'c '])
        self.assertEqual(unmatched_symbols, [' ----c/- ', 'B ', 'C', 'a', 'b'])

        # exact match
        matched, unmatched_cats, unmatched_symbols = renderer.matchToSymbols(
            style, QgsSymbol.Marker)
        self.assertEqual(matched, 1)
        self.assertEqual(unmatched_cats, ['b', 'c '])
        self.assertEqual(unmatched_symbols, [' ----c/- ', 'B ', 'C', 'b'])

        # make sure symbol was applied
        context = QgsRenderContext()
        renderer.startRender(context, QgsFields())
        symbol, ok = renderer.symbolForValue2('a')
        self.assertTrue(ok)
        self.assertEqual(symbol.color().name(), '#ff0a0a')
        renderer.stopRender(context)

        # case insensitive match
        matched, unmatched_cats, unmatched_symbols = renderer.matchToSymbols(
            style, QgsSymbol.Marker, False)
        self.assertEqual(matched, 2)
        self.assertEqual(unmatched_cats, ['c '])
        self.assertEqual(unmatched_symbols, [' ----c/- ', 'C', 'b'])

        # make sure symbols were applied
        context = QgsRenderContext()
        renderer.startRender(context, QgsFields())
        symbol, ok = renderer.symbolForValue2('a')
        self.assertTrue(ok)
        self.assertEqual(symbol.color().name(), '#ff0a0a')
        symbol, ok = renderer.symbolForValue2('b')
        self.assertTrue(ok)
        self.assertEqual(symbol.color().name(), '#0aff0a')
        renderer.stopRender(context)

        # case insensitive match
        matched, unmatched_cats, unmatched_symbols = renderer.matchToSymbols(
            style, QgsSymbol.Marker, False)
        self.assertEqual(matched, 2)
        self.assertEqual(unmatched_cats, ['c '])
        self.assertEqual(unmatched_symbols, [' ----c/- ', 'C', 'b'])

        # make sure symbols were applied
        context = QgsRenderContext()
        renderer.startRender(context, QgsFields())
        symbol, ok = renderer.symbolForValue2('a')
        self.assertTrue(ok)
        self.assertEqual(symbol.color().name(), '#ff0a0a')
        symbol, ok = renderer.symbolForValue2('b')
        self.assertTrue(ok)
        self.assertEqual(symbol.color().name(), '#0aff0a')
        renderer.stopRender(context)

        # tolerant match
        matched, unmatched_cats, unmatched_symbols = renderer.matchToSymbols(
            style, QgsSymbol.Marker, True, True)
        self.assertEqual(matched, 2)
        self.assertEqual(unmatched_cats, ['b'])
        self.assertEqual(unmatched_symbols, ['B ', 'C', 'b'])

        # make sure symbols were applied
        context = QgsRenderContext()
        renderer.startRender(context, QgsFields())
        symbol, ok = renderer.symbolForValue2('a')
        self.assertTrue(ok)
        self.assertEqual(symbol.color().name(), '#ff0a0a')
        symbol, ok = renderer.symbolForValue2('c ')
        self.assertTrue(ok)
        self.assertEqual(symbol.color().name(), '#0aff0a')
        renderer.stopRender(context)

        # tolerant match, case insensitive
        matched, unmatched_cats, unmatched_symbols = renderer.matchToSymbols(
            style, QgsSymbol.Marker, False, True)
        self.assertEqual(matched, 3)
        self.assertFalse(unmatched_cats)
        self.assertEqual(unmatched_symbols, ['C', 'b'])

        # make sure symbols were applied
        context = QgsRenderContext()
        renderer.startRender(context, QgsFields())
        symbol, ok = renderer.symbolForValue2('a')
        self.assertTrue(ok)
        self.assertEqual(symbol.color().name(), '#ff0a0a')
        symbol, ok = renderer.symbolForValue2('b')
        self.assertTrue(ok)
        self.assertEqual(symbol.color().name(), '#0aff0a')
        symbol, ok = renderer.symbolForValue2('c ')
        self.assertTrue(ok)
        self.assertEqual(symbol.color().name(), '#0aff0a')
        renderer.stopRender(context)
Пример #29
0
def setSelectFeatures(canvas,
                      selectGeometry,
                      doContains,
                      doDifference,
                      singleSelect=None):
    """
    QgsMapCanvas* canvas,
    QgsGeometry* selectGeometry,
    bool doContains,
    bool doDifference,
    bool singleSelect 
    """
    if selectGeometry.type() != QGis.Polygon:
        return

    vlayer = getCurrentVectorLayer(canvas)

    if vlayer == None:
        return

    #toLayerCoordinates will throw an exception for any 'invalid' points in
    #the rubber band.
    #For example, if you project a world map onto a globe using EPSG 2163
    #and then click somewhere off the globe, an exception will be thrown.
    selectGeomTrans = QgsGeometry(selectGeometry)

    if canvas.mapSettings().hasCrsTransformEnabled():
        try:
            ct = QgsCoordinateTransform(canvas.mapSettings().destinationCrs(),
                                        vlayer.crs())
            selectGeomTrans.transform(ct)
        except QgsCsException as cse:
            Q_UNUSED(cse)
            #catch exception for 'invalid' point and leave existing selection unchanged
            """
            QgsLogger::warning( "Caught CRS exception " + QString( __FILE__ ) + ": " + QString::number( __LINE__ ) );
            QgisApp::instance()->messageBar()->pushMessage(
            QObject::tr( "CRS Exception" ),
            QObject::tr( "Selection extends beyond layer's coordinate system" ),
            QgsMessageBar::WARNING,
            QgisApp::instance()->messageTimeout() );
            """
            return

    QApplication.setOverrideCursor(Qt.WaitCursor)
    """
    QgsDebugMsg( "Selection layer: " + vlayer->name() );
    QgsDebugMsg( "Selection polygon: " + selectGeomTrans.exportToWkt() );
    QgsDebugMsg( "doContains: " + QString( doContains ? "T" : "F" ) );
    QgsDebugMsg( "doDifference: " + QString( doDifference ? "T" : "F" ) );
    """

    context = QgsRenderContext().fromMapSettings(canvas.mapSettings())
    r = vlayer.rendererV2()

    if r:
        r.startRender(context, vlayer.pendingFields())

    request = QgsFeatureRequest()
    request.setFilterRect(selectGeomTrans.boundingBox())
    request.setFlags(QgsFeatureRequest.ExactIntersect)

    if r:
        request.setSubsetOfAttributes(r.usedAttributes(),
                                      vlayer.pendingFields())
    else:
        request.setSubsetOfAttributes(QgsAttributeList)

    fit = vlayer.getFeatures(request)

    newSelectedFeatures = []  #QgsFeatureIds
    f = QgsFeature()
    closestFeatureId = 0  #QgsFeatureId
    foundSingleFeature = False
    #double closestFeatureDist = std::numeric_limits<double>::max();
    closestFeatureDist = sys.float_info.max

    while fit.nextFeature(f):
        # make sure to only use features that are visible
        if r and not r.willRenderFeature(f):
            continue
        g = QgsGeometry(f.geometry())
        if doContains:
            if not selectGeomTrans.contains(g):
                continue
        else:
            if not selectGeomTrans.intersects(g):
                continue
        if singleSelect:
            foundSingleFeature = True
            distance = float(g.distance(selectGeomTrans))
            if (distance <= closestFeatureDist):
                closestFeatureDist = distance
                closestFeatureId = f.id()
        else:
            newSelectedFeatures.insert(0, f.id())

    if singleSelect and foundSingleFeature:
        newSelectedFeatures.insert(0, closestFeatureId)
    if r:
        r.stopRender(context)
    #QgsDebugMsg( "Number of new selected features: " + QString::number( newSelectedFeatures.size() )

    if doDifference:
        layerSelectedFeatures = vlayer.selectedFeaturesIds()

        selectedFeatures = []  #QgsFeatureIds
        deselectedFeatures = []  # QgsFeatureIds

        # i = QgsFeatureIds.const_iterator(newSelectedFeatures.constEnd())
        # while i != newSelectedFeatures.constBegin():
        #     i = i - 1
        #     if layerSelectedFeatures.contains(i):
        #         deselectedFeatures.insert(0, i)
        #     else:
        #         selectedFeatures.insert(0, i)

        for item in newSelectedFeatures:
            if item in layerSelectedFeatures:
                deselectedFeatures.insert(0, item)
            else:
                selectedFeatures.insert(0, item)

        vlayer.modifySelection(selectedFeatures, deselectedFeatures)
    else:
        vlayer.setSelectedFeatures(newSelectedFeatures)

    QApplication.restoreOverrideCursor()
    """