예제 #1
0
def getLayerStyle(layer, sln, markerFolder):
    markerType = None
    renderer = layer.rendererV2()
    layer_alpha = layer.layerTransparency()
    style = ""
    if (isinstance(renderer, QgsSingleSymbolRendererV2)
            or isinstance(renderer, QgsRuleBasedRendererV2)):
        if isinstance(renderer, QgsRuleBasedRendererV2):
            symbol = renderer.rootRule().children()[0].symbol()
        else:
            symbol = renderer.symbol()
        (styleCode, markerType) = getSymbolAsStyle(symbol, markerFolder,
                                                   layer_alpha, sln)
        style = """
        function style_%s() {
            return %s
        }""" % (sln, styleCode)
    elif isinstance(renderer, QgsCategorizedSymbolRendererV2):
        classAttr = handleHiddenField(layer, renderer.classAttribute())
        style = """
        function style_%s(feature) {
            switch(feature.properties['%s']) {""" % (sln, classAttr)
        for cat in renderer.categories():
            (styleCode, markerType) = getSymbolAsStyle(cat.symbol(),
                                                       markerFolder,
                                                       layer_alpha, sln)
            style += """
                case '%s':
                    return %s
                    break;""" % (cat.value(), styleCode)
        style += """
            }
        }"""
    elif isinstance(renderer, QgsGraduatedSymbolRendererV2):
        classAttr = handleHiddenField(layer, renderer.classAttribute())
        style = """
        function style_%s(feature) {""" % (sln)
        for ran in renderer.ranges():
            (styleCode, markerType) = getSymbolAsStyle(ran.symbol(),
                                                       markerFolder,
                                                       layer_alpha, sln)
            style += """
            if (feature.properties['%(a)s'] >= %(l)f """
            style += """&& feature.properties['%(a)s'] <= %(u)f ) {
                return %(s)s
            }"""
            style = style % {
                "a": classAttr,
                "l": ran.lowerValue(),
                "u": ran.upperValue(),
                "s": styleCode
            }
        style += """
        }"""
    else:
        style = ""
    return style, markerType
def getLabels(layer, safeLayerName, outputProjectFileName):
    label_exp = ''
    labeltext = ""
    f = ''
    palyr = QgsPalLayerSettings()
    palyr.readFromLayer(layer)
    if palyr.enabled and palyr.fieldName and palyr.fieldName != "":
        bgColor = palyr.shapeFillColor.name()
        borderWidth = palyr.shapeBorderWidth
        borderColor = palyr.shapeBorderColor.name()
        x = palyr.shapeSize.x()
        y = palyr.shapeSize.y()
        font = palyr.textFont
        fontSize = font.pointSize()
        fontFamily = font.family()
        fontItalic = font.italic()
        fontBold = font.bold()
        fontColor = palyr.textColor.name()
        fontUnderline = font.underline()
        xOffset = palyr.xOffset
        yOffset = palyr.yOffset
        styleStart = "'<div style=\"color: %s; font-size: %dpt; " % (fontColor,
                                                                     fontSize)
        if palyr.shapeDraw:
            styleStart += "background-color: %s; " % bgColor
            styleStart += "border: %dpx solid %s; " % (borderWidth,
                                                       borderColor)
            if palyr.shapeSizeType == 0:
                styleStart += "padding: %dpx %dpx; " % (y, x)
            if palyr.shapeSizeType == 1:
                styleStart += "width: %dpx; " % x
                styleStart += "height: %dpx; " % y
        if fontBold:
            styleStart += "font-weight: bold; "
        if fontItalic:
            styleStart += "font-style: italic; "
        styleStart += "font-family: \\'%s\\', sans-serif;\">' + " % fontFamily
        styleEnd = " + '</div>'"
        if palyr.isExpression and palyr.enabled:
            exprFilename = os.path.join(outputProjectFileName, "js",
                                        "qgis2web_expressions.js")
            name = compile_to_file(palyr.getLabelExpression(),
                                   "label_%s" % safeLayerName, "Leaflet",
                                   exprFilename)
            js = "%s(context)" % (name)
            js = js.strip()
            f = js
        else:
            f = "feature.properties['%s']" % handleHiddenField(
                layer, palyr.fieldName)
        labeltext = ".bindTooltip((" + unicode(f)
        labeltext += " !== null?String(%s%s)%s:'')" % (styleStart, unicode(f),
                                                       styleEnd)
        labeltext += ", {permanent: true, offset: [-0, -16], "
        labeltext += "className: 'css_%s'}" % safeLayerName
        labeltext += ").openTooltip();"
    else:
        labeltext = ""
    return labeltext
