Пример #1
0
    def testQgsSvgMarkerSymbolLayerV2(self):
        '''
        Create a new style from a .sld file and match test
        '''
        mTestName = 'QgsSvgMarkerSymbolLayerV2'
        mFilePath = QDir.toNativeSeparators('%s/symbol_layer/%s.sld' % (unitTestDataPath(), mTestName))

        mDoc = QDomDocument(mTestName)
        mFile = QFile(mFilePath)
        mFile.open(QIODevice.ReadOnly)
        mDoc.setContent(mFile,True)
        mFile.close()
        mSymbolLayer = QgsSvgMarkerSymbolLayerV2.createFromSld(mDoc.elementsByTagName('PointSymbolizer').item(0).toElement())

        mExpectedValue = type(QgsSvgMarkerSymbolLayerV2())
        mValue = type(mSymbolLayer)
        mMessage = 'Expected "%s" got "%s"' % (mExpectedValue,mValue)
        assert mExpectedValue == mValue, mMessage

        mExpectedValue = u'skull.svg'
        mValue = os.path.basename(mSymbolLayer.path())
        print "VALUE", mSymbolLayer.path()
        mMessage = 'Expected "%s" got "%s"' % (mExpectedValue,mValue)
        assert mExpectedValue == mValue, mMessage

        mExpectedValue = 12
        mValue = mSymbolLayer.size()
        mMessage = 'Expected "%s" got "%s"' % (mExpectedValue,mValue)
        assert mExpectedValue == mValue, mMessage

        mExpectedValue = 45
        mValue = mSymbolLayer.angle()
        mMessage = 'Expected "%s" got "%s"' % (mExpectedValue,mValue)
        assert mExpectedValue == mValue, mMessage
def getSymbolLayer(folder, svg, size):
    '''
    Returns a symbol layer correspoding to a given filename
    '''
    svg = svg + '.svg'
    root = os.path.join(os.path.dirname(__file__), 'svg', folder)
    filepath = None
    '''
    Find the file in the folder where all subsymbol SVGs are stored, from the 
    passed filename.
    '''
    for base, dirs, files in os.walk(root):
        matching = fnmatch.filter(files, svg)
        if matching:
            filepath = os.path.join(base, matching[0])
            break
    '''
    Create the symbol layer from the SVG file
    '''
    if filepath is not None:
        symbolLayer = QgsSvgMarkerSymbolLayerV2()
        symbolLayer.setPath(filepath)
        '''
        This tells QGIS that the size is expressed in pixels, so the marker
        would be rendered at the same size in the screen for all zoom levels. 
        To have a marker that is rendered at a different size depending on the
        scale, you can use QgsSymbolV2.MapUnit as the size unit.
        '''
        symbolLayer.setSizeUnit(QgsSymbolV2.Pixel)
        symbolLayer.setSize(size)
        return symbolLayer
    else:
        return None
Пример #3
0
    def make_svg_link_sym_renderer(self, icon_name, svg_size=7, line_width=0.2):

        symbol = QgsLineSymbolV2().createSimple({})
        symbol.deleteSymbolLayer(0)

        # Line
        line_sym_lay = QgsSimpleLineSymbolLayerV2()
        line_sym_lay.setWidth(line_width)
        symbol.appendSymbolLayer(line_sym_lay)

        # Symbol
        self.marker_sym = QgsMarkerSymbolV2.createSimple({})
        self.marker_sym.deleteSymbolLayer(0)

        # marker_sym_lay = QgsSimpleMarkerSymbolLayerV2()
        current_dir = os.path.dirname(__file__)
        svg_props = dict()
        svg_props['name'] = os.path.join(current_dir, icon_name)
        svg_props['size'] = str(svg_size)
        marker_sym_lay = QgsSvgMarkerSymbolLayerV2().create(svg_props)
        self.marker_sym.appendSymbolLayer(marker_sym_lay)

        marker_line_sym_lay = QgsMarkerLineSymbolLayerV2()
        marker_line_sym_lay.setSubSymbol(self.marker_sym)  # Causes crash !!!
        marker_line_sym_lay.setPlacement(QgsMarkerLineSymbolLayerV2.CentralPoint)

        symbol.appendSymbolLayer(marker_line_sym_lay)

        renderer = QgsSingleSymbolRendererV2(symbol)
        return renderer
