def categorized(defs, sln, layer, renderer, legendFolder, stylesFolder, layer_alpha): cluster = False defs += """ function categories_%s(feature, value, size, resolution, labelText, labelFont, labelFill) { switch(value.toString()) {""" % sln cats = [] useAnyMapUnits = False for cnt, cat in enumerate(renderer.categories()): legendIcon = QgsSymbolLayerV2Utils.symbolPreviewPixmap( cat.symbol(), QSize(16, 16)) legendIcon.save( os.path.join(legendFolder, sln + "_" + unicode(cnt) + ".png")) if (cat.value() is not None and cat.value() != "" and not isinstance(cat.value(), QPyNullVariant)): categoryStr = "case '%s':" % unicode(cat.value()).replace( "'", "\\'") else: categoryStr = "default:" (style, pattern, setPattern, useMapUnits) = (getSymbolAsStyle(cat.symbol(), stylesFolder, layer_alpha, renderer, sln, layer)) if useMapUnits: useAnyMapUnits = True categoryStr += ''' return %s; break;''' % style cats.append(categoryStr) defs += "\n".join(cats) + "}};" style = """ var style = categories_%s(feature, value, size, resolution, labelText, labelFont, labelFill)""" % sln value = getValue(layer, renderer) return (style, pattern, setPattern, value, defs, useAnyMapUnits)
def singleSymbol(renderer, stylesFolder, layer_alpha, sln, legendFolder): symbol = renderer.symbol() (style, pattern, setPattern) = getSymbolAsStyle(symbol, stylesFolder, layer_alpha, renderer, sln) style = "var style = " + style legendIcon = QgsSymbolLayerV2Utils.symbolPreviewPixmap( symbol, QSize(16, 16)) legendIcon.save(os.path.join(legendFolder, sln + ".png")) value = 'var value = ""' return (style, pattern, setPattern, value)
def iconLegend(symbol, catr, outputProjectFileName, layerName, catLegend, cnt): try: iconSize = (symbol.size() * 4) + 5 except: iconSize = 16 legendIcon = QgsSymbolLayerV2Utils.symbolPreviewPixmap(symbol, QSize(iconSize, iconSize)) safeLabel = re.sub('[\W_]+', '', catr.label()) + unicode(cnt) legendIcon.save(os.path.join(outputProjectFileName, "legend", layerName + "_" + safeLabel + ".png")) catLegend += """<tr><td style="text-align: center;"><img src="legend/""" catLegend += layerName + "_" + safeLabel + """.png" /></td><td>""" catLegend += catr.label().replace("'", "\\'") + "</td></tr>" return catLegend
def singleLayer(renderer, outputProjectFileName, safeLayerName, wfsLayers, layer, labeltext, cluster, json, usedFields, legends, markerType): symbol = renderer.symbol() legendIcon = QgsSymbolLayerV2Utils.symbolPreviewPixmap( symbol, QSize(16, 16)) legendIcon.save( os.path.join(outputProjectFileName, "legend", safeLayerName + ".png")) legends[safeLayerName] = '<img src="legend/' + safeLayerName + '.png" /> ' legends[safeLayerName] += layer.name() if layer.geometryType() == QGis.Point: (new_obj, wfsLayers) = pointLayer(layer, safeLayerName, labeltext, cluster, usedFields, json, wfsLayers, markerType, renderer.symbol()) else: new_obj, wfsLayers = nonPointLayer(layer, safeLayerName, usedFields, json, wfsLayers) return new_obj, legends, wfsLayers
def graduated(layer, renderer, legendFolder, sln, stylesFolder, layer_alpha): cluster = False ranges = [] elseif = "" for cnt, ran in enumerate(renderer.ranges()): legendIcon = QgsSymbolLayerV2Utils.symbolPreviewPixmap( ran.symbol(), QSize(16, 16)) legendIcon.save( os.path.join(legendFolder, sln + "_" + unicode(cnt) + ".png")) (symbolstyle, pattern, setPattern) = getSymbolAsStyle(ran.symbol(), stylesFolder, layer_alpha, renderer, sln) ranges.append( """%sif (value > %f && value <= %f) { style = %s }""" % (elseif, ran.lowerValue(), ran.upperValue(), symbolstyle)) elseif = " else " style = "".join(ranges) value = getValue(layer, renderer) return (style, pattern, setPattern, value)
def exportStyles(layers, folder, clustered): stylesFolder = os.path.join(folder, "styles") QDir().mkpath(stylesFolder) legendFolder = os.path.join(stylesFolder, "legend") QDir().mkpath(legendFolder) for count, (layer, cluster) in enumerate(zip(layers, clustered)): sln = safeName(layer.name()) + unicode(count) if layer.type() != layer.VectorLayer: continue labelsEnabled = unicode( layer.customProperty("labeling/enabled")).lower() == "true" if (labelsEnabled): labelField = layer.customProperty("labeling/fieldName") if labelField != "": if unicode(layer.customProperty( "labeling/isExpression")).lower() == "true": exprFilename = os.path.join(folder, "resources", "qgis2web_expressions.js") fieldName = layer.customProperty("labeling/fieldName") name = compile_to_file(fieldName, "label_%s" % sln, "OpenLayers3", exprFilename) js = "%s(context)" % (name) js = js.strip() labelText = js else: fieldIndex = layer.pendingFields().indexFromName( labelField) editFormConfig = layer.editFormConfig() editorWidget = editFormConfig.widgetType(fieldIndex) if (editorWidget == QgsVectorLayer.Hidden or editorWidget == 'Hidden'): labelField = "q2wHide_" + labelField labelText = ('feature.get("%s")' % labelField.replace('"', '\\"')) else: labelText = '""' else: labelText = '""' defs = "var size = 0;\n" try: renderer = layer.rendererV2() layer_alpha = layer.layerTransparency() if isinstance(renderer, QgsSingleSymbolRendererV2): symbol = renderer.symbol() style = "var style = " + getSymbolAsStyle( symbol, stylesFolder, layer_alpha, renderer) legendIcon = QgsSymbolLayerV2Utils.symbolPreviewPixmap( symbol, QSize(16, 16)) legendIcon.save(os.path.join(legendFolder, sln + ".png")) value = 'var value = ""' elif isinstance(renderer, QgsCategorizedSymbolRendererV2): cluster = False defs += """function categories_%s(feature, value, size) { switch(value.toString()) {""" % sln cats = [] for cnt, cat in enumerate(renderer.categories()): legendIcon = QgsSymbolLayerV2Utils.symbolPreviewPixmap( cat.symbol(), QSize(16, 16)) legendIcon.save( os.path.join(legendFolder, sln + "_" + unicode(cnt) + ".png")) if (cat.value() is not None and cat.value() != "" and not isinstance(cat.value(), QPyNullVariant)): categoryStr = "case '%s':" % unicode( cat.value()).replace("'", "\\'") else: categoryStr = "default:" categoryStr += ''' return %s; break;''' % (getSymbolAsStyle(cat.symbol(), stylesFolder, layer_alpha, renderer)) cats.append(categoryStr) defs += "\n".join(cats) + "}};" classAttr = renderer.classAttribute() fieldIndex = layer.pendingFields().indexFromName(classAttr) editFormConfig = layer.editFormConfig() editorWidget = editFormConfig.widgetType(fieldIndex) if (editorWidget == QgsVectorLayer.Hidden or editorWidget == 'Hidden'): classAttr = "q2wHide_" + classAttr value = ('var value = feature.get("%s");' % classAttr) style = ('var style = categories_%s(feature, value, size)' % sln) elif isinstance(renderer, QgsGraduatedSymbolRendererV2): cluster = False varName = "ranges_" + sln defs += "var %s = [" % varName ranges = [] for cnt, ran in enumerate(renderer.ranges()): legendIcon = QgsSymbolLayerV2Utils.symbolPreviewPixmap( ran.symbol(), QSize(16, 16)) legendIcon.save( os.path.join(legendFolder, sln + "_" + unicode(cnt) + ".png")) symbolstyle = getSymbolAsStyle(ran.symbol(), stylesFolder, layer_alpha, renderer) ranges.append( '[%f, %f, %s]' % (ran.lowerValue(), ran.upperValue(), symbolstyle)) defs += ",\n".join(ranges) + "];" classAttr = renderer.classAttribute() fieldIndex = layer.pendingFields().indexFromName(classAttr) editFormConfig = layer.editFormConfig() editorWidget = editFormConfig.widgetType(fieldIndex) if (editorWidget == QgsVectorLayer.Hidden or editorWidget == 'Hidden'): classAttr = "q2wHide_" + classAttr value = ('var value = feature.get("%s");' % classAttr) style = '''var style = %(v)s[0][2]; for (i = 0; i < %(v)s.length; i++){ var range = %(v)s[i]; if (value > range[0] && value<=range[1]){ style = range[2]; } }''' % { "v": varName } elif isinstance(renderer, QgsRuleBasedRendererV2): cluster = False template = """ function rules_%s(feature, value) { var context = { feature: feature, variables: {} }; // Start of if blocks and style check logic %s else { return %s; } } var style = rules_%s(feature, value); """ elsejs = "[]" js = "" root_rule = renderer.rootRule() rules = root_rule.children() expFile = os.path.join(folder, "resources", "qgis2web_expressions.js") ifelse = "if" for count, rule in enumerate(rules): symbol = rule.symbol() styleCode = getSymbolAsStyle(symbol, stylesFolder, layer_alpha, renderer) name = "".join((sln, "rule", unicode(count))) exp = rule.filterExpression() if rule.isElse(): elsejs = styleCode continue name = compile_to_file(exp, name, "OpenLayers3", expFile) js += """ %s (%s(context)) { return %s; } """ % (ifelse, name, styleCode) js = js.strip() ifelse = "else if" value = ("var value = '';") style = template % (sln, js, elsejs, sln) else: style = "" if layer.customProperty("labeling/fontSize"): size = float(layer.customProperty("labeling/fontSize")) * 1.3 else: size = 10 italic = layer.customProperty("labeling/fontItalic") bold = layer.customProperty("labeling/fontWeight") r = layer.customProperty("labeling/textColorR") g = layer.customProperty("labeling/textColorG") b = layer.customProperty("labeling/textColorB") if (r or g or b) is None: color = "rgba(0, 0, 0, 1)" else: color = "rgba(%s, %s, %s, 1)" % (r, g, b) face = layer.customProperty("labeling/fontFamily") if face is None: face = "," else: face = " \\'%s\\'," % face palyr = QgsPalLayerSettings() palyr.readFromLayer(layer) sv = palyr.scaleVisibility if sv: min = float(palyr.scaleMin) max = float(palyr.scaleMax) if min != 0: min = 1 / ((1 / min) * 39.37 * 90.7) max = 1 / ((1 / max) * 39.37 * 90.7) labelRes = " && resolution > %(min)d " % {"min": min} labelRes += "&& resolution < %(max)d" % {"max": max} else: labelRes = "" buffer = palyr.bufferDraw if buffer: bufferColor = palyr.bufferColor.name() bufferWidth = palyr.bufferSize stroke = """ stroke: new ol.style.Stroke({ color: "%s", width: %d }),""" % (bufferColor, bufferWidth) else: stroke = "" if style != "": style = getStyle(style, cluster, labelRes, labelText, sln, size, face, color, value) else: style = "''" except Exception, e: style = """{ /* """ + traceback.format_exc() + " */}" QgsMessageLog.logMessage(traceback.format_exc(), "qgis2web", level=QgsMessageLog.CRITICAL) path = os.path.join(stylesFolder, sln + "_style.js") with codecs.open(path, "w", "utf-8") as f: f.write('''%(defs)s var styleCache_%(name)s={} var style_%(name)s = %(style)s;''' % { "defs": defs, "name": sln, "style": style })