예제 #3
0
def labelsAndPopups(layer, safeLayerName, highlight, popupsOnHover, popup):
    fields = layer.pendingFields()
    field_names = popup.keys()
    field_vals = popup.values()
    html_prov = False
    label_exp = ''
    labeltext = ""
    f = ''
    palyr = QgsPalLayerSettings()
    palyr.readFromLayer(layer)
    bgColor = palyr.shapeFillColor.name()
    borderWidth = palyr.shapeBorderWidth
    borderColor = palyr.shapeBorderColor.name()
    x = palyr.shapeSize.x()
    y = palyr.shapeSize.y()
    font = palyr.textFont
    fontSize = font.pointSize()
    fontFamily = font.family()
    fontItalic = font.italic()
    fontBold = font.bold()
    fontColor = palyr.textColor.name()
    fontUnderline = font.underline()
    xOffset = palyr.xOffset
    yOffset = palyr.yOffset
    styleStart = "'<div style=\"color: %s; font-size: %dpt; " % (
            fontColor, fontSize)
    if palyr.shapeDraw:
        styleStart += "background-color: %s; " % bgColor
        styleStart += "border: %dpx solid %s; " % (borderWidth, borderColor)
        if palyr.shapeSizeType == 0:
            styleStart += "padding: %dpx %dpx; " % (y, x)
        if palyr.shapeSizeType == 1:
            styleStart += "width: %dpx; " % x
            styleStart += "height: %dpx; " % y
    if fontBold:
        styleStart += "font-weight: bold; "
    if fontItalic:
        styleStart += "font-style: italic; "
    styleStart += "font-family: \\'%s\\', sans-serif;\">' + " % fontFamily
    styleEnd = " + '</div>'"
    f = handleHiddenField(layer, palyr.fieldName)
    label_exp = False
    labeltext = ".bindTooltip((feature.properties['" + unicode(f)
    labeltext += "'] !== null?String(%sfeature.properties['%s'])%s:'')" % (
            styleStart, unicode(f), styleEnd)
    labeltext += ", {permanent: true, offset: [-0, -16], "
    labeltext += "className: 'css_%s'}" % safeLayerName
    labeltext += ").openTooltip();"
    f = palyr.fieldName
    table = ""
    for field in popup:
        if unicode(field) == 'html_exp':
            html_prov = True
            table = 'feature.properties.html_exp'
        if (unicode(f) != "" and
                f and palyr.enabled):
            label_exp = True
        if not html_prov:
            tablestart = "'<table>\\"
            row = ""
            for field, val in zip(field_names, field_vals):
                fieldIndex = fields.indexFromName(unicode(field))
                try:
                    formCfg = layer.editFormConfig()
                    editorWidget = formCfg.widgetType(fieldIndex)
                except:
                    editorWidget = layer.editorWidgetV2(fieldIndex)
                if (editorWidget == QgsVectorLayer.Hidden or
                        editorWidget == 'Hidden'):
                    continue

                row += """
                    <tr>\\"""
                if val == 'inline label':
                    row += """
                        <th scope="row">"""
                    row += layer.attributeDisplayName(fieldIndex)
                    row += """</th>\\
                        <td>"""
                else:
                    row += """
                        <td colspan="2">"""
                if val == "header label":
                    row += '<strong>'
                    row += layer.attributeDisplayName(fieldIndex)
                    row += '</strong><br />'
                row += "' + "
                row += "(feature.properties[\'" + unicode(field) + "\'] "
                row += "!== null ? "

                if (editorWidget == QgsVectorLayer.Photo or
                        editorWidget == 'Photo'):
                    row += "'<img src=\"images/' + "
                    row += "String(feature.properties['" + unicode(field)
                    row += "']).replace(/[\\\/:]/g, '_').trim()"
                    row += " + '\">' : '') + '"
                else:
                    row += "Autolinker.link("
                    row += "String(feature.properties['" + unicode(field)
                    row += "'])) : '') + '"

                row += """</td>\\
                    </tr>\\"""
            tableend = """
                </table>'"""
            table = tablestart + row + tableend
    if not label_exp:
        labeltext = ""
    if popup != 0 and table != "":
        popFuncs = popFuncsScript(table)
    else:
        popFuncs = ""
    new_pop = popupScript(safeLayerName, popFuncs, highlight, popupsOnHover)
    return new_pop, labeltext, popFuncs