def getDefaultSymbol(size):
    symbol = QgsMarkerSymbolV2()
    symbolLayer = QgsSvgMarkerSymbolLayerV2()
    symbolLayer.setPath(
        os.path.join(os.path.dirname(__file__), 'svg', 'question.svg'))
    symbolLayer.setSizeUnit(3)
    symbolLayer.setSize(size)
    symbol.insertSymbolLayer(0, symbolLayer)
    return symbol
Пример #5
0
    def make_svg_node_sym_renderer(self, vlay, icon_name, size):

        current_dir = os.path.dirname(__file__)

        svg_style = dict()
        svg_style['name'] = os.path.join(current_dir, icon_name)
        svg_style['size'] = str(size)
        symbol_layer = QgsSvgMarkerSymbolLayerV2.create(svg_style)
        symbol = QgsSymbolV2.defaultSymbol(vlay.geometryType())
        symbol.changeSymbolLayer(0, symbol_layer)
        renderer = QgsSingleSymbolRendererV2(symbol)

        return renderer
def getSymbolLayer(folder, svg, size):
    svg = svg + '.svg'
    root = os.path.join(os.path.dirname(__file__), 'svg', folder)
    filepath = None
    for base, dirs, files in os.walk(root):
        matching = fnmatch.filter(files, svg)
        if matching:
            filepath = os.path.join(base, matching[0])
            break
    if filepath is not None:
        symbolLayer = QgsSvgMarkerSymbolLayerV2()
        symbolLayer.setPath(filepath)
        symbolLayer.setSizeUnit(3)
        symbolLayer.setSize(size)
        return symbolLayer
    else:
        return None
Пример #7
0
    def __init__(self,
                 iface,
                 layer_name,
                 svg_size,
                 attributes,
                 svg_resource,
                 group=None,
                 visible=True):
        "..."
        self.svg_path = os.path.dirname(__file__) + "/icons/"
        WGS84Layer.__init__(self, iface, layer_name, "Point", visible, group)

        props = self.layer.rendererV2().symbol().symbolLayer(0).properties()
        svgStyle = {}
        svgStyle['name'] = self.svg_path + svg_resource
        svgStyle['outline'] = '#00000'
        svgStyle['outline-width'] = '0'
        svgStyle['size'] = svg_size
        symbol_layer = QgsSvgMarkerSymbolLayerV2.create(svgStyle)

        # Rotate the svg to reflect the orientation of a landmark
        # admap uses a counter-clockwise orientation with radians, qgis a clockwise and degrees
        dataDefinedAngle = QgsDataDefined(
            True, True, '(-("Orientation" * 180 / pi()) - 90) % 360')
        symbol_layer.setDataDefinedProperty('angle', dataDefinedAngle)

        # Make the SVG size scalable with the zoom level of the map
        # i.e. less zoom, smaller SVG
        dataDefinedSize = QgsDataDefined(
            True, True,
            'CASE WHEN @map_scale < 500 THEN 1000 / @map_scale ELSE 2 END')
        symbol_layer.setDataDefinedProperty('size', dataDefinedSize)
        self.layer.rendererV2().symbols()[0].changeSymbolLayer(0, symbol_layer)

        WGS84Layer.refresh_legend(self)
        self.set_attributes(attributes)