예제 #4
0
def getValue(layer, renderer):
    classAttr = handleHiddenField(layer, renderer.classAttribute())
    value = ('var value = feature.get("%s");' % classAttr)
    return value
예제 #5
0
def getLayerStyle(layer, sln, markerFolder, outputProjectFilename):
    markerType = None
    renderer = layer.rendererV2()
    layer_alpha = layer.layerTransparency()
    style = ""
    if isinstance(renderer, QgsSingleSymbolRendererV2):
        symbol = renderer.symbol()
        (styleCode, markerType) = getSymbolAsStyle(symbol, markerFolder,
                                                   layer_alpha, sln)
        style = """
        function style_%s() {
            return %s
        }""" % (sln, styleCode)
    elif isinstance(renderer, QgsCategorizedSymbolRendererV2):
        classAttr = handleHiddenField(layer, renderer.classAttribute())
        style = """
        function style_%s(feature) {
            switch(feature.properties['%s']) {""" % (sln, classAttr)
        for cat in renderer.categories():
            (styleCode, markerType) = getSymbolAsStyle(cat.symbol(),
                                                       markerFolder,
                                                       layer_alpha, sln)
            if cat.value() != "":
                style += """
                case '%s':""" % cat.value()
            else:
                style += """
                default:"""
            style += """
                    return %s
                    break;""" % styleCode
        style += """
            }
        }"""
    elif isinstance(renderer, QgsGraduatedSymbolRendererV2):
        classAttr = handleHiddenField(layer, renderer.classAttribute())
        style = """
        function style_%s(feature) {""" % (sln)
        for ran in renderer.ranges():
            (styleCode, markerType) = getSymbolAsStyle(ran.symbol(),
                                                       markerFolder,
                                                       layer_alpha, sln)
            style += """
            if (feature.properties['%(a)s'] >= %(l)f """
            style += """&& feature.properties['%(a)s'] <= %(u)f ) {
                return %(s)s
            }"""
            style = style % {"a": classAttr, "l": ran.lowerValue(),
                             "u": ran.upperValue(),
                             "s": styleCode}
        style += """
        }"""
    elif isinstance(renderer, QgsRuleBasedRendererV2):
        template = """
        function style_%s(feature) {
            var context = {
                feature: feature,
                variables: {}
            };
            // Start of if blocks and style check logic
            %s
            else {
                return %s;
            }
        }
        """
        elsejs = "{fill: false, stroke: false}"
        js = ""
        root_rule = renderer.rootRule()
        rules = root_rule.children()
        expFile = os.path.join(outputProjectFilename, "js",
                               "qgis2web_expressions.js")
        ifelse = "if"
        for count, rule in enumerate(rules):
            (styleCode, markerType) = getSymbolAsStyle(rule.symbol(),
                                                       markerFolder,
                                                       layer_alpha, sln)
            name = "".join((sln, "rule", unicode(count)))
            exp = rule.filterExpression()
            if rule.isElse():
                elsejs = styleCode
                continue
            name = compile_to_file(exp, name, "Leaflet", expFile)
            js += """
            %s (%s(context)) {
              return %s;
            }
            """ % (ifelse, name, styleCode)
            js = js.strip()
            ifelse = "else if"
        style = template % (sln, js, elsejs)
    else:
        style = ""
    return style, markerType