Пример #8
0
    def WPT2Layer(self):
        mapUnits = define._canvas.mapUnits()
        if define._mapCrs == None:
            if mapUnits == QGis.Meters:
                resultLayer = QgsVectorLayer(
                    "Point?crs=EPSG:32633", "WPT_" +
                    self.surfaceType.replace(" ", "_").replace("-", "_"),
                    "memory")
            else:
                resultLayer = QgsVectorLayer(
                    "Point?crs=EPSG:4326", "WPT_" +
                    self.surfaceType.replace(" ", "_").replace("-", "_"),
                    "memory")
        else:
            resultLayer = QgsVectorLayer(
                "Point?crs=%s" % define._mapCrs.authid(),
                "WPT_" + self.surfaceType.replace(" ", "_").replace("-", "_"),
                "memory")
        shpPath = ""
        if define.obstaclePath != None:
            shpPath = define.obstaclePath
        elif define.xmlPath != None:
            shpPath = define.xmlPath
        else:
            shpPath = define.appPath
        er = QgsVectorFileWriter.writeAsVectorFormat(
            resultLayer,
            shpPath + "/" + "RnavTurningSegmentAnalyserWpt" + ".shp", "utf-8",
            resultLayer.crs())
        resultLayer = QgsVectorLayer(
            shpPath + "/" + "RnavTurningSegmentAnalyserWpt" + ".shp",
            "WPT_RnavTurningSegmentAnalyser", "ogr")

        fieldName = "CATEGORY"
        resultLayer.dataProvider().addAttributes(
            [QgsField(fieldName, QVariant.String)])
        resultLayer.startEditing()
        fields = resultLayer.pendingFields()
        i = 1
        feature = QgsFeature()
        feature.setFields(fields)

        feature.setGeometry(
            QgsGeometry.fromPoint(self.parametersPanel.pnlWaypoint1.Point3d))
        feature.setAttribute(fieldName, "Waypoint1")
        pr = resultLayer.dataProvider()
        pr.addFeatures([feature])
        # resultLayer.addFeature(feature)
        feature.setGeometry(
            QgsGeometry.fromPoint(self.parametersPanel.pnlWaypoint2.Point3d))
        feature.setAttribute(fieldName, "Waypoint2")
        pr = resultLayer.dataProvider()
        pr.addFeatures([feature])
        # resultLayer.addFeature(feature)
        resultLayer.commitChanges()

        renderCatFly = None
        if self.parametersPanel.cmbType1.SelectedIndex == 1:
            '''FlyOver'''

            symbolFlyOver = QgsSymbolV2.defaultSymbol(
                resultLayer.geometryType())
            symbolFlyOver.deleteSymbolLayer(0)
            svgSymLayer = QgsSvgMarkerSymbolLayerV2("Resource/flyover.svg",
                                                    10.0, 0.0)
            symbolFlyOver.appendSymbolLayer(svgSymLayer)
            renderCatFly = QgsRendererCategoryV2(0, symbolFlyOver, "Fly Over")
        elif self.parametersPanel.cmbType1.SelectedIndex == 0:
            '''FlyBy'''
            symbolFlyBy = QgsSymbolV2.defaultSymbol(resultLayer.geometryType())
            symbolFlyBy.deleteSymbolLayer(0)
            svgSymLayer = QgsSvgMarkerSymbolLayerV2("Resource/flyby.svg", 10.0,
                                                    0.0)
            symbolFlyBy.appendSymbolLayer(svgSymLayer)
            renderCatFly = QgsRendererCategoryV2(0, symbolFlyBy, "Fly By")
        else:
            return None
        WPT_EXPRESION = "CASE WHEN  \"CATEGORY\" = 'Waypoint1'  THEN 0 " + \
                                        "END"
        symRenderer = QgsCategorizedSymbolRendererV2(WPT_EXPRESION,
                                                     [renderCatFly])

        resultLayer.setRendererV2(symRenderer)
        return resultLayer