예제 #6
0
def getLayerStyle(layer, sln, markerFolder, outputProjectFilename, useShapes):
    markerType = None
    renderer = layer.rendererV2()
    layer_alpha = layer.layerTransparency()
    style = ""
    if isinstance(renderer, QgsSingleSymbolRendererV2):
        symbol = renderer.symbol()
        for sl in xrange(symbol.symbolLayerCount()):
            (styleCode, markerType) = getSymbolAsStyle(symbol, markerFolder,
                                                       layer_alpha, sln, sl)
            style += """
        function style_%s_%s() {
            return %s
        }""" % (sln, sl, styleCode)
    elif isinstance(renderer, QgsCategorizedSymbolRendererV2):
        classAttr = handleHiddenField(layer, renderer.classAttribute())
        symbol = renderer.categories()[0].symbol()
        for sl in xrange(symbol.symbolLayerCount()):
            style += """
        function style_%s_%s(feature) {
            switch(feature.properties['%s'].toString()) {""" % (sln, sl,
                                                                classAttr)
            for cat in renderer.categories():
                (styleCode,
                 markerType) = getSymbolAsStyle(cat.symbol(), markerFolder,
                                                layer_alpha, sln, sl)
                if (cat.value() is not None and cat.value() != ""
                        and not isinstance(cat.value(), QPyNullVariant)):
                    style += """
                case '%s':""" % unicode(cat.value()).replace("'", "\\'")
                else:
                    style += """
                default:"""
                style += """
                    return %s
                    break;""" % styleCode
            style += """
            }
        }"""
    elif isinstance(renderer, QgsGraduatedSymbolRendererV2):
        classAttr = handleHiddenField(layer, renderer.classAttribute())
        symbol = renderer.ranges()[0].symbol()
        for sl in xrange(symbol.symbolLayerCount()):
            style += """
        function style_%s_%s(feature) {""" % (sln, sl)
            for ran in renderer.ranges():
                (styleCode,
                 markerType) = getSymbolAsStyle(ran.symbol(), markerFolder,
                                                layer_alpha, sln, sl)
                style += """
            if (feature.properties['%(a)s'] >= %(l)f """
                style += """&& feature.properties['%(a)s'] <= %(u)f ) {
                return %(s)s
            }"""
                style = style % {
                    "a": classAttr,
                    "l": ran.lowerValue(),
                    "u": ran.upperValue(),
                    "s": styleCode
                }
            style += """
        }"""
    elif isinstance(renderer, QgsRuleBasedRendererV2):
        symbol = renderer.rootRule().children()[0].symbol()
        for sl in xrange(symbol.symbolLayerCount()):
            template = """
        function style_%s_{sl}(feature) {{
            var context = {{
                feature: feature,
                variables: {{}}
            }};
            // Start of if blocks and style check logic
            %s
            else {{
                return %s;
            }}
        }}
        """.format(sl=sl)
            elsejs = "{fill: false, stroke: false}"
            js = ""
            root_rule = renderer.rootRule()
            rules = root_rule.children()
            expFile = os.path.join(outputProjectFilename, "js",
                                   "qgis2web_expressions.js")
            ifelse = "if"
            for count, rule in enumerate(rules):
                if rule.symbol().symbolLayer(sl) is not None:
                    (styleCode,
                     markerType) = getSymbolAsStyle(rule.symbol(),
                                                    markerFolder, layer_alpha,
                                                    sln, sl)
                    name = "".join((sln, "rule", unicode(count)))
                    exp = rule.filterExpression()
                    if rule.isElse():
                        elsejs = styleCode
                        continue
                    name = compile_to_file(exp, name, "Leaflet", expFile)
                    js += """
                %s (%s(context)) {
                  return %s;
                }
                """ % (ifelse, name, styleCode)
                    js = js.strip()
                    ifelse = "else if"
            style += template % (sln, js, elsejs)
    else:
        style = ""
    if markerType == "shapeMarker":
        useShapes = True
    return style, markerType, useShapes