Пример #9
0
    def run(self):
        """Run method that performs all the real work"""

        #field_expression_widget.show()
        self.dlg.show()
        #set in combobox layer to active layer
        try:
            QgsMessageLog.logMessage("changing layer to selected in legend",
                                     tag="SvgBubble")
            selectedLayer = self.iface.activeLayer(
            )  #iface.legendInterface().selectedLayers()
            self.dlg.lyrCombobox.setLayer(selectedLayer)
        except:
            QgsMessageLog.logMessage("cant set selected layer",
                                     tag="SvgBubble")

        # Run the dialog event loop
        result = self.dlg.exec_()
        # See if OK was pressed
        if result:
            QgsMessageLog.logMessage("Start calculate values", tag="SvgBubble")
            layer = self.dlg.lyrCombobox.currentLayer()
            self.iface.setActiveLayer(layer)
            LAYER_NAME = layer.id()  #.name()
            PROJECT_PATH = QgsProject.instance().readPath("./")
            QgsMessageLog.logMessage("Folder={} Layer={}".format(
                PROJECT_PATH, LAYER_NAME),
                                     tag="SvgBubble")
            provider = layer.dataProvider()
            #QMessageBox.information(None, "Layer info", ",".join(map(lambda x:x.currentText(),exprs)))
            # Add new column to layer
            idx = provider.fieldNameIndex(C_SVG_NAME)
            if idx == -1:
                QgsMessageLog.logMessage("Create field={}".format(C_SVG_NAME),
                                         tag="SvgBubble")
                provider.addAttributes([QgsField(C_SVG_NAME, QVariant.String)])
            idx = provider.fieldNameIndex(C_SVG_RADIUS)
            if idx == -1:
                QgsMessageLog.logMessage(
                    "Create field={}".format(C_SVG_RADIUS), tag="SvgBubble")
                provider.addAttributes(
                    [QgsField(C_SVG_RADIUS, QVariant.Double, 'double', 20, 2)])
            layer.updateFields()
            ##############  UPDATE VIRTUAL FIELD
            QgsMessageLog.logMessage("Create field={}".format(C_SVG_PATH),
                                     tag="SvgBubble")
            caps_string = layer.dataProvider().capabilitiesString()
            QgsMessageLog.logMessage(
                "Layer capabilities={}".format(caps_string), tag="SvgBubble")

            isExpPresent = False
            field = QgsField(C_SVG_PATH, QVariant.String)
            field_exp = "eval('@project_folder')+'/{}/'+ \"{}\"".format(
                LAYER_NAME, C_SVG_NAME)
            for _idx, atr in enumerate(layer.pendingFields()):
                QgsMessageLog.logMessage("All fields=[{}]{}".format(
                    str(_idx), str(atr.name())),
                                         tag="SvgBubble")
                if atr.name() == C_SVG_PATH:
                    QgsMessageLog.logMessage("Old layer idx={}".format(
                        str(_idx)),
                                             tag="SvgBubble")
                    #layer.removeExpressionField(_idx) #not work
                    #layer.deleteAttribute(_idx)       #not work on expression
                    layer.updateExpressionField(_idx, field_exp)
                    isExpPresent = True
                    QgsMessageLog.logMessage(
                        "Field {} updated".format(C_SVG_PATH), tag="SvgBubble")
                    break
            if not isExpPresent:
                layer.addExpressionField(field_exp, field)
                QgsMessageLog.logMessage("Field {} created".format(C_SVG_PATH),
                                         tag="SvgBubble")
            QgsMessageLog.logMessage("Field func={}".format(field_exp),
                                     tag="SvgBubble")
            layer.updateFields()
            #############   start edit layer feature
            layer.startEditing()
            # Set new column value
            QgsMessageLog.logMessage("Start updating table data",
                                     tag="SvgBubble")
            preset_rows = self.dlg.preset_rows
            svg_drawer = SvgDrawer("{}/{}".format(PROJECT_PATH, LAYER_NAME))
            for f in layer.getFeatures():
                #well_idx = layer.fieldNameIndex('well_id')
                #QgsMessageLog.logMessage(str(f.attributes()[well_idx]), tag="SvgBubble")
                #values=map(lambda x:x.evaluate(f),exp_lst)#exp.evaluate(f)
                #QMessageBox.information(None, "Layer info",str(values))  #!!!!!DEBUG
                preset_rows.setFeature(f)
                bubles = {}
                for key, presets in preset_rows.asDict().items():
                    bubl_parts = []
                    for preset in presets:
                        QgsMessageLog.logMessage(str(preset.exp_txt),
                                                 tag="SvgBubble",
                                                 level=3)
                        val = preset.execute()
                        QgsMessageLog.logMessage(str(val),
                                                 tag="SvgBubble",
                                                 level=3)
                        color = preset.color_hex
                        if val is None: continue
                        else: bubl_parts.append([color, val])
                        #QMessageBox.information(None, "execute info","{}:{}".format(key,str(bubl_parts)))  #!!!!!DEBUG
                    if len(bubl_parts) > 0:
                        bubles[key] = bubl_parts
                    else:
                        pass
                QgsMessageLog.logMessage(str(bubles), tag="SvgBubble", level=3)
                svg_name, svg_size = svg_drawer.to_multibubl_svg(bubles)
                QgsMessageLog.logMessage(str(svg_name),
                                         tag="SvgBubble",
                                         level=2)
                #QMessageBox.information(None, "Execute result saved to",str(res_path))  #!!!!!DEBUG
                if not svg_name is None:
                    layer.changeAttributeValue(
                        f.id(), layer.fieldNameIndex(C_SVG_NAME), svg_name)
                    layer.changeAttributeValue(
                        f.id(), layer.fieldNameIndex(C_SVG_RADIUS), svg_size)
            QgsMessageLog.logMessage("End feature iterator", tag="SvgBubble")
            layer.commitChanges()
            # create a new rule-based renderer
            # get the "root" rule
            svgStyle = {}
            svgStyle['name'] = '"bubbl"'
            svgStyle["name_dd_active"] = "1"
            svgStyle["name_dd_expression"] = ""
            svgStyle['name_dd_field'] = C_SVG_PATH
            svgStyle['name_dd_useexpr'] = "0"
            svgStyle["offset"] = "0.0"
            svgStyle["scale_method"] = "diameter"
            svgStyle["size"] = "1"
            svgStyle["size_dd_active"] = "1"
            svgStyle["size_dd_expression"] = '"{}"/1000'.format(C_SVG_RADIUS)
            svgStyle['size_dd_field'] = ''
            svgStyle['size_dd_useexpr'] = "1"
            svgStyle['idx'] = "bubbl_layer"
            symbol_layer = QgsSvgMarkerSymbolLayerV2.create(svgStyle)
            symbol = QgsSymbolV2.defaultSymbol(layer.geometryType())

            renderer = QgsSingleSymbolRendererV2(symbol)
            QgsMessageLog.logMessage("set renderer", tag="SvgBubble")
            # assign the created renderer to the layer
            isSvgVisible = False
            for _idx_sym, preset_sym in enumerate(
                    layer.rendererV2().symbols()):
                for _idx_symlyr, preset_symlyr in enumerate(
                        preset_sym.symbolLayers()):
                    lyr_type = preset_symlyr.layerType()
                    lyr_prop = preset_symlyr.properties()
                    if lyr_type == "SvgMarker" and lyr_prop[
                            "name_dd_field"] == C_SVG_PATH:
                        QgsMessageLog.logMessage("symbollayer properties=" +
                                                 str(lyr_prop),
                                                 tag="SvgBubble")
                        QgsMessageLog.logMessage("symbollayer type=" +
                                                 str(lyr_type),
                                                 tag="SvgBubble")
                        #renderer.symbols()[_idx_sym].changeSymbolLayer(_idx_symlyr, symbol_layer)
                        isSvgVisible = True
                        break
            if not isSvgVisible:
                #layer.rendererV2().symbols()[0].appendSymbolLayer(symbol_layer)
                layer.rendererV2().symbols()[0].insertSymbolLayer(
                    0, symbol_layer)

                #renderer.symbols()[0].changeSymbolLayer(0, symbol_layer)
            #if renderer is not None:   layer.setRendererV2(renderer)
            #layer.setRendererV2(renderer)
            QgsMessageLog.logMessage("repaint", tag="SvgBubble")
            layer.triggerRepaint()
            QgsMessageLog.logMessage("Finished", tag="SvgBubble")

            pass