예제 #7
0
def labelsAndPopups(layer, safeLayerName, highlight, popupsOnHover, popup,
                    outputProjectFileName):
    fields = layer.pendingFields()
    field_names = popup.keys()
    field_vals = popup.values()
    html_prov = False
    label_exp = ''
    labeltext = ""
    f = ''
    palyr = QgsPalLayerSettings()
    palyr.readFromLayer(layer)
    bgColor = palyr.shapeFillColor.name()
    borderWidth = palyr.shapeBorderWidth
    borderColor = palyr.shapeBorderColor.name()
    x = palyr.shapeSize.x()
    y = palyr.shapeSize.y()
    font = palyr.textFont
    fontSize = font.pointSize()
    fontFamily = font.family()
    fontItalic = font.italic()
    fontBold = font.bold()
    fontColor = palyr.textColor.name()
    fontUnderline = font.underline()
    xOffset = palyr.xOffset
    yOffset = palyr.yOffset
    styleStart = "'<div style=\"color: %s; font-size: %dpt; " % (
            fontColor, fontSize)
    if palyr.shapeDraw:
        styleStart += "background-color: %s; " % bgColor
        styleStart += "border: %dpx solid %s; " % (borderWidth, borderColor)
        if palyr.shapeSizeType == 0:
            styleStart += "padding: %dpx %dpx; " % (y, x)
        if palyr.shapeSizeType == 1:
            styleStart += "width: %dpx; " % x
            styleStart += "height: %dpx; " % y
    if fontBold:
        styleStart += "font-weight: bold; "
    if fontItalic:
        styleStart += "font-style: italic; "
    styleStart += "font-family: \\'%s\\', sans-serif;\">' + " % fontFamily
    styleEnd = " + '</div>'"
    if palyr.isExpression and palyr.enabled:
        exprFilename = os.path.join(outputProjectFileName, "js",
                                    "qgis2web_expressions.js")
        name = compile_to_file(palyr.getLabelExpression(),
                               "label_%s" % safeLayerName, "Leaflet",
                               exprFilename)
        js = "%s(context)" % (name)
        js = js.strip()
        f = js
    else:
        f = "feature.properties['%s']" % handleHiddenField(layer,
                                                           palyr.fieldName)
    label_exp = False
    labeltext = ".bindTooltip((" + unicode(f)
    labeltext += " !== null?String(%s%s)%s:'')" % (
            styleStart, unicode(f), styleEnd)
    labeltext += ", {permanent: true, offset: [-0, -16], "
    labeltext += "className: 'css_%s'}" % safeLayerName
    labeltext += ").openTooltip();"
    f = palyr.fieldName
    table = ""
    for field in popup:
        if unicode(field) == 'html_exp':
            html_prov = True
            table = 'feature.properties.html_exp'
        if (unicode(f) != "" and
                f and palyr.enabled):
            label_exp = True
        if not html_prov:
            tablestart = "'<table>\\"
            row = ""
            for field, val in zip(field_names, field_vals):
                fieldIndex = fields.indexFromName(unicode(field))
                try:
                    formCfg = layer.editFormConfig()
                    editorWidget = formCfg.widgetType(fieldIndex)
                except:
                    editorWidget = layer.editorWidgetV2(fieldIndex)
                if (editorWidget == QgsVectorLayer.Hidden or
                        editorWidget == 'Hidden'):
                    continue

                row += """
                    <tr>\\"""
                if val == 'inline label':
                    row += """
                        <th scope="row">"""
                    row += layer.attributeDisplayName(fieldIndex)
                    row += """</th>\\
                        <td>"""
                else:
                    row += """
                        <td colspan="2">"""
                if val == "header label":
                    row += '<strong>'
                    row += layer.attributeDisplayName(fieldIndex)
                    row += '</strong><br />'
                row += "' + "
                row += "(feature.properties[\'" + unicode(field) + "\'] "
                row += "!== null ? "

                if (editorWidget == QgsVectorLayer.Photo or
                        editorWidget == 'Photo'):
                    row += "'<img src=\"images/' + "
                    row += "String(feature.properties['" + unicode(field)
                    row += "']).replace(/[\\\/:]/g, '_').trim()"
                    row += " + '\">' : '') + '"
                else:
                    row += "Autolinker.link("
                    row += "String(feature.properties['" + unicode(field)
                    row += "'])) : '') + '"

                row += """</td>\\
                    </tr>\\"""
            tableend = """
                </table>'"""
            table = tablestart + row + tableend
    if not label_exp:
        labeltext = ""
    if popup != 0 and table != "":
        popFuncs = popFuncsScript(table)
    else:
        popFuncs = ""
    new_pop = popupScript(safeLayerName, popFuncs, highlight, popupsOnHover)
    return new_pop, labeltext, popFuncs
예제 #8
0
def getLayerStyle(layer, sln, markerFolder):
    markerType = None
    renderer = layer.rendererV2()
    layer_alpha = layer.layerTransparency()
    style = ""
    if isinstance(renderer, QgsSingleSymbolRendererV2):
        symbol = renderer.symbol()
        (styleCode, markerType) = getSymbolAsStyle(symbol, markerFolder,
                                                   layer_alpha, sln)
        style = """
        function style_%s() {
            return %s
        }""" % (sln, styleCode)
    elif isinstance(renderer, QgsCategorizedSymbolRendererV2):
        classAttr = handleHiddenField(layer, renderer.classAttribute())
        style = """
        function style_%s(feature) {
            switch(feature.properties['%s']) {""" % (sln, classAttr)
        for cat in renderer.categories():
            (styleCode, markerType) = getSymbolAsStyle(cat.symbol(),
                                                       markerFolder,
                                                       layer_alpha, sln)
            style += """
                case '%s':
                    return %s
                    break;""" % (cat.value(), styleCode)
        style += """
            }
        }"""
    elif isinstance(renderer, QgsGraduatedSymbolRendererV2):
        classAttr = handleHiddenField(layer, renderer.classAttribute())
        style = """
        function style_%s(feature) {""" % (sln)
        for ran in renderer.ranges():
            (styleCode, markerType) = getSymbolAsStyle(ran.symbol(),
                                                       markerFolder,
                                                       layer_alpha, sln)
            style += """
            if (feature.properties['%(a)s'] >= %(l)f """
            style += """&& feature.properties['%(a)s'] <= %(u)f ) {
                return %(s)s
            }"""
            style = style % {
                "a": classAttr,
                "l": ran.lowerValue(),
                "u": ran.upperValue(),
                "s": styleCode
            }
        style += """
        }"""
    elif isinstance(renderer, QgsRuleBasedRendererV2):
        style = """
        function style_%s(feature) {""" % (sln)
        root_rule = renderer.rootRule()
        rules = root_rule.children()
        elseif = "if ("
        elseClause = ""
        for rule in rules:
            (styleCode, markerType) = getSymbolAsStyle(rule.symbol(),
                                                       markerFolder,
                                                       layer_alpha, sln)
            if not rule.isElse():
                style += elseif
                style += walkExpression(rule.filter().rootNode(), "Leaflet")
                style += ") {return %s}" % styleCode
                elseif = " else if ("
            else:
                elseClause += " else {"
                elseClause += "return " + styleCode
                elseClause += "}"
        style += elseClause
        style += """
        }"""
    else:
        style = ""
    return style, markerType