def getGroups(canvas, layers, basemapList, restrictToExtent, extent, groupedLayers): group_list = ["baseLayer"] if len(basemapList) else [] no_group_list = [] usedGroups = [] for count, layer in enumerate(layers): try: if is25d(layer, canvas, restrictToExtent, extent): pass else: if layer.id() in groupedLayers: groupName = groupedLayers[layer.id()] if groupName not in usedGroups: group_list.append("group_" + safeName(groupName)) usedGroups.append(groupName) else: no_group_list.append("lyr_" + safeName(layer.name()) + "_" + unicode(count)) except: if layer.id() in groupedLayers: groupName = groupedLayers[layer.id()] if groupName not in usedGroups: group_list.append("group_" + safeName(groupName)) usedGroups.append(groupName) else: no_group_list.append("lyr_" + safeName(layer.name()) + "_" + unicode(count)) return (group_list, no_group_list, usedGroups)
def getGroups(canvas, layers, basemapList, restrictToExtent, extent, groupedLayers): group_list = ["baseLayer"] if len(basemapList) else [] no_group_list = [] usedGroups = [] currentVT = "" for count, layer in enumerate(layers): vts = layer.customProperty("VectorTilesReader/vector_tile_url") if (vts is not None and vts != currentVT): no_group_list.append("lyr_" + safeName(vts)) currentVT = vts try: if is25d(layer, canvas, restrictToExtent, extent): pass else: if layer.id() in groupedLayers: groupName = groupedLayers[layer.id()] if groupName not in usedGroups: group_list.append("group_" + safeName(groupName)) usedGroups.append(groupName) else: no_group_list.append("lyr_" + safeName(layer.name()) + "_" + unicode(count)) except: if layer.id() in groupedLayers: groupName = groupedLayers[layer.id()] if groupName not in usedGroups: group_list.append("group_" + safeName(groupName)) usedGroups.append(groupName) else: no_group_list.append("lyr_" + safeName(layer.name()) + "_" + unicode(count)) return (group_list, no_group_list, usedGroups)
def writeLayersAndGroups(layers, groups, visible, folder, settings): baseLayer = "var baseLayer = " + baseLayers[settings["Appearance"]["Base layer"]] scaleVisibility = settings["Scale/Zoom"]["Use layer scale dependent visibility"] layerVars = "\n".join([layerToJavascript(layer, scaleVisibility) for layer in layers]) groupVars = "" groupedLayers = {} for group, groupLayers in groups.iteritems(): groupVars += ('''var %s = new ol.layer.Group({ layers: [%s], title: "%s"});''' % ("group_" + group, ",".join(["lyr_" + safeName(layer.name()) for layer in groupLayers]), group)) for layer in groupLayers: groupedLayers[layer.id()] = group mapLayers = ["baseLayer"] usedGroups = [] for layer in layers: if layer.id() in groupedLayers: groupName = groupedLayers[layer.id()] if groupName not in usedGroups: mapLayers.append("group_" + safeName(groupName)) usedGroups.append(groupName) else: mapLayers.append("lyr_" + safeName(layer.name())) visibility = "\n".join(["%s.setVisible(%s);" % (layer, str(v).lower()) for layer, v in zip(mapLayers[1:], visible)]) layersList = "var layersList = [%s];" % ",".join([layer for layer in mapLayers]) path = os.path.join(folder, "layers", "layers.js") with open(path, "w") as f: f.write(baseLayer + "\n") f.write(layerVars + "\n") f.write(groupVars + "\n") f.write(visibility + "\n") f.write(layersList)
def writeOL(iface, layers, groups, popup, visible, json, cluster, labels, settings, folder): QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) folder = os.path.join(folder, 'qgis2web_' + unicode(time.strftime("%Y_%m_%d-%H_%M_%S"))) # folder = os.path.join(os.getcwd(),folder) try: dst = os.path.join(folder, "resources") if not os.path.exists(dst): shutil.copytree(os.path.join(os.path.dirname(__file__), "resources"), dst) precision = settings["Data export"]["Precision"] optimize = settings["Data export"]["Minify GeoJSON files"] cleanUnusedFields = settings["Data export"]["Delete unused fields"] if not cleanUnusedFields: usedFields = [ALL_ATTRIBUTES] * len(popup) else: usedFields = popup exportLayers(layers, folder, precision, optimize, usedFields) exportStyles(layers, folder) writeLayersAndGroups(layers, groups, visible, folder, settings) if settings["Data export"]["Mapping library location"] == "Local": cssAddress = "./resources/ol.css" jsAddress = "./resources/ol.js" else: cssAddress = "http://openlayers.org/en/v3.8.2/css/ol.css" jsAddress = "http://openlayers.org/en/v3.8.2/build/ol.js" geojsonVars = "\n".join(['<script src="layers/%s"></script>' % (safeName(layer.name()) + ".js") for layer in layers if layer.type() == layer.VectorLayer]) styleVars = "\n".join(['<script src="styles/%s_style.js"></script>' % (safeName(layer.name())) for layer in layers if layer.type() == layer.VectorLayer]) popupLayers = "popupLayers = [%s];" % ",".join(['"%s"' % field if isinstance(field, basestring) else unicode(field) for field in popup]) controls = [] if settings["Appearance"]["Add scale bar"]: controls.append("new ol.control.ScaleLine({})") if settings["Appearance"]["Add layers list"]: controls.append('new ol.control.LayerSwitcher({tipLabel: "Layers"})') mapbounds = bounds(iface, settings["Scale/Zoom"]["Extent"] == "Canvas extent", layers) mapextent = "extent: %s," % mapbounds if settings["Scale/Zoom"]["Restrict to extent"] else "" maxZoom = int(settings["Scale/Zoom"]["Max zoom level"]) minZoom = int(settings["Scale/Zoom"]["Min zoom level"]) onHover = unicode(settings["Appearance"]["Show popups on hover"]).lower() highlight = unicode(settings["Appearance"]["Highlight features"]).lower() highlightFill = iface.mapCanvas().mapSettings().selectionColor().name() view = "%s maxZoom: %d, minZoom: %d" % (mapextent, maxZoom, minZoom) values = {"@CSSADDRESS@": cssAddress, "@JSADDRESS@": jsAddress, "@STYLEVARS@": styleVars, "@GEOJSONVARS@": geojsonVars, "@BOUNDS@": mapbounds, "@CONTROLS@": ",".join(controls), "@POPUPLAYERS@": popupLayers, "@VIEW@": view, "@ONHOVER@": onHover, "@DOHIGHLIGHT@": highlight, "@HIGHLIGHTFILL@": highlightFill} with open(os.path.join(folder, "index.html"), "w") as f: f.write(replaceInTemplate(settings["Appearance"]["Template"] + ".html", values)) finally: QApplication.restoreOverrideCursor() return os.path.join(folder, "index.html")
def writeScriptIncludes(layers, json, matchCRS): geojsonVars = "" wfsVars = "" styleVars = "" for count, (layer, encode2json) in enumerate(zip(layers, json)): sln = safeName(layer.name()) + unicode(count) if layer.type() == layer.VectorLayer: if layer.providerType() != "WFS" or encode2json: geojsonVars += ('<script src="layers/%s"></script>' % (sln + ".js")) else: layerSource = layer.source() if ("retrictToRequestBBOX" in layerSource or "restrictToRequestBBOX" in layerSource): provider = layer.dataProvider() uri = QgsDataSourceURI(provider.dataSourceUri()) wfsURL = uri.param("url") wfsTypename = uri.param("typename") wfsSRS = uri.param("srsname") layerSource = wfsURL layerSource += "?SERVICE=WFS&VERSION=1.0.0&" layerSource += "REQUEST=GetFeature&TYPENAME=" layerSource += wfsTypename layerSource += "&SRSNAME=" layerSource += wfsSRS if not matchCRS: layerSource = re.sub('SRSNAME\=EPSG\:\d+', 'SRSNAME=EPSG:3857', layerSource) layerSource += "&outputFormat=text%2Fjavascript&" layerSource += "format_options=callback%3A" layerSource += "get" + sln + "Json" wfsVars += ('<script src="%s"></script>' % layerSource) styleVars += ('<script src="styles/%s_style.js">' '</script>' % (sln)) return (geojsonVars, wfsVars, styleVars)
def populateLayerSearch(self): global mainDlg layerSearch = mainDlg.paramsTreeOL.itemWidget( mainDlg.paramsTreeOL.findItems( "Layer search", (Qt.MatchExactly | Qt.MatchRecursive))[0], 1) layerSearch.clear() layerSearch.addItem("None") (layers, groups, popup, visible, json, cluster) = self.getLayersAndGroups() for count, layer in enumerate(layers): if layer.type() == layer.VectorLayer: options = [] fields = layer.pendingFields() for f in fields: fieldIndex = fields.indexFromName(unicode(f.name())) try: formCnf = layer.editFormConfig() editorWidget = formCnf.widgetType(fieldIndex) except: editorWidget = layer.editorWidgetV2(fieldIndex) if (editorWidget == QgsVectorLayer.Hidden or editorWidget == 'Hidden'): continue options.append(unicode(f.name())) for option in options: displayStr = unicode(layer.name() + ": " + option) layerSearch.insertItem(0, displayStr) sln = utils.safeName(layer.name()) layerSearch.setItemData(layerSearch.findText(displayStr), sln + unicode(count))
def populateLayerSearch(self): self.layer_search_combo.clear() self.layer_search_combo.addItem("None") (layers, groups, popup, visible, json, cluster) = self.getLayersAndGroups() for count, layer in enumerate(layers): if layer.type() == layer.VectorLayer: options = [] fields = layer.pendingFields() for f in fields: fieldIndex = fields.indexFromName(unicode(f.name())) try: formCnf = layer.editFormConfig() editorWidget = formCnf.widgetType(fieldIndex) except: editorWidget = layer.editorWidgetV2(fieldIndex) if editorWidget == QgsVectorLayer.Hidden \ or editorWidget == 'Hidden': continue options.append(unicode(f.name())) for option in options: displayStr = unicode(layer.name() + ": " + option) self.layer_search_combo.insertItem(0, displayStr) sln = utils.safeName(layer.name()) self.layer_search_combo.setItemData( self.layer_search_combo.findText(displayStr), sln + unicode(count))
def download(self, new=False, all=False): """ Download files of a course""" courseId = 0 if not all: cli.courselist() courseId = selectId("Veranstaltung", len(self.courses) -1) self.asciiout.h1("Dateien herunterladen") idRange = range(0, len(self.courses)) if all else [courseId] for id in idRange: filePage = pq(self.read("seminar_main.php?auswahl="+self.courses.keys()[id]+"&redirect_to=plugins.php&cmd=show&id=19&view=seminarFolders")) keyword = ("Neue Dateien " if new else "")+"komprimiert herunterladen" downloadLink = filePage('a[title="'+keyword+'"]').eq(0).attr("href") courseName = self.courses[self.courses.keys()[id]] if downloadLink != None: print "Lade Dateien in '"+courseName+"' herunter" data = self.read(downloadLink.replace(baseUrl, "")) if len(data) > 0: fileName = "Downloads/"+safeName(courseName)+".zip" if not os.path.exists("Downloads"): os.makedirs("Downloads") f = open(fileName, "w+") f.write(data) f.close() self.asciiout.text("Dateien in '"+courseName+"' unter "+fileName+" gespeichert") self.asciiout.hr() continue self.asciiout.text("Keine Dateien in '"+courseName+"' gefunden") self.asciiout.hr()
def populateLayerSearch(self): layerSearch = self.paramsTreeOL.itemWidget( self.paramsTreeOL.findItems("Layer search", (Qt.MatchExactly | Qt.MatchRecursive))[0], 1) layerSearch.clear() layerSearch.addItem("None") (layers, groups, popup, visible, json, cluster) = self.getLayersAndGroups() for count, layer in enumerate(layers): if layer.type() == layer.VectorLayer: options = [] fields = layer.pendingFields() for f in fields: fieldIndex = fields.indexFromName(unicode(f.name())) try: formCnf = layer.editFormConfig() editorWidget = formCnf.widgetType(fieldIndex) except: editorWidget = layer.editorWidgetV2(fieldIndex) if (editorWidget == QgsVectorLayer.Hidden or editorWidget == 'Hidden'): continue options.append(unicode(f.name())) for option in options: displayStr = unicode(layer.name() + ": " + option) layerSearch.insertItem(0, displayStr) sln = utils.safeName(layer.name()) layerSearch.setItemData(layerSearch.findText(displayStr), sln + unicode(count))
def build25d(canvas, layer, count): shadows = "" renderer = layer.rendererV2() renderContext = QgsRenderContext.fromMapSettings(canvas.mapSettings()) fields = layer.pendingFields() renderer.startRender(renderContext, fields) for feat in layer.getFeatures(): if isinstance(renderer, QgsCategorizedSymbolRendererV2): classAttribute = renderer.classAttribute() attrValue = feat.attribute(classAttribute) catIndex = renderer.categoryIndexForValue(attrValue) categories = renderer.categories() symbol = categories[catIndex].symbol() elif isinstance(renderer, QgsGraduatedSymbolRendererV2): classAttribute = renderer.classAttribute() attrValue = feat.attribute(classAttribute) ranges = renderer.ranges() for range in ranges: if (attrValue >= range.lowerValue() and attrValue <= range.upperValue()): symbol = range.symbol().clone() else: symbol = renderer.symbolForFeature2(feat, renderContext) symbolLayer = symbol.symbolLayer(0) if not symbolLayer.paintEffect().effectList()[0].enabled(): shadows = "'2015-07-15 10:00:00'" renderer.stopRender(renderContext) osmb = """ var osmb = new OSMBuildings(map).date(new Date({shadows})); osmb.set(json_{sln}_{count});""".format(shadows=shadows, sln=safeName(layer.name()), count=unicode(count)) return osmb
def writeOL(layers, groups, popup, visible, settings, folder): QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) try: dst = os.path.join(folder, "resources") if not os.path.exists(dst): shutil.copytree(os.path.join(os.path.dirname(__file__), "resources"), dst) precision = settings["Data export"]["Precision"] optimize = settings["Data export"]["Minify GeoJSON files"] cleanUnusedFields = settings["Data export"]["Delete unused fields"] if not cleanUnusedFields: usedFields = [ALL_ATTRIBUTES] * len(popup) else: usedFields = popup exportLayers(layers, folder, precision, optimize, usedFields) exportStyles(layers, folder) writeLayersAndGroups(layers, groups, visible, folder, settings) geojsonVars ="\n".join(['<script src="layers/%s"></script>' % (safeName(layer.name()) + ".js") for layer in layers if layer.type() == layer.VectorLayer]) styleVars = "\n".join(['<script src="styles/%s_style.js"></script>' % (safeName(layer.name())) for layer in layers if layer.type() == layer.VectorLayer]) popupLayers = "popupLayers = [%s];" % ",".join(['"%s"' % field if isinstance(field, basestring) else str(field) for field in popup]) controls = [] if settings["Appearance"]["Add scale bar"]: controls.append("new ol.control.ScaleLine({})") if settings["Appearance"]["Add layers list"]: controls.append('new ol.control.LayerSwitcher({tipLabel: "Layers"})') mapbounds = bounds(settings["Scale/Zoom"]["Extent"] == "Canvas extent", layers) mapextent = "extent: %s," % mapbounds if settings["Scale/Zoom"]["Restrict to extent"] else "" maxZoom = int(settings["Scale/Zoom"]["Max zoom level"]) minZoom = int(settings["Scale/Zoom"]["Min zoom level"]) onHover = str(settings["Appearance"]["Show popups on hover"]).lower() highlight = str(settings["Appearance"]["Highlight features"]).lower() view = "%s maxZoom: %d, minZoom: %d" % (mapextent, maxZoom, minZoom) values = {"@STYLEVARS@": styleVars, "@GEOJSONVARS@": geojsonVars, "@BOUNDS@": mapbounds, "@CONTROLS@": ",".join(controls), "@POPUPLAYERS@": popupLayers, "@VIEW@": view, "@ONHOVER@": onHover, "@DOHIGHLIGHT@": highlight} with open(os.path.join(folder, "index.html"), "w") as f: f.write(replaceInTemplate(settings["Appearance"]["Template"] + ".html", values)) finally: QApplication.restoreOverrideCursor()
def writeOL(layers, groups, popup, visible, settings, folder): QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) try: dst = os.path.join(folder, "resources") if not os.path.exists(dst): shutil.copytree(os.path.join(os.path.dirname(__file__), "resources"), dst) precision = settings["Data export"]["Precision"] optimize = settings["Data export"]["Minify GeoJSON files"] cleanUnusedFields = settings["Data export"]["Delete unused fields"] if not cleanUnusedFields: usedFields = [ALL_ATTRIBUTES] * len(popup) else: usedFields = popup exportLayers(layers, folder, precision, optimize, usedFields) exportStyles(layers, folder) writeLayersAndGroups(layers, groups, visible, folder, settings) geojsonVars ="\n".join(['<script src="layers/%s"></script>' % (safeName(layer.name()) + ".js") for layer in layers if layer.type() == layer.VectorLayer]) styleVars = "\n".join(['<script src="styles/%s_style.js"></script>' % (safeName(layer.name())) for layer in layers if layer.type() == layer.VectorLayer]) popupLayers = "popupLayers = [%s];" % ",".join(['"%s"' % field if isinstance(field, basestring) else str(field) for field in popup]) controls = [] if settings["Appearance"]["Add scale bar"]: controls.append("new ol.control.ScaleLine({})") if settings["Appearance"]["Add layers list"]: controls.append('new Boundless.LayersControl({groups: {default: {title: "Layers"}}})') mapbounds = bounds(settings["Scale/Zoom"]["Extent"] == "Canvas extent", layers) mapextent = "extent: %s," % mapbounds if settings["Scale/Zoom"]["Restrict to extent"] else "" maxZoom = int(settings["Scale/Zoom"]["Max zoom level"]) minZoom = int(settings["Scale/Zoom"]["Min zoom level"]) onHover = str(settings["Appearance"]["Show popups on hover"]).lower() highlight = str(settings["Appearance"]["Highlight features"]).lower() view = "%s maxZoom: %d, minZoom: %d" % (mapextent, maxZoom, minZoom) values = {"@STYLEVARS@": styleVars, "@GEOJSONVARS@": geojsonVars, "@BOUNDS@": mapbounds, "@CONTROLS@": ",".join(controls), "@POPUPLAYERS@": popupLayers, "@VIEW@": view, "@ONHOVER@": onHover, "@DOHIGHLIGHT@": highlight} with open(os.path.join(folder, "index.html"), "w") as f: f.write(replaceInTemplate(settings["Appearance"]["Template"] + ".html", values)) finally: QApplication.restoreOverrideCursor()
def buildGroups(groups, qms, layer_names_id): groupVars = "" groupedLayers = {} for group, groupLayers in groups.iteritems(): groupLayerObjs = "" for layer in groupLayers: if qms: if isinstance(layer, TileLayer): continue groupLayerObjs += ("lyr_" + safeName(layer.name()) + "_" + layer_names_id[layer.id()] + ",") groupVars += ('''var %s = new ol.layer.Group({ layers: [%s], title: "%s"});\n''' % ("group_" + safeName(group), groupLayerObjs, group)) for layer in groupLayers: groupedLayers[layer.id()] = safeName(group) return (groupVars, groupedLayers)
def writeLayersAndGroups(layers, groups, visible, folder, settings): baseLayer = "var baseLayer = " + baseLayers[settings["Appearance"] ["Base layer"]] scaleVisibility = settings["Scale/Zoom"][ "Use layer scale dependent visibility"] layerVars = "\n".join( [layerToJavascript(layer, scaleVisibility) for layer in layers]) groupVars = "" groupedLayers = {} for group, groupLayers in groups.iteritems(): groupVars += ( '''var %s = new ol.layer.Group({ layers: [%s], title: "%s"});''' % ("group_" + group, ",".join( ["lyr_" + safeName(layer.name()) for layer in groupLayers]), group)) for layer in groupLayers: groupedLayers[layer.id()] = group mapLayers = ["baseLayer"] usedGroups = [] for layer in layers: if layer.id() in groupedLayers: groupName = groupedLayers[layer.id()] if groupName not in usedGroups: mapLayers.append("group_" + safeName(groupName)) usedGroups.append(groupName) else: mapLayers.append("lyr_" + safeName(layer.name())) visibility = "\n".join([ "%s.setVisible(%s);" % (layer, str(v).lower()) for layer, v in zip(mapLayers[1:], visible) ]) layersList = "var layersList = [%s];" % ",".join( [layer for layer in mapLayers]) path = os.path.join(folder, "layers", "layers.js") with open(path, "w") as f: f.write(baseLayer + "\n") f.write(layerVars + "\n") f.write(groupVars + "\n") f.write(visibility + "\n") f.write(layersList)
def layersAnd25d(layers, canvas, restrictToExtent, extent, qms): mapLayers = ["baseLayer"] osmb = "" for count, layer in enumerate(layers): if is25d(layer, canvas, restrictToExtent, extent): osmb = build25d(canvas, layer, count) else: if (qms and not isinstance(layer, TileLayer)) or not qms: mapLayers.append("lyr_" + safeName(layer.name()) + "_" + unicode(count)) return (mapLayers, osmb)
def createAppDefinition(self, preview = False): layers, groups = self.getLayersAndGroups() appdef = {} appdef["Settings"] = self.getSettings() appdef["Base layers"] = self.getBaseLayers() appdef["Layers"] = layers if preview: for layer in layers: providerType = layer.layer.providerType().lower() if providerType not in ["wms", "wfs"]: layer.method = utils.METHOD_FILE appdef["Groups"] = groups appdef["Widgets"] = self.getWidgets() appdef["Deploy"] = self.getDeployConfiguration(layers) if appdef["Deploy"]["GeoServer workspace"] == "": appdef["Deploy"]["GeoServer workspace"] = utils.safeName(appdef["Settings"]["Title"]) if appdef["Deploy"]["PostGIS schema"] == "": appdef["Deploy"]["PostGIS schema"] = utils.safeName(appdef["Settings"]["Title"]) return appdef
def buildGroups(groups, qms, layer_names_id): groupVars = "" groupedLayers = {} for group, groupLayers in groups.iteritems(): groupLayerObjs = "" for layer in groupLayers: vts = layer.customProperty("VectorTilesReader/vector_tile_url") if qms: if isinstance(layer, TileLayer): continue if vts is not None: continue groupLayerObjs += ("lyr_" + safeName(layer.name()) + "_" + layer_names_id[layer.id()] + ",") groupVars += ('''var %s = new ol.layer.Group({ layers: [%s], title: "%s"});\n''' % ("group_" + safeName(group), groupLayerObjs, group)) for layer in groupLayers: groupedLayers[layer.id()] = safeName(group) return (groupVars, groupedLayers)
def layerToJavascript(layer, scaleVisibility): # TODO: change scale to resolution if scaleVisibility and layer.hasScaleBasedVisibility(): minResolution = "\nminResolution:%s,\n" % unicode(1 / ((1 / layer.minimumScale()) * 39.37 * 90.7)) maxResolution = "maxResolution:%s,\n" % unicode(1 / ((1 / layer.maximumScale()) * 39.37 * 90.7)) else: minResolution = "" maxResolution = "" layerName = safeName(layer.name()) if layer.type() == layer.VectorLayer: return ('''var format_%(n)s = new ol.format.GeoJSON(); var features_%(n)s = format_%(n)s.readFeatures(geojson_%(n)s); var jsonSource_%(n)s = new ol.source.Vector(); jsonSource_%(n)s.addFeatures(features_%(n)s); var lyr_%(n)s = new ol.layer.Vector({ source: jsonSource_%(n)s,%(min)s %(max)s style: style_%(n)s, title: "%(name)s" });''' % {"name": layer.name(), "n": layerName, "min": minResolution, "max": maxResolution}) elif layer.type() == layer.RasterLayer: if layer.providerType().lower() == "wms": source = layer.source() layers = re.search(r"layers=(.*?)(?:&|$)", source).groups(0)[0] url = re.search(r"url=(.*?)(?:&|$)", source).groups(0)[0] return '''var lyr_%(n)s = new ol.layer.Tile({ source: new ol.source.TileWMS(({ url: "%(url)s", params: {"LAYERS": "%(layers)s", "TILED": "true"}, })), title: "%(name)s" });''' % {"layers": layers, "url": url, "n": layerName, "name": layer.name()} elif layer.providerType().lower() == "gdal": provider = layer.dataProvider() transform = QgsCoordinateTransform(provider.crs(), QgsCoordinateReferenceSystem("EPSG:3857")) extent = transform.transform(provider.extent()) sExtent = "[%f, %f, %f, %f]" % (extent.xMinimum(), extent.yMinimum(), extent.xMaximum(), extent.yMaximum()) return '''var lyr_%(n)s = new ol.layer.Image({ opacity: 1, title: "%(name)s", source: new ol.source.ImageStatic({ url: "./layers/%(n)s.jpg", projection: 'EPSG:3857', alwaysInRange: true, imageSize: [%(col)d, %(row)d], imageExtent: %(extent)s }) });''' % {"n": layerName, "extent": sExtent, "col": provider.xSize(), "name": layer.name(), "row": provider.ySize()}
def layerToJavascript(iface, layer, encode2json, matchCRS, cluster, info, restrictToExtent, extent, count, vtLayers): (minResolution, maxResolution) = getScaleRes(layer) layerName = safeName(layer.name()) + "_" + unicode(count) layerAttr = getAttribution(layer) if layer.type() == layer.VectorLayer and not is25d( layer, iface.mapCanvas(), restrictToExtent, extent): renderer = layer.rendererV2() cluster = isCluster(cluster, renderer) hmRadius = 0 hmRamp = "" hmWeight = 0 hmWeightMax = 0 vts = layer.customProperty("VectorTilesReader/vector_tile_url") if vts is not None: if vts not in vtLayers: vtLayers.append(vts) return getVT(vts), vtLayers else: return "", vtLayers if isinstance(renderer, QgsHeatmapRenderer): (pointLayerType, hmRadius, hmRamp, hmWeight, hmWeightMax) = getHeatmap(layer, renderer) else: pointLayerType = "Vector" crsConvert = getCRS(iface, matchCRS) if layer.providerType() == "WFS" and not encode2json: return getWFS(layer, layerName, layerAttr, cluster, minResolution, maxResolution), vtLayers else: return getJSON(layerName, crsConvert, layerAttr, cluster, pointLayerType, minResolution, maxResolution, hmRadius, hmRamp, hmWeight, hmWeightMax, renderer, layer), vtLayers elif layer.type() == layer.RasterLayer: if layer.providerType().lower() == "wms": source = layer.source() opacity = layer.renderer().opacity() d = parse_qs(source) if "type" in d and d["type"][0] == "xyz": return getXYZ(layerName, opacity, minResolution, maxResolution, layerAttr, d["url"][0]), vtLayers elif "tileMatrixSet" in d: return getWMTS(layer, d, layerAttr, layerName, opacity, minResolution, maxResolution), vtLayers else: return getWMS(source, layer, layerAttr, layerName, opacity, minResolution, maxResolution, info), vtLayers elif layer.providerType().lower() == "gdal": return getRaster(iface, layer, layerName, layerAttr, minResolution, maxResolution, matchCRS), vtLayers
def addLayersList(basemapList, matchCRS, layer_list, cluster, legends, collapsed): if len(basemapList) < 2 or matchCRS: controlStart = """ var baseMaps = {};""" else: comma = "" controlStart = """ var baseMaps = {""" for count, basemap in enumerate(basemapList): controlStart += comma + "'" + unicode(basemap) controlStart += "': basemap" + unicode(count) comma = ", " controlStart += "};" controlStart += """ L.control.layers(baseMaps,{""" layersList = controlStart lyrCount = len(layer_list) - 1 for i, clustered in zip(reversed(layer_list), reversed(cluster)): try: rawLayerName = i.name() safeLayerName = safeName(rawLayerName) + "_" + unicode(lyrCount) lyrCount -= 1 if i.type() == QgsMapLayer.VectorLayer: testDump = i.rendererV2().dump() if (clustered and i.geometryType() == QGis.Point): new_layer = "'" + legends[safeLayerName].replace( "'", "\\'") new_layer += "': cluster_" "" + safeLayerName + "," else: new_layer = "'" + legends[safeLayerName].replace( "'", "\\'") new_layer += "': layer_" + safeLayerName + "," layersList += new_layer elif i.type() == QgsMapLayer.RasterLayer: new_layer = '"' + rawLayerName.replace("'", "\\'") + '"' new_layer += ": overlay_" + safeLayerName + """,""" layersList += new_layer except: QgsMessageLog.logMessage(traceback.format_exc(), "qgis2ol5", level=QgsMessageLog.CRITICAL) controlEnd = "}" if collapsed: controlEnd += ",{collapsed:false}" controlEnd += ").addTo(map);" layersList += controlEnd return layersList
def getVisibility(mapLayers, layers, visible): visibility = "" currentVT = "" for layer, layerObj, v in zip(mapLayers[1:], layers, visible): vts = layerObj.customProperty("VectorTilesReader/vector_tile_url") if vts is None or vts != currentVT: if vts is not None: lname = "lyr_%s" % safeName(vts) else: lname = layer visibility += "\n".join( ["%s.setVisible(%s);" % (lname, unicode(v).lower())]) if vts is not None: currentVT = vts return visibility
def getVTStyles(vtStyles): vtStyleString = "" for (vts, lyrs) in vtStyles.items(): vtStyleString += """ style_%s = {""" % safeName(vts) for (lyr, styles) in lyrs.items(): vtStyleString += """ %s: [""" % lyr for style in styles: if style == "": style = "{}" vtStyleString += "%s," % style vtStyleString += "]," vtStyleString = vtStyleString.replace(",]", "]") vtStyleString += "}" return vtStyleString
def createApp(self): appdef = self.createAppDefinition(False) appName = appdef["Settings"]["Title"].replace(" ", "") appdefFile = utils.tempFilenameInTempFolder(appName + ".json") folder = os.path.dirname(appdefFile) print folder exportLayers(appdef["Layers"], folder, self.progress, 3) saveAppdef(appdef, appdefFile) from ftplib import FTP url = self.g3mUrlBox.text() ftp = FTP(url, 'qgis', 'qgis') utils.chdir("ftp-box/g3m-qgis/%s" % appName, ftp) #ftp.cwd("ftp-box/g3m-qgis/%s" % appName) with open(appdefFile, 'rb') as f: ftp.storbinary('STOR ' + appName + ".json", f) utils.chdir("layers", ftp) for layer in appdef["Layers"]: layerName = utils.safeName(layer.layer) with open(folder + "/layers/lyr_%s.js" % layerName, 'rb') as f: ftp.storbinary('STOR ' + layerName + ".json", f)
def getVT(json_url): print json_url sln = safeName(json_url) key = json_url.split("?")[1] json = TileJSON(json_url) json.load() tile_url = json.tiles()[0].split("?")[0] key_url = "%s?%s" % (tile_url, key) layerCode = """ var lyr_%s = new ol.layer.VectorTile({ source: new ol.source.VectorTile({ format: new ol.format.MVT(), url: '%s', tileGrid: new ol.tilegrid.createXYZ({ tileSize: 512, maxZoom: 14 }), tilePixelRatio: 8 }), style: style_%s }); """ % (sln, key_url, sln) return layerCode
def layerToJavascript(iface, layer, encode2json, matchCRS, cluster): if layer.hasScaleBasedVisibility(): minRes = 1 / ((1 / layer.minimumScale()) * 39.37 * 90.7) maxRes = 1 / ((1 / layer.maximumScale()) * 39.37 * 90.7) minResolution = "\nminResolution:%s,\n" % unicode(minRes) maxResolution = "maxResolution:%s,\n" % unicode(maxRes) else: minResolution = "" maxResolution = "" layerName = safeName(layer.name()) if layer.type() == layer.VectorLayer and not is25d(layer, iface.mapCanvas()): renderer = layer.rendererV2() if cluster and (isinstance(renderer, QgsSingleSymbolRendererV2) or isinstance(renderer, QgsRuleBasedRendererV2)): cluster = True else: cluster = False if matchCRS: mapCRS = iface.mapCanvas().mapSettings().destinationCrs().authid() crsConvert = """ {dataProjection: 'EPSG:4326', featureProjection: '%(d)s'}""" % { "d": mapCRS} else: crsConvert = """ {dataProjection: 'EPSG:4326', featureProjection: 'EPSG:3857'}""" if layer.providerType() == "WFS" and not encode2json: layerCode = '''var format_%(n)s = new ol.format.GeoJSON(); var jsonSource_%(n)s = new ol.source.Vector({ format: format_%(n)s });''' % {"n": layerName} if cluster: layerCode += '''cluster_%(n)s = new ol.source.Cluster({ distance: 10, source: jsonSource_%(n)s });''' % {"n": layerName} layerCode += '''var lyr_%(n)s = new ol.layer.Vector({ source: ''' % {"n": layerName} if cluster: layerCode += 'cluster_%(n)s,' % {"n": layerName} else: layerCode += 'jsonSource_%(n)s,' % {"n": layerName} layerCode += '''%(min)s %(max)s style: style_%(n)s, title: "%(name)s" }); function get%(n)sJson(geojson) { var features_%(n)s = format_%(n)s.readFeatures(geojson); jsonSource_%(n)s.addFeatures(features_%(n)s); }''' % { "name": layer.name(), "n": layerName, "min": minResolution, "max": maxResolution} return layerCode else: layerCode = '''var format_%(n)s = new ol.format.GeoJSON(); var features_%(n)s = format_%(n)s.readFeatures(geojson_%(n)s, %(crs)s); var jsonSource_%(n)s = new ol.source.Vector(); jsonSource_%(n)s.addFeatures(features_%(n)s);''' % {"n": layerName, "crs": crsConvert} if cluster: layerCode += '''cluster_%(n)s = new ol.source.Cluster({ distance: 10, source: jsonSource_%(n)s });''' % {"n": layerName} layerCode += '''var lyr_%(n)s = new ol.layer.Vector({ source:''' % {"n": layerName} if cluster: layerCode += 'cluster_%(n)s,' % {"n": layerName} else: layerCode += 'jsonSource_%(n)s,' % {"n": layerName} layerCode += '''%(min)s %(max)s style: style_%(n)s, title: "%(name)s" });''' % {"name": layer.name(), "n": layerName, "min": minResolution, "max": maxResolution} return layerCode elif layer.type() == layer.RasterLayer: if layer.providerType().lower() == "wms": source = layer.source() layers = re.search(r"layers=(.*?)(?:&|$)", source).groups(0)[0] url = re.search(r"url=(.*?)(?:&|$)", source).groups(0)[0] return '''var lyr_%(n)s = new ol.layer.Tile({ source: new ol.source.TileWMS(({ url: "%(url)s", params: {"LAYERS": "%(layers)s", "TILED": "true"}, })), title: "%(name)s", %(minRes)s %(maxRes)s });''' % {"layers": layers, "url": url, "n": layerName, "name": layer.name(), "minRes": minResolution, "maxRes": maxResolution} elif layer.providerType().lower() == "gdal": provider = layer.dataProvider() crsSrc = layer.crs() crsDest = QgsCoordinateReferenceSystem(3857) xform = QgsCoordinateTransform(crsSrc, crsDest) extentRep = xform.transform(layer.extent()) sExtent = "[%f, %f, %f, %f]" % (extentRep.xMinimum(), extentRep.yMinimum(), extentRep.xMaximum(), extentRep.yMaximum()) return '''var lyr_%(n)s = new ol.layer.Image({ opacity: 1, title: "%(name)s", %(minRes)s %(maxRes)s source: new ol.source.ImageStatic({ url: "./layers/%(n)s.png", projection: 'EPSG:3857', alwaysInRange: true, //imageSize: [%(col)d, %(row)d], imageExtent: %(extent)s }) });''' % {"n": layerName, "extent": sExtent, "col": provider.xSize(), "name": layer.name(), "minRes": minResolution, "maxRes": maxResolution, "row": provider.ySize()}
def writeOL(iface, layers, groups, popup, visible, json, clustered, settings, folder): QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) stamp = time.strftime("%Y_%m_%d-%H_%M_%S") folder = os.path.join(folder, 'qgis2web_' + unicode(stamp)) imagesFolder = os.path.join(folder, "images") QDir().mkpath(imagesFolder) try: dst = os.path.join(folder, "resources") if not os.path.exists(dst): shutil.copytree(os.path.join(os.path.dirname(__file__), "resources"), dst) matchCRS = settings["Appearance"]["Match project CRS"] precision = settings["Data export"]["Precision"] optimize = settings["Data export"]["Minify GeoJSON files"] cleanUnusedFields = settings["Data export"]["Delete unused fields"] if not cleanUnusedFields: usedFields = [ALL_ATTRIBUTES] * len(popup) else: usedFields = popup exportLayers(iface, layers, folder, precision, optimize, popup, json) exportStyles(layers, folder, clustered) osmb = writeLayersAndGroups(layers, groups, visible, folder, popup, settings, json, matchCRS, clustered, iface) jsAddress = '<script src="resources/polyfills.js"></script>' if settings["Data export"]["Mapping library location"] == "Local": cssAddress = """<link rel="stylesheet" """ cssAddress += """href="./resources/ol.css" />""" jsAddress += """ <script src="./resources/ol.js"></script>""" else: cssAddress = """<link rel="stylesheet" href="http://""" cssAddress += """openlayers.org/en/v3.12.1/css/ol.css" />""" jsAddress += """ <script src="http://openlayers.org/en/v3.12.1/""" jsAddress += """build/ol.js"></script>""" jsAddress += """ <script src="resources/OSMBuildings-OL3.js"></script>""" geojsonVars = "" wfsVars = "" styleVars = "" for layer, encode2json in zip(layers, json): if layer.type() == layer.VectorLayer: if layer.providerType() != "WFS" or encode2json: geojsonVars += ('<script src="layers/%s"></script>' % (safeName(layer.name()) + ".js")) else: layerSource = layer.source() if not matchCRS: layerSource = re.sub('SRSNAME\=EPSG\:\d+', 'SRSNAME=EPSG:3857', layerSource) layerSource += "&outputFormat=text%2Fjavascript&" layerSource += "format_options=callback%3A" layerSource += "get" + safeName(layer.name()) + "Json" wfsVars += ('<script src="%s"></script>' % layerSource) styleVars += ('<script src="styles/%s_style.js"></script>' % (safeName(layer.name()))) popupLayers = "popupLayers = [%s];" % ",".join( ['1' for field in popup]) controls = ['expandedAttribution'] # Check qgis2web.js 14:7 if settings["Appearance"]["Add scale bar"]: controls.append("new ol.control.ScaleLine({})") if settings["Appearance"]["Add layers list"]: controls.append( 'new ol.control.LayerSwitcher({tipLabel: "Layers"})') if settings["Appearance"]["Measure tool"] != "None": controls.append( 'new measureControl()') pageTitle = QgsProject.instance().title() mapSettings = iface.mapCanvas().mapSettings() backgroundColor = """ <style> html, body {{ background-color: {bgcol}; }} </style> """.format(bgcol=mapSettings.backgroundColor().name()) mapbounds = bounds(iface, settings["Scale/Zoom"]["Extent"] == "Canvas extent", layers, settings["Appearance"]["Match project CRS"]) mapextent = "extent: %s," % mapbounds if ( settings["Scale/Zoom"]["Restrict to extent"]) else "" maxZoom = int(settings["Scale/Zoom"]["Max zoom level"]) minZoom = int(settings["Scale/Zoom"]["Min zoom level"]) popupsOnHover = settings["Appearance"]["Show popups on hover"] highlightFeatures = settings["Appearance"]["Highlight on hover"] onHover = unicode(popupsOnHover).lower() highlight = unicode(highlightFeatures).lower() highlightFill = mapSettings.selectionColor().name() proj4 = "" projdef = "" view = "%s maxZoom: %d, minZoom: %d" % (mapextent, maxZoom, minZoom) if settings["Appearance"]["Match project CRS"]: proj4 = """ <script src="http://cdnjs.cloudflare.com/ajax/libs/proj4js/2.3.6/proj4.js">""" proj4 += "</script>" projdef = "<script>proj4.defs('{epsg}','{defn}');</script>".format( epsg=mapSettings.destinationCrs().authid(), defn=mapSettings.destinationCrs().toProj4()) view += ", projection: '%s'" % ( mapSettings.destinationCrs().authid()) if settings["Appearance"]["Measure tool"] != "None": measureControl = measureControlScript() measuring = measuringScript() measure = measureScript() if settings["Appearance"]["Measure tool"] == "Imperial": measureUnit = measureUnitFeetScript() else: measureUnit = measureUnitMetricScript() measureStyle = measureStyleScript() else: measureControl = "" measuring = "" measure = "" measureUnit = "" measureStyle = "" geolocate = geolocation(settings["Appearance"]["Geolocate user"]) geocode = settings["Appearance"]["Add address search"] geocodingLinks = geocodeLinks(geocode) geocodingScript = geocodeScript(geocode) extracss = """ <link rel="stylesheet" href="./resources/ol3-layerswitcher.css"> <link rel="stylesheet" href="./resources/qgis2web.css">""" ol3layerswitcher = """ <script src="./resources/ol3-layerswitcher.js"></script>""" ol3popup = """<div id="popup" class="ol-popup"> <a href="#" id="popup-closer" class="ol-popup-closer"></a> <div id="popup-content"></div> </div>""" ol3qgis2webjs = """<script src="./resources/qgis2web.js"></script> <script src="./resources/Autolinker.min.js"></script>""" if osmb != "": ol3qgis2webjs += """ <script>{osmb}</script>""".format(osmb=osmb) ol3layers = """ <script src="./layers/layers.js" type="text/javascript"></script>""" mapSize = iface.mapCanvas().size() values = {"@PAGETITLE@": pageTitle, "@CSSADDRESS@": cssAddress, "@EXTRACSS@": extracss, "@JSADDRESS@": jsAddress, "@MAP_WIDTH@": unicode(mapSize.width()) + "px", "@MAP_HEIGHT@": unicode(mapSize.height()) + "px", "@OL3_STYLEVARS@": styleVars, "@OL3_BACKGROUNDCOLOR@": backgroundColor, "@OL3_POPUP@": ol3popup, "@OL3_GEOJSONVARS@": geojsonVars, "@OL3_WFSVARS@": wfsVars, "@OL3_PROJ4@": proj4, "@OL3_PROJDEF@": projdef, "@OL3_GEOCODINGLINKS@": geocodingLinks, "@QGIS2WEBJS@": ol3qgis2webjs, "@OL3_LAYERSWITCHER@": ol3layerswitcher, "@OL3_LAYERS@": ol3layers, "@OL3_MEASURESTYLE@": measureStyle, "@LEAFLET_ADDRESSCSS@": "", "@LEAFLET_MEASURECSS@": "", "@LEAFLET_EXTRAJS@": "", "@LEAFLET_ADDRESSJS@": "", "@LEAFLET_MEASUREJS@": "", "@LEAFLET_CRSJS@": "", "@LEAFLET_CLUSTERCSS@": "", "@LEAFLET_CLUSTERJS@": ""} with open(os.path.join(folder, "index.html"), "w") as f: htmlTemplate = settings["Appearance"]["Template"] if htmlTemplate == "": htmlTemplate = "basic" templateOutput = replaceInTemplate(htmlTemplate + ".html", values) templateOutput = re.sub('\n[\s_]+\n', '\n', templateOutput) f.write(templateOutput) values = {"@BOUNDS@": mapbounds, "@CONTROLS@": ",".join(controls), "@POPUPLAYERS@": popupLayers, "@VIEW@": view, "@ONHOVER@": onHover, "@DOHIGHLIGHT@": highlight, "@HIGHLIGHTFILL@": highlightFill, "@GEOLOCATE@": geolocate, "@GEOCODINGSCRIPT@": geocodingScript, "@MEASURECONTROL@": measureControl, "@MEASURING@": measuring, "@MEASURE@": measure, "@MEASUREUNIT@": measureUnit} with open(os.path.join(folder, "resources", "qgis2web.js"), "w") as f: f.write(replaceInScript("qgis2web.js", values)) except Exception as e: print "FAIL" print traceback.format_exc() finally: QApplication.restoreOverrideCursor() return os.path.join(folder, "index.html")
def writeLayersAndGroups(layers, groups, visible, folder, popup, settings, json, matchCRS, clustered, iface): canvas = iface.mapCanvas() basemapList = settings["Appearance"]["Base layer"] basemaps = [basemapOL()[item.text()] for _, item in enumerate(basemapList)] baseLayer = """var baseLayer = new ol.layer.Group({ 'title': 'Base maps', layers: [%s\n] });""" % ','.join(basemaps) layerVars = "" for layer, encode2json, cluster in zip(layers, json, clustered): try: if is25d(layer, canvas): pass else: layerVars += "\n".join([layerToJavascript(iface, layer, encode2json, matchCRS, cluster)]) except: layerVars += "\n".join([layerToJavascript(iface, layer, encode2json, matchCRS, cluster)]) groupVars = "" groupedLayers = {} for group, groupLayers in groups.iteritems(): groupVars += ('''var %s = new ol.layer.Group({ layers: [%s], title: "%s"});\n''' % ("group_" + safeName(group), ",".join(["lyr_" + safeName(layer.name()) for layer in groupLayers]), group)) for layer in groupLayers: groupedLayers[layer.id()] = safeName(group) mapLayers = ["baseLayer"] usedGroups = [] osmb = "" for layer in layers: try: renderer = layer.rendererV2() if is25d(layer, canvas): shadows = "" renderer = layer.rendererV2() renderContext = QgsRenderContext.fromMapSettings( canvas.mapSettings()) fields = layer.pendingFields() renderer.startRender(renderContext, fields) for feat in layer.getFeatures(): if isinstance(renderer, QgsCategorizedSymbolRendererV2): classAttribute = renderer.classAttribute() attrValue = feat.attribute(classAttribute) catIndex = renderer.categoryIndexForValue(attrValue) categories = renderer.categories() symbol = categories[catIndex].symbol() elif isinstance(renderer, QgsGraduatedSymbolRendererV2): classAttribute = renderer.classAttribute() attrValue = feat.attribute(classAttribute) ranges = renderer.ranges() for range in ranges: if (attrValue >= range.lowerValue() and attrValue <= range.upperValue()): symbol = range.symbol().clone() else: symbol = renderer.symbolForFeature2(feat, renderContext) symbolLayer = symbol.symbolLayer(0) if not symbolLayer.paintEffect().effectList()[0].enabled(): shadows = "'2015-07-15 10:00:00'" renderer.stopRender(renderContext) osmb = """ var osmb = new OSMBuildings(map).date(new Date({shadows})); osmb.set(geojson_{sln});""".format(shadows=shadows, sln=safeName(layer.name())) else: mapLayers.append("lyr_" + safeName(layer.name())) except: mapLayers.append("lyr_" + safeName(layer.name())) visibility = "" for layer, v in zip(mapLayers[1:], visible): visibility += "\n".join(["%s.setVisible(%s);" % (layer, unicode(v).lower())]) group_list = ["baseLayer"] if len(basemapList) else [] no_group_list = [] for layer in layers: try: if is25d(layer, canvas): pass else: if layer.id() in groupedLayers: groupName = groupedLayers[layer.id()] if groupName not in usedGroups: group_list.append("group_" + safeName(groupName)) usedGroups.append(groupName) else: no_group_list.append("lyr_" + safeName(layer.name())) except: if layer.id() in groupedLayers: groupName = groupedLayers[layer.id()] if groupName not in usedGroups: group_list.append("group_" + safeName(groupName)) usedGroups.append(groupName) else: no_group_list.append("lyr_" + safeName(layer.name())) layersList = [] for layer in (group_list + no_group_list): layersList.append(layer) layersListString = "var layersList = [" + ",".join(layersList) + "];" fieldAliases = "" fieldImages = "" fieldLabels = "" for layer, labels in zip(layers, popup): if layer.type() == layer.VectorLayer: fieldList = layer.pendingFields() aliasFields = "" imageFields = "" labelFields = "" for field, label in zip(labels.keys(), labels.values()): labelFields += "'%(field)s': '%(label)s', " % ( {"field": field, "label": label}) labelFields = "{%(labelFields)s});\n" % ( {"labelFields": labelFields}) labelFields = "lyr_%(name)s.set('fieldLabels', " % ( {"name": safeName(layer.name())}) + labelFields fieldLabels += labelFields for f in fieldList: fieldIndex = fieldList.indexFromName(unicode(f.name())) aliasFields += "'%(field)s': '%(alias)s', " % ( {"field": f.name(), "alias": layer.attributeDisplayName(fieldIndex)}) try: widget = layer.editFormConfig().widgetType(fieldIndex) except: widget = layer.editorWidgetV2(fieldIndex) imageFields += "'%(field)s': '%(image)s', " % ( {"field": f.name(), "image": widget}) aliasFields = "{%(aliasFields)s});\n" % ( {"aliasFields": aliasFields}) aliasFields = "lyr_%(name)s.set('fieldAliases', " % ( {"name": safeName(layer.name())}) + aliasFields fieldAliases += aliasFields imageFields = "{%(imageFields)s});\n" % ( {"imageFields": imageFields}) imageFields = "lyr_%(name)s.set('fieldImages', " % ( {"name": safeName(layer.name())}) + imageFields fieldImages += imageFields path = os.path.join(folder, "layers", "layers.js") with codecs.open(path, "w", "utf-8") as f: if basemapList: f.write(baseLayer + "\n") f.write(layerVars + "\n") f.write(groupVars + "\n") f.write(visibility + "\n") f.write(layersListString + "\n") f.write(fieldAliases) f.write(fieldImages) f.write(fieldLabels) return osmb
def exportStyles(layers, folder, clustered): stylesFolder = os.path.join(folder, "styles") QDir().mkpath(stylesFolder) 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) try: editFormConfig = layer.editFormConfig() editorWidget = editFormConfig.widgetType(fieldIndex) except: editorWidget = layer.editorWidgetV2(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() if cluster: style = "var size = feature.get('features').length;\n" else: style = "var size = 0;\n" style += " var style = " + getSymbolAsStyle( symbol, stylesFolder, layer_alpha) value = 'var value = ""' elif isinstance(renderer, QgsCategorizedSymbolRendererV2): defs += """function categories_%s(feature, value) { switch(value) {""" % sln cats = [] for cat in renderer.categories(): 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)) cats.append(categoryStr) defs += "\n".join(cats) + "}};" classAttr = renderer.classAttribute() fieldIndex = layer.pendingFields().indexFromName(classAttr) try: editFormConfig = layer.editFormConfig() editorWidget = editFormConfig.widgetType(fieldIndex) except: editorWidget = layer.editorWidgetV2(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)''' % (sln)) elif isinstance(renderer, QgsGraduatedSymbolRendererV2): varName = "ranges_" + sln defs += "var %s = [" % varName ranges = [] for ran in renderer.ranges(): symbolstyle = getSymbolAsStyle(ran.symbol(), stylesFolder, layer_alpha) ranges.append( '[%f, %f, %s]' % (ran.lowerValue(), ran.upperValue(), symbolstyle)) defs += ",\n".join(ranges) + "];" classAttr = renderer.classAttribute() fieldIndex = layer.pendingFields().indexFromName(classAttr) try: editFormConfig = layer.editFormConfig() editorWidget = editFormConfig.widgetType(fieldIndex) except: editorWidget = layer.editorWidgetV2(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): 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) 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") color = "rgba(%s, %s, %s, 255)" % (r, g, b) face = layer.customProperty("labeling/fontFamily") palyr = QgsPalLayerSettings() palyr.readFromLayer(layer) sv = palyr.scaleVisibility if sv: min = float(palyr.scaleMin) max = float(palyr.scaleMax) 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 = '''function(feature, resolution){ var context = { feature: feature, variables: {} }; %(value)s %(style)s; if (%(label)s !== null%(labelRes)s) { var labelText = String(%(label)s); } else { var labelText = "" } var key = value + "_" + labelText if (!%(cache)s[key]){ var text = new ol.style.Text({ font: '%(size)spx \\'%(face)s\\', sans-serif', text: labelText, textBaseline: "center", textAlign: "left", offsetX: 5, offsetY: 3, fill: new ol.style.Fill({ color: '%(color)s' }),%(stroke)s }); %(cache)s[key] = new ol.style.Style({"text": text}) } var allStyles = [%(cache)s[key]]; allStyles.push.apply(allStyles, style); return allStyles; }''' % { "style": style, "labelRes": labelRes, "label": labelText, "cache": "styleCache_" + sln, "size": size, "face": face, "color": color, "stroke": stroke, "value": 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 })
def writeLayersAndGroups(layers, groups, visible, folder, settings, json, matchCRS, clustered): basemapList = settings["Appearance"]["Base layer"] basemaps = "" comma = "" for count, basemap in enumerate(basemapList): basemaps += comma + baseLayers[basemap.text()] comma = ", " baseLayer = baseLayerGroup % basemaps layerVars = "" for layer, encode2json, cluster in zip(layers, json, clustered): layerVars += "\n".join([layerToJavascript(iface, layer, encode2json, matchCRS, cluster)]) groupVars = "" groupedLayers = {} for group, groupLayers in groups.iteritems(): groupVars += ('''var %s = new ol.layer.Group({ layers: [%s], title: "%s"});\n''' % ("group_" + safeName(group), ",".join(["lyr_" + safeName(layer.name()) for layer in groupLayers]), group)) for layer in groupLayers: groupedLayers[layer.id()] = safeName(group) mapLayers = [] if settings["Appearance"]["Base layer"] != "None": mapLayers.append("baseLayer") usedGroups = [] for layer in layers: mapLayers.append("lyr_" + safeName(layer.name())) visibility = "" for layer, v in zip(mapLayers[1:], visible): visibility += "\n".join(["%s.setVisible(%s);" % (layer, unicode(v).lower())]) group_list = ["baseLayer"] no_group_list = [] for layer in layers: if layer.id() in groupedLayers: groupName = groupedLayers[layer.id()] if groupName not in usedGroups: group_list.append("group_" + safeName(groupName)) usedGroups.append(groupName) else: no_group_list.append("lyr_" + safeName(layer.name())) layersList = [] for layer in (group_list + no_group_list): layersList.append(layer) layersListString = "var layersList = [" + ",".join(layersList) + "];" path = os.path.join(folder, "layers", "layers.js") with codecs.open(path, "w", "utf-8") as f: f.write(baseLayer + "\n") f.write(layerVars + "\n") f.write(groupVars + "\n") f.write(visibility + "\n") f.write(layersListString + "\n")
def exportStyles(layers, folder): stylesFolder = os.path.join(folder, "styles") QDir().mkpath(stylesFolder) for layer in layers: if layer.type() != layer.VectorLayer: continue labelsEnabled = str(layer.customProperty("labeling/enabled")).lower() == "true" if (labelsEnabled): labelField = layer.customProperty("labeling/fieldName") labelText = 'feature.get("%s")' % labelField else: labelText = '""' defs = "" try: renderer = layer.rendererV2() if isinstance(renderer, QgsSingleSymbolRendererV2): symbol = renderer.symbol() style = "var style = " + getSymbolAsStyle(symbol, stylesFolder) value = 'var value = ""' elif isinstance(renderer, QgsCategorizedSymbolRendererV2): defs += "var categories_%s = {" % safeName(layer.name()) cats = [] for cat in renderer.categories(): cats.append('"%s": %s' % (cat.value(), getSymbolAsStyle(cat.symbol(), stylesFolder))) defs += ",\n".join(cats) + "};" value = 'var value = feature.get("%s");' % renderer.classAttribute() style = '''var style = categories_%s[value]''' % (safeName(layer.name())) elif isinstance(renderer, QgsGraduatedSymbolRendererV2): varName = "ranges_" + safeName(layer.name()) defs += "var %s = [" % varName ranges = [] for ran in renderer.ranges(): symbolstyle = getSymbolAsStyle(ran.symbol(), stylesFolder) ranges.append('[%f, %f, %s]' % (ran.lowerValue(), ran.upperValue(), symbolstyle)) defs += ",\n".join(ranges) + "];" value = 'var value = feature.get("%s");' % renderer.classAttribute() 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} size = layer.customProperty("labeling/fontSize") r = layer.customProperty("labeling/textColorR") g = layer.customProperty("labeling/textColorG") b = layer.customProperty("labeling/textColorB") color = "rgba(%s, %s, %s, 255)" % (r,g,b) style = '''function(feature, resolution){ %(value)s %(style)s; var labelText = %(label)s; var key = value + "_" + labelText if (!%(cache)s[key]){ var text = new ol.style.Text({ font: '%(size)spx Calibri,sans-serif', text: labelText, fill: new ol.style.Fill({ color: "%(color)s" }), }); %(cache)s[key] = new ol.style.Style({"text": text}); } var allStyles = [%(cache)s[key]]; allStyles.push.apply(allStyles, style); return allStyles; }''' % {"style": style, "label": labelText, "cache": "styleCache_" + safeName(layer.name()), "size": size, "color": color, "value": value} except Exception, e: style = "{}" path = os.path.join(stylesFolder, safeName(layer.name()) + "_style.js") with open(path, "w") as f: f.write('''%(defs)s var styleCache_%(name)s={} var style_%(name)s = %(style)s;''' % {"defs":defs, "name":safeName(layer.name()), "style":style})
def exportStyles(layers, folder, clustered): stylesFolder = os.path.join(folder, "styles") QDir().mkpath(stylesFolder) for layer, cluster in zip(layers, clustered): if layer.type() != layer.VectorLayer: continue labelsEnabled = unicode( layer.customProperty("labeling/enabled")).lower() == "true" if (labelsEnabled): labelField = layer.customProperty("labeling/fieldName") if 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) or isinstance(renderer, QgsRuleBasedRendererV2)): if isinstance(renderer, QgsRuleBasedRendererV2): symbol = renderer.rootRule().children()[0].symbol() else: symbol = renderer.symbol() if cluster: style = "var size = feature.get('features').length;\n" else: style = "var size = 0;\n" style += " var style = " + getSymbolAsStyle(symbol, stylesFolder, layer_alpha) value = 'var value = ""' elif isinstance(renderer, QgsCategorizedSymbolRendererV2): defs += "var categories_%s = {" % safeName(layer.name()) cats = [] for cat in renderer.categories(): cats.append('"%s": %s' % (cat.value(), getSymbolAsStyle( cat.symbol(), stylesFolder, layer_alpha))) defs += ",\n".join(cats) + "};" value = ('var value = feature.get("%s");' % renderer.classAttribute()) style = ('''var style = categories_%s[value]''' % (safeName(layer.name()))) elif isinstance(renderer, QgsGraduatedSymbolRendererV2): varName = "ranges_" + safeName(layer.name()) defs += "var %s = [" % varName ranges = [] for ran in renderer.ranges(): symbolstyle = getSymbolAsStyle(ran.symbol(), stylesFolder, layer_alpha) ranges.append('[%f, %f, %s]' % (ran.lowerValue(), ran.upperValue(), symbolstyle)) defs += ",\n".join(ranges) + "];" value = ('var value = feature.get("%s");' % renderer.classAttribute()) 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} else: style = "" if layer.customProperty("labeling/fontSize"): size = float(layer.customProperty("labeling/fontSize")) * 1.3 else: size = 10 r = layer.customProperty("labeling/textColorR") g = layer.customProperty("labeling/textColorG") b = layer.customProperty("labeling/textColorB") color = "rgba(%s, %s, %s, 255)" % (r, g, b) if style != "": style = '''function(feature, resolution){ %(value)s %(style)s; if (%(label)s !== null) { var labelText = String(%(label)s); } else { var labelText = "" } var key = value + "_" + labelText if (!%(cache)s[key]){ var text = new ol.style.Text({ font: '%(size)spx Calibri,sans-serif', text: labelText, textBaseline: "center", textAlign: "left", offsetX: 5, offsetY: 3, fill: new ol.style.Fill({ color: "%(color)s" }), }); %(cache)s[key] = new ol.style.Style({"text": text}) } var allStyles = [%(cache)s[key]]; allStyles.push.apply(allStyles, style); return allStyles; }''' % { "style": style, "label": labelText, "cache": "styleCache_" + safeName(layer.name()), "size": size, "color": color, "value": value} else: style = "''" except Exception, e: style = """{ /* """ + traceback.format_exc() + " */}" print traceback.format_exc() path = os.path.join(stylesFolder, safeName(layer.name()) + "_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": safeName(layer.name()), "style": style})
def exportStyles(layers, folder, clustered): stylesFolder = os.path.join(folder, "styles") QDir().mkpath(stylesFolder) legendFolder = os.path.join(stylesFolder, "legend") QDir().mkpath(legendFolder) vtStyles = {} mapUnitLayers = [] 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" pattern = "" setPattern = "" vts = layer.customProperty("VectorTilesReader/vector_tile_url") labelText = getLabels(labelsEnabled, layer, folder, sln) defs = "var size = 0;\nvar placement = 'point';" try: renderer = layer.rendererV2() layer_alpha = layer.layerTransparency() if isinstance(renderer, QgsSingleSymbolRendererV2): (style, pattern, setPattern, value, useMapUnits) = singleSymbol(renderer, stylesFolder, layer_alpha, sln, legendFolder, layer) elif isinstance(renderer, QgsCategorizedSymbolRendererV2): (style, pattern, setPattern, value, defs, useMapUnits) = categorized(defs, sln, layer, renderer, legendFolder, stylesFolder, layer_alpha) elif isinstance(renderer, QgsGraduatedSymbolRendererV2): (style, pattern, setPattern, value, useMapUnits) = graduated(layer, renderer, legendFolder, sln, stylesFolder, layer_alpha) elif isinstance(renderer, QgsRuleBasedRendererV2): (style, pattern, setPattern, value, useMapUnits) = ruleBased(renderer, folder, stylesFolder, layer_alpha, sln, layer) else: style = """ var style = [ new ol.style.Style({ text: createTextStyle(feature, resolution, labelText, labelFont, labelFill, placement) })];""" useMapUnits = False if useMapUnits: if vts is None: mapUnitLayers.append(sln) else: mapUnitLayers.append(safeName(vts)) (labelRes, size, face, color) = getLabelFormat(layer) if style != "": geom = TYPE_MAP[layer.wkbType()].replace("Multi", "") style = getStyle(style, cluster, labelRes, labelText, sln, size, face, color, value, geom) else: style = "''" except Exception, e: style = "" QgsMessageLog.logMessage(traceback.format_exc(), "qgis2ol5", level=QgsMessageLog.CRITICAL) if vts is None: path = os.path.join(stylesFolder, sln + "_style.js") with codecs.open(path, "w", "utf-8") as f: f.write( '''%(defs)s %(pattern)s var style_%(name)s = %(style)s; %(setPattern)s''' % { "defs": defs, "pattern": pattern, "name": sln, "style": style, "setPattern": setPattern }) elif style != "" and style != "''": new_vtStyle = "if (feature.get('layer') == " new_vtStyle += """'%s' && feature.getGeometry().getType() == '%s'){ return %s(feature, resolution); }""" % (layer.name(), TYPE_MAP[layer.wkbType()].replace("Multi", ""), style) try: old_vtStyles = vtStyles[vts] new_vtStyles = """%s %s""" % (old_vtStyles, new_vtStyle) except: new_vtStyles = new_vtStyle vtStyles[vts] = new_vtStyles
def layerToJavascript(iface, layer, encode2json, matchCRS, cluster, restrictToExtent, extent, count): if layer.hasScaleBasedVisibility(): if layer.minimumScale() != 0: minRes = 1 / ((1 / layer.minimumScale()) * 39.37 * 90.7) minResolution = "\nminResolution:%s,\n" % unicode(minRes) else: minResolution = "" if layer.maximumScale() != 0: maxRes = 1 / ((1 / layer.maximumScale()) * 39.37 * 90.7) maxResolution = "maxResolution:%s,\n" % unicode(maxRes) else: maxResolution = "" else: minResolution = "" maxResolution = "" layerName = safeName(layer.name()) + unicode(count) attrText = layer.attribution() attrUrl = layer.attributionUrl() layerAttr = '<a href="%s">%s</a>' % (attrUrl, attrText) if layer.type() == layer.VectorLayer and not is25d(layer, iface.mapCanvas(), restrictToExtent, extent): renderer = layer.rendererV2() if (cluster and isinstance(renderer, QgsSingleSymbolRendererV2)): cluster = True else: cluster = False if isinstance(renderer, QgsHeatmapRenderer): pointLayerType = "Heatmap" hmRadius = renderer.radius() colorRamp = renderer.colorRamp() hmStart = colorRamp.color1().name() hmEnd = colorRamp.color2().name() hmRamp = "['" + hmStart + "', " hmStops = colorRamp.stops() for stop in hmStops: hmRamp += "'" + stop.color.name() + "', " hmRamp += "'" + hmEnd + "']" hmWeight = renderer.weightExpression() hmWeightId = layer.fieldNameIndex(hmWeight) hmWeightMax = layer.maximumValue(hmWeightId) else: pointLayerType = "Vector" if matchCRS: mapCRS = iface.mapCanvas().mapSettings().destinationCrs().authid() crsConvert = """ {dataProjection: 'EPSG:4326', featureProjection: '%(d)s'}""" % { "d": mapCRS} else: crsConvert = """ {dataProjection: 'EPSG:4326', featureProjection: 'EPSG:3857'}""" if layer.providerType() == "WFS" and not encode2json: layerCode = '''var format_%(n)s = new ol.format.GeoJSON(); var jsonSource_%(n)s = new ol.source.Vector({ attributions: [new ol.Attribution({html: '%(layerAttr)s'})], format: format_%(n)s });''' % {"n": layerName, "layerAttr": layerAttr} if cluster: layerCode += '''cluster_%(n)s = new ol.source.Cluster({ distance: 10, source: jsonSource_%(n)s });''' % {"n": layerName} layerCode += '''var lyr_%(n)s = new ol.layer.Vector({ source: ''' % {"n": layerName} if cluster: layerCode += 'cluster_%(n)s,' % {"n": layerName} else: layerCode += 'jsonSource_%(n)s,' % {"n": layerName} layerCode += '''%(min)s %(max)s style: style_%(n)s, title: "%(name)s" }); function get%(n)sJson(geojson) { var features_%(n)s = format_%(n)s.readFeatures(geojson); jsonSource_%(n)s.addFeatures(features_%(n)s); }''' % { "name": layer.name(), "n": layerName, "min": minResolution, "max": maxResolution} return layerCode else: layerCode = '''var format_%(n)s = new ol.format.GeoJSON(); var features_%(n)s = format_%(n)s.readFeatures(json_%(n)s, %(crs)s); var jsonSource_%(n)s = new ol.source.Vector({ attributions: [new ol.Attribution({html: '%(layerAttr)s'})], }); jsonSource_%(n)s.addFeatures(features_%(n)s);''' % {"n": layerName, "crs": crsConvert, "layerAttr": layerAttr} if cluster: layerCode += '''cluster_%(n)s = new ol.source.Cluster({ distance: 10, source: jsonSource_%(n)s });''' % {"n": layerName} layerCode += '''var lyr_%(n)s = new ol.layer.%(t)s({ source:''' % {"n": layerName, "t": pointLayerType} if cluster: layerCode += 'cluster_%(n)s,' % {"n": layerName} else: layerCode += 'jsonSource_%(n)s,' % {"n": layerName} layerCode += '''%(min)s %(max)s''' % {"min": minResolution, "max": maxResolution} if pointLayerType == "Vector": layerCode += ''' style: style_%(n)s,''' % {"n": layerName} else: layerCode += ''' radius: %(hmRadius)d * 2, gradient: %(hmRamp)s, blur: 15, shadow: 250,''' % {"hmRadius": hmRadius, "hmRamp": hmRamp} if hmWeight != "": layerCode += ''' weight: function(feature){ var weightField = '%(hmWeight)s'; var featureWeight = feature.get(weightField); var maxWeight = %(hmWeightMax)d; var calibratedWeight = featureWeight/maxWeight; return calibratedWeight; },''' % {"hmWeight": hmWeight, "hmWeightMax": hmWeightMax} if isinstance(renderer, QgsSingleSymbolRendererV2): layerCode += ''' title: '<img src="styles/legend/%(icon)s.png" /> %(name)s' });''' % {"icon": layerName, "name": layer.name()} elif isinstance(renderer, QgsCategorizedSymbolRendererV2): icons = "" for count, cat in enumerate(renderer.categories()): text = cat.label().replace("'", "\\'") icons += ("""\\ <img src="styles/legend/%(icon)s_%(count)s.png" /> %(text)s<br />""" % {"icon": layerName, "count": count, "text": text}) layerCode += ''' title: '%(name)s<br />%(icons)s' });''' % {"icons": icons, "name": layer.name()} elif isinstance(renderer, QgsGraduatedSymbolRendererV2): icons = "" for count, ran in enumerate(renderer.ranges()): text = ran.label().replace("'", "\\'") icons += ("""\\ <img src="styles/legend/%(icon)s_%(count)s.png" /> %(text)s<br />""" % {"icon": layerName, "count": count, "text": text}) layerCode += ''' title: '%(name)s<br />%(icons)s' });''' % {"icons": icons, "name": layer.name()} else: layerCode += ''' title: '%(name)s' });''' % {"name": layer.name()} return layerCode elif layer.type() == layer.RasterLayer: if layer.providerType().lower() == "wms": source = layer.source() opacity = layer.renderer().opacity() d = parse_qs(source) if "type" in d and d["type"][0] == "xyz": return """ var lyr_%s = new ol.layer.Tile({ 'title': '%s', 'type': 'base', 'opacity': %f, %s %s source: new ol.source.XYZ({ attributions: [new ol.Attribution({html: '%s'})], url: '%s' }) });""" % (layerName, layerName, opacity, minResolution, maxResolution, layerAttr, d["url"][0]) elif "tileMatrixSet" in d: layerId = d["layers"][0] url = d["url"][0] format = d["format"][0] style = d["styles"][0] return ''' var projection_%(n)s = ol.proj.get('EPSG:3857'); var projectionExtent_%(n)s = projection_%(n)s.getExtent(); var size_%(n)s = ol.extent.getWidth(projectionExtent_%(n)s) / 256; var resolutions_%(n)s = new Array(14); var matrixIds_%(n)s = new Array(14); for (var z = 0; z < 14; ++z) { // generate resolutions and matrixIds arrays for this WMTS resolutions_%(n)s[z] = size_%(n)s / Math.pow(2, z); matrixIds_%(n)s[z] = z; } var lyr_%(n)s = new ol.layer.Tile({ source: new ol.source.WMTS(({ url: "%(url)s", attributions: [new ol.Attribution({html: '%(layerAttr)s'})], "layer": "%(layerId)s", "TILED": "true", matrixSet: 'EPSG:3857', format: '%(format)s', projection: projection_%(n)s, tileGrid: new ol.tilegrid.WMTS({ origin: ol.extent.getTopLeft(projectionExtent_%(n)s), resolutions: resolutions_%(n)s, matrixIds: matrixIds_%(n)s }), style: '%(style)s', wrapX: true, "VERSION": "1.0.0", })), title: "%(name)s", opacity: %(opacity)s, %(minRes)s %(maxRes)s });''' % {"layerId": layerId, "url": url, "layerAttr": layerAttr, "format": format, "n": layerName, "name": layer.name(), "opacity": opacity, "style": style, "minRes": minResolution, "maxRes": maxResolution} else: layers = re.search(r"layers=(.*?)(?:&|$)", source).groups(0)[0] url = re.search(r"url=(.*?)(?:&|$)", source).groups(0)[0] metadata = layer.metadata() needle = "<tr><td>%s</td><td>(.+?)</td>" % ( QCoreApplication.translate("QgsWmsProvider", "WMS Version")) result = re.search(needle, metadata) if result: version = result.group(1) else: version = "" return '''var lyr_%(n)s = new ol.layer.Tile({ source: new ol.source.TileWMS(({ url: "%(url)s", attributions: [new ol.Attribution({html: '%(layerAttr)s'})], params: { "LAYERS": "%(layers)s", "TILED": "true", "VERSION": "%(version)s"}, })), title: "%(name)s", opacity: %(opacity)f, %(minRes)s %(maxRes)s });''' % {"layers": layers, "url": url, "layerAttr": layerAttr, "n": layerName, "name": layer.name(), "version": version, "opacity": opacity, "minRes": minResolution, "maxRes": maxResolution} elif layer.providerType().lower() == "gdal": provider = layer.dataProvider() crsSrc = layer.crs() crsDest = QgsCoordinateReferenceSystem(3857) xform = QgsCoordinateTransform(crsSrc, crsDest) extentRep = xform.transform(layer.extent()) sExtent = "[%f, %f, %f, %f]" % (extentRep.xMinimum(), extentRep.yMinimum(), extentRep.xMaximum(), extentRep.yMaximum()) return '''var lyr_%(n)s = new ol.layer.Image({ opacity: 1, title: "%(name)s", %(minRes)s %(maxRes)s source: new ol.source.ImageStatic({ url: "./layers/%(n)s.png", attributions: [new ol.Attribution({html: '%(layerAttr)s'})], projection: 'EPSG:3857', alwaysInRange: true, //imageSize: [%(col)d, %(row)d], imageExtent: %(extent)s }) });''' % {"n": layerName, "extent": sExtent, "col": provider.xSize(), "name": layer.name(), "minRes": minResolution, "maxRes": maxResolution, "layerAttr": layerAttr, "row": provider.ySize()}
def exportStyles(layers, folder): stylesFolder = os.path.join(folder, "styles") QDir().mkpath(stylesFolder) for layer in layers: if layer.type() != layer.VectorLayer: continue labelsEnabled = str( layer.customProperty("labeling/enabled")).lower() == "true" if (labelsEnabled): labelField = layer.customProperty("labeling/fieldName") labelText = 'feature.get("%s")' % labelField else: labelText = '""' defs = "" try: renderer = layer.rendererV2() if isinstance(renderer, QgsSingleSymbolRendererV2): symbol = renderer.symbol() style = "var style = " + getSymbolAsStyle(symbol, stylesFolder) value = 'var value = ""' elif isinstance(renderer, QgsCategorizedSymbolRendererV2): defs += "var categories_%s = {" % safeName(layer.name()) cats = [] for cat in renderer.categories(): cats.append('"%s": %s' % (cat.value(), getSymbolAsStyle(cat.symbol(), stylesFolder))) defs += ",\n".join(cats) + "};" value = 'var value = feature.get("%s");' % renderer.classAttribute( ) style = '''var style = categories_%s[value]''' % (safeName( layer.name())) elif isinstance(renderer, QgsGraduatedSymbolRendererV2): varName = "ranges_" + safeName(layer.name()) defs += "var %s = [" % varName ranges = [] for ran in renderer.ranges(): symbolstyle = getSymbolAsStyle(ran.symbol(), stylesFolder) ranges.append( '[%f, %f, %s]' % (ran.lowerValue(), ran.upperValue(), symbolstyle)) defs += ",\n".join(ranges) + "];" value = 'var value = feature.get("%s");' % renderer.classAttribute( ) 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 } size = layer.customProperty("labeling/fontSize") r = layer.customProperty("labeling/textColorR") g = layer.customProperty("labeling/textColorG") b = layer.customProperty("labeling/textColorB") color = "rgba(%s, %s, %s, 255)" % (r, g, b) style = '''function(feature, resolution){ %(value)s %(style)s; var labelText = %(label)s; var key = value + "_" + labelText if (!%(cache)s[key]){ var text = new ol.style.Text({ font: '%(size)spx Calibri,sans-serif', text: labelText, fill: new ol.style.Fill({ color: "%(color)s" }), }); %(cache)s[key] = new ol.style.Style({"text": text}); } var allStyles = [%(cache)s[key]]; allStyles.push.apply(allStyles, style); return allStyles; }''' % { "style": style, "label": labelText, "cache": "styleCache_" + safeName(layer.name()), "size": size, "color": color, "value": value } except Exception, e: style = "{}" path = os.path.join(stylesFolder, safeName(layer.name()) + "_style.js") with open(path, "w") as f: f.write('''%(defs)s var styleCache_%(name)s={} var style_%(name)s = %(style)s;''' % { "defs": defs, "name": safeName(layer.name()), "style": style })
def writeOL(iface, layers, groups, popup, visible, json, clustered, settings, folder): QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) stamp = time.strftime("%Y_%m_%d-%H_%M_%S") folder = os.path.join(folder, 'qgis2web_' + unicode(stamp)) try: dst = os.path.join(folder, "resources") if not os.path.exists(dst): shutil.copytree(os.path.join(os.path.dirname(__file__), "resources"), dst) matchCRS = settings["Appearance"]["Match project CRS"] precision = settings["Data export"]["Precision"] optimize = settings["Data export"]["Minify GeoJSON files"] cleanUnusedFields = settings["Data export"]["Delete unused fields"] if not cleanUnusedFields: usedFields = [ALL_ATTRIBUTES] * len(popup) else: usedFields = popup exportLayers(iface, layers, folder, precision, optimize, usedFields, json) exportStyles(layers, folder, clustered) writeLayersAndGroups(layers, groups, visible, folder, settings, json, matchCRS, clustered) if settings["Data export"]["Mapping library location"] == "Local": cssAddress = """<link rel="stylesheet" """ cssAddress += """href="./resources/ol.css" />""" jsAddress = """<script src="./resources/ol.js"></script>""" else: cssAddress = """<link rel="stylesheet" href="http://""" cssAddress += """openlayers.org/en/v3.12.1/css/ol.css" />""" jsAddress = """<script src="http://openlayers.org/en/v3.12.1/""" jsAddress += """build/ol.js"></script>""" geojsonVars = "" wfsVars = "" styleVars = "" for layer, encode2json in zip(layers, json): if layer.type() == layer.VectorLayer: if layer.providerType() != "WFS" or encode2json: geojsonVars += ('<script src="layers/%s"></script>' % (safeName(layer.name()) + ".js")) else: layerSource = layer.source() if not matchCRS: layerSource = re.sub('SRSNAME\=EPSG\:\d+', 'SRSNAME=EPSG:3857', layerSource) layerSource += "&outputFormat=text%2Fjavascript&" layerSource += "format_options=callback%3A" layerSource += "get" + safeName(layer.name()) + "Json" wfsVars += ('<script src="%s"></script>' % layerSource) styleVars += ('<script src="styles/%s_style.js"></script>' % (safeName(layer.name()))) popupLayers = "popupLayers = [%s];" % ",".join(['"%s"' % field if ( isinstance(field, basestring)) else unicode(field) for field in popup]) controls = ['expandedAttribution'] # Check qgis2web.js 14:7 if settings["Appearance"]["Add scale bar"]: controls.append("new ol.control.ScaleLine({})") if settings["Appearance"]["Add layers list"]: controls.append( 'new ol.control.LayerSwitcher({tipLabel: "Layers"})') if settings["Appearance"]["Add measure tool"]: controls.append( 'new measureControl()') pageTitle = QgsProject.instance().title() mapSettings = iface.mapCanvas().mapSettings() backgroundColor = """ <style> html, body {{ background-color: {bgcol}; }} </style> """.format(bgcol=mapSettings.backgroundColor().name()) mapbounds = bounds(iface, settings["Scale/Zoom"]["Extent"] == "Canvas extent", layers, settings["Appearance"]["Match project CRS"]) mapextent = "extent: %s," % mapbounds if ( settings["Scale/Zoom"]["Restrict to extent"]) else "" maxZoom = int(settings["Scale/Zoom"]["Max zoom level"]) minZoom = int(settings["Scale/Zoom"]["Min zoom level"]) popupsOnHover = settings["Appearance"]["Show popups on hover"] highlightFeatures = settings["Appearance"]["Highlight features"] onHover = unicode(popupsOnHover).lower() highlight = unicode(highlightFeatures).lower() highlightFill = mapSettings.selectionColor().name() proj4 = "" projdef = "" view = "%s maxZoom: %d, minZoom: %d" % (mapextent, maxZoom, minZoom) if settings["Appearance"]["Match project CRS"]: proj4 = """ <script src="http://cdnjs.cloudflare.com/ajax/libs/proj4js/2.3.6/proj4.js">""" proj4 += "</script>" projdef = "<script>proj4.defs('{epsg}','{defn}');</script>".format( epsg=mapSettings.destinationCrs().authid(), defn=mapSettings.destinationCrs().toProj4()) view += ", projection: '%s'" % ( mapSettings.destinationCrs().authid()) if settings["Appearance"]["Add measure tool"]: measureControl = """ var measuring = false; measureControl = function(opt_options) { var options = opt_options || {}; var button = document.createElement('button'); button.innerHTML = '<img src="resources/measure-control.png" />'; var this_ = this; var handleMeasure = function(e) { if (!measuring) { this_.getMap().addInteraction(draw); measuring = true; } else { this_.getMap().removeInteraction(draw); measuring = false; } }; button.addEventListener('click', handleMeasure, false); button.addEventListener('touchstart', handleMeasure, false); var element = document.createElement('div'); element.className = 'measure-control ol-unselectable ol-control'; element.appendChild(button); ol.control.Control.call(this, { element: element, target: options.target }); }; ol.inherits(measureControl, ol.control.Control);""" measuring = """ if (evt.dragging) { return; } /** @type {string} */ var helpMsg = 'Click to start drawing'; if (sketch) { var geom = (sketch.getGeometry()); if (geom instanceof ol.geom.Polygon) { helpMsg = continuePolygonMsg; } else if (geom instanceof ol.geom.LineString) { helpMsg = continueLineMsg; } } helpTooltipElement.innerHTML = helpMsg; helpTooltip.setPosition(evt.coordinate); document.getElementById('helpTooltipElement').removeClass('hidden');""" measure = """ /** * Currently drawn feature. * @type {ol.Feature} */ var sketch; /** * The help tooltip element. * @type {Element} */ var helpTooltipElement; /** * Overlay to show the help messages. * @type {ol.Overlay} */ var helpTooltip; /** * The measure tooltip element. * @type {Element} */ var measureTooltipElement; /** * Overlay to show the measurement. * @type {ol.Overlay} */ var measureTooltip; /** * Message to show when the user is drawing a line. * @type {string} */ var continueLineMsg = 'Click to continue drawing the line'; var source = new ol.source.Vector(); var draw; // global so we can remove it later function addInteraction() { var type = 'LineString'; draw = new ol.interaction.Draw({ source: source, type: /** @type {ol.geom.GeometryType} */ (type), style: new ol.style.Style({ fill: new ol.style.Fill({ color: 'rgba(255, 255, 255, 0.2)' }), stroke: new ol.style.Stroke({ color: 'rgba(0, 0, 0, 0.5)', lineDash: [10, 10], width: 2 }), image: new ol.style.Circle({ radius: 5, stroke: new ol.style.Stroke({ color: 'rgba(0, 0, 0, 0.7)' }), fill: new ol.style.Fill({ color: 'rgba(255, 255, 255, 0.2)' }) }) }) }); //map.addInteraction(draw); createMeasureTooltip(); createHelpTooltip(); var listener; draw.on('drawstart', function(evt) { // set sketch sketch = evt.feature; /** @type {ol.Coordinate|undefined} */ var tooltipCoord = evt.coordinate; listener = sketch.getGeometry().on('change', function(evt) { var geom = evt.target; var output; output = formatLength( /** @type {ol.geom.LineString} */ (geom)); tooltipCoord = geom.getLastCoordinate(); measureTooltipElement.innerHTML = output; measureTooltip.setPosition(tooltipCoord); }); }, this); draw.on('drawend', function(evt) { measureTooltipElement.className = 'tooltip tooltip-static'; measureTooltip.setOffset([0, -7]); // unset sketch sketch = null; // unset tooltip so that a new one can be created measureTooltipElement = null; createMeasureTooltip(); ol.Observable.unByKey(listener); }, this); } /** * Creates a new help tooltip */ function createHelpTooltip() { if (helpTooltipElement) { helpTooltipElement.parentNode.removeChild(helpTooltipElement); } helpTooltipElement = document.createElement('div'); helpTooltipElement.className = 'tooltip hidden'; helpTooltip = new ol.Overlay({ element: helpTooltipElement, offset: [15, 0], positioning: 'center-left' }); map.addOverlay(helpTooltip); } /** * Creates a new measure tooltip */ function createMeasureTooltip() { if (measureTooltipElement) { measureTooltipElement.parentNode.removeChild(measureTooltipElement); } measureTooltipElement = document.createElement('div'); measureTooltipElement.className = 'tooltip tooltip-measure'; measureTooltip = new ol.Overlay({ element: measureTooltipElement, offset: [0, -15], positioning: 'bottom-center' }); map.addOverlay(measureTooltip); } /** * format length output * @param {ol.geom.LineString} line * @return {string} */ var formatLength = function(line) { var length; length = Math.round(line.getLength() * 100) / 100; var output; if (length > 100) { output = (Math.round(length / 1000 * 100) / 100) + ' ' + 'km'; } else { output = (Math.round(length * 100) / 100) + ' ' + 'm'; } return output; }; addInteraction();""" measureStyle = """ <style> .tooltip { position: relative; background: rgba(0, 0, 0, 0.5); border-radius: 4px; color: white; padding: 4px 8px; opacity: 0.7; white-space: nowrap; } .tooltip-measure { opacity: 1; font-weight: bold; } .tooltip-static { background-color: #ffcc33; color: black; border: 1px solid white; } .tooltip-measure:before, .tooltip-static:before { border-top: 6px solid rgba(0, 0, 0, 0.5); border-right: 6px solid transparent; border-left: 6px solid transparent; content: ""; position: absolute; bottom: -6px; margin-left: -7px; left: 50%; } .tooltip-static:before { border-top-color: #ffcc33; } .measure-control { top: 65px; left: .5em; } .ol-touch .measure-control { top: 80px; } </style>""" else: measureControl = "" measuring = "" measure = "" measureStyle = "" geolocate = geolocation(settings["Appearance"]["Geolocate user"]) geocode = settings["Appearance"]["Add address search"] geocodingLinks = geocodeLinks(geocode) geocodingScript = geocodeScript(geocode) extracss = """ <link rel="stylesheet" href="./resources/ol3-layerswitcher.css"> <link rel="stylesheet" href="./resources/qgis2web.css">""" ol3layerswitcher = """ <script src="./resources/ol3-layerswitcher.js"></script>""" ol3popup = """<div id="popup" class="ol-popup"> <a href="#" id="popup-closer" class="ol-popup-closer"></a> <div id="popup-content"></div> </div>""" ol3qgis2webjs = """<script src="./resources/qgis2web.js"></script>""" ol3layers = """ <script src="./layers/layers.js" type="text/javascript"></script>""" mapSize = iface.mapCanvas().size() values = {"@PAGETITLE@": pageTitle, "@CSSADDRESS@": cssAddress, "@EXTRACSS@": extracss, "@JSADDRESS@": jsAddress, "@MAP_WIDTH@": unicode(mapSize.width()) + "px", "@MAP_HEIGHT@": unicode(mapSize.height()) + "px", "@OL3_STYLEVARS@": styleVars, "@OL3_BACKGROUNDCOLOR@": backgroundColor, "@OL3_POPUP@": ol3popup, "@OL3_GEOJSONVARS@": geojsonVars, "@OL3_WFSVARS@": wfsVars, "@OL3_PROJ4@": proj4, "@OL3_PROJDEF@": projdef, "@OL3_GEOCODINGLINKS@": geocodingLinks, "@QGIS2WEBJS@": ol3qgis2webjs, "@OL3_LAYERSWITCHER@": ol3layerswitcher, "@OL3_LAYERS@": ol3layers, "@OL3_MEASURESTYLE@": measureStyle, "@LEAFLET_ADDRESSCSS@": "", "@LEAFLET_MEASURECSS@": "", "@LEAFLET_EXTRAJS@": "", "@LEAFLET_ADDRESSJS@": "", "@LEAFLET_MEASUREJS@": "", "@LEAFLET_CRSJS@": "", "@LEAFLET_CLUSTERCSS@": "", "@LEAFLET_CLUSTERJS@": ""} with open(os.path.join(folder, "index.html"), "w") as f: htmlTemplate = settings["Appearance"]["Template"] if htmlTemplate == "": htmlTemplate = "basic" f.write(replaceInTemplate(htmlTemplate + ".html", values)) values = {"@BOUNDS@": mapbounds, "@CONTROLS@": ",".join(controls), "@POPUPLAYERS@": popupLayers, "@VIEW@": view, "@ONHOVER@": onHover, "@DOHIGHLIGHT@": highlight, "@HIGHLIGHTFILL@": highlightFill, "@GEOLOCATE@": geolocate, "@GEOCODINGSCRIPT@": geocodingScript, "@MEASURECONTROL@": measureControl, "@MEASURING@": measuring, "@MEASURE@": measure} with open(os.path.join(folder, "resources", "qgis2web.js"), "w") as f: f.write(replaceInScript("qgis2web.js", values)) except Exception as e: print "FAIL" print traceback.format_exc() finally: QApplication.restoreOverrideCursor() return os.path.join(folder, "index.html")
}) elif style != "" and style != "''": new_vtStyle = "if (feature.get('layer') == " new_vtStyle += """'%s' && feature.getGeometry().getType() == '%s'){ return %s(feature, resolution); }""" % (layer.name(), TYPE_MAP[layer.wkbType()].replace("Multi", ""), style) try: old_vtStyles = vtStyles[vts] new_vtStyles = """%s %s""" % (old_vtStyles, new_vtStyle) except: new_vtStyles = new_vtStyle vtStyles[vts] = new_vtStyles for k, v in vtStyles.items(): styleName = safeName(k) styleString = v path = os.path.join(stylesFolder, styleName + "_style.js") with codecs.open(path, "w", "utf-8") as f: f.write( ''' var style_%(name)s = function(feature, resolution) { %(style)s; }''' % { "defs": defs, "pattern": pattern, "name": styleName, "style": styleString, "setPattern": setPattern })
def writeOL(iface, layers, groups, popup, visible, json, clustered, settings, folder): QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) stamp = time.strftime("%Y_%m_%d-%H_%M_%S") folder = os.path.join(folder, 'qgis2web_' + unicode(stamp)) imagesFolder = os.path.join(folder, "images") QDir().mkpath(imagesFolder) try: dst = os.path.join(folder, "resources") if not os.path.exists(dst): shutil.copytree( os.path.join(os.path.dirname(__file__), "resources"), dst) matchCRS = settings["Appearance"]["Match project CRS"] precision = settings["Data export"]["Precision"] optimize = settings["Data export"]["Minify GeoJSON files"] exportLayers(iface, layers, folder, precision, optimize, popup, json) exportStyles(layers, folder, clustered) osmb = writeLayersAndGroups(layers, groups, visible, folder, popup, settings, json, matchCRS, clustered, iface) jsAddress = '<script src="resources/polyfills.js"></script>' if settings["Data export"]["Mapping library location"] == "Local": cssAddress = """<link rel="stylesheet" """ cssAddress += """href="./resources/ol.css" />""" jsAddress += """ <script src="./resources/ol.js"></script>""" else: cssAddress = """<link rel="stylesheet" href="http://""" cssAddress += """openlayers.org/en/v3.18.2/css/ol.css" />""" jsAddress += """ <script src="http://openlayers.org/en/v3.18.2/""" jsAddress += """build/ol.js"></script>""" layerSearch = settings["Appearance"]["Layer search"] if layerSearch != "None" and layerSearch != "": cssAddress += """ <link rel="stylesheet" href="resources/horsey.min.css"> <link rel="stylesheet" href="resources/ol3-search-layer.min.css">""" jsAddress += """ <script src="http://cdn.polyfill.io/v2/polyfill.min.js?features=""" jsAddress += """Element.prototype.classList,URL"></script> <script src="resources/horsey.min.js"></script> <script src="resources/ol3-search-layer.min.js"></script>""" searchVals = layerSearch.split(": ") layerSearch = """ var searchLayer = new ol.SearchLayer({{ layer: lyr_{layer}, colName: '{field}', zoom: 10, collapsed: true, map: map }}); map.addControl(searchLayer);""".format(layer=searchVals[0], field=searchVals[1]) else: layerSearch = "" if osmb != "": jsAddress += """ <script src="resources/OSMBuildings-OL3.js"></script>""" geojsonVars = "" wfsVars = "" styleVars = "" for layer, encode2json in zip(layers, json): if layer.type() == layer.VectorLayer: if layer.providerType() != "WFS" or encode2json: geojsonVars += ('<script src="layers/%s"></script>' % (safeName(layer.name()) + ".js")) else: layerSource = layer.source() if "retrictToRequestBBOX" in layerSource: provider = layer.dataProvider() uri = QgsDataSourceURI(provider.dataSourceUri()) wfsURL = uri.param("url") wfsTypename = uri.param("typename") wfsSRS = uri.param("srsname") layerSource = wfsURL layerSource += "?SERVICE=WFS&VERSION=1.0.0&" layerSource += "REQUEST=GetFeature&TYPENAME=" layerSource += wfsTypename layerSource += "&SRSNAME=" layerSource += wfsSRS if not matchCRS: layerSource = re.sub('SRSNAME\=EPSG\:\d+', 'SRSNAME=EPSG:3857', layerSource) layerSource += "&outputFormat=text%2Fjavascript&" layerSource += "format_options=callback%3A" layerSource += "get" + safeName(layer.name()) + "Json" wfsVars += ('<script src="%s"></script>' % layerSource) styleVars += ('<script src="styles/%s_style.js"></script>' % (safeName(layer.name()))) popupLayers = "popupLayers = [%s];" % ",".join( ['1' for field in popup]) controls = ['expandedAttribution'] project = QgsProject.instance() if project.readBoolEntry("ScaleBar", "/Enabled", False)[0]: controls.append("new ol.control.ScaleLine({})") if settings["Appearance"]["Add layers list"]: controls.append( 'new ol.control.LayerSwitcher({tipLabel: "Layers"})') if settings["Appearance"]["Measure tool"] != "None": controls.append('new measureControl()') if settings["Appearance"]["Geolocate user"]: controls.append('new geolocateControl()') pageTitle = project.title() mapSettings = iface.mapCanvas().mapSettings() backgroundColor = """ <style> html, body {{ background-color: {bgcol}; }} </style> """.format(bgcol=mapSettings.backgroundColor().name()) geolocateUser = settings["Appearance"]["Geolocate user"] backgroundColor += geolocateStyle(geolocateUser) mapbounds = bounds(iface, settings["Scale/Zoom"]["Extent"] == "Canvas extent", layers, settings["Appearance"]["Match project CRS"]) mapextent = "extent: %s," % mapbounds if ( settings["Scale/Zoom"]["Restrict to extent"]) else "" maxZoom = int(settings["Scale/Zoom"]["Max zoom level"]) minZoom = int(settings["Scale/Zoom"]["Min zoom level"]) popupsOnHover = settings["Appearance"]["Show popups on hover"] highlightFeatures = settings["Appearance"]["Highlight on hover"] onHover = unicode(popupsOnHover).lower() highlight = unicode(highlightFeatures).lower() highlightFill = mapSettings.selectionColor().name() proj4 = "" proj = "" view = "%s maxZoom: %d, minZoom: %d" % (mapextent, maxZoom, minZoom) if settings["Appearance"]["Match project CRS"]: proj4 = """ <script src="http://cdnjs.cloudflare.com/ajax/libs/proj4js/2.3.6/proj4.js">""" proj4 += "</script>" proj = "<script>proj4.defs('{epsg}','{defn}');</script>".format( epsg=mapSettings.destinationCrs().authid(), defn=mapSettings.destinationCrs().toProj4()) view += ", projection: '%s'" % ( mapSettings.destinationCrs().authid()) if settings["Appearance"]["Measure tool"] != "None": measureControl = measureControlScript() measuring = measuringScript() measure = measureScript() if settings["Appearance"]["Measure tool"] == "Imperial": measureUnit = measureUnitFeetScript() else: measureUnit = measureUnitMetricScript() measureStyle = measureStyleScript() else: measureControl = "" measuring = "" measure = "" measureUnit = "" measureStyle = "" geolocateHead = geolocationHead(geolocateUser) geolocate = geolocation(geolocateUser) geocode = settings["Appearance"]["Add address search"] geocodingLinks = geocodeLinks(geocode) geocodingScript = geocodeScript(geocode) extracss = """ <link rel="stylesheet" href="./resources/ol3-layerswitcher.css"> <link rel="stylesheet" href="./resources/qgis2web.css">""" if settings["Appearance"]["Geolocate user"]: extracss += """ <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/""" extracss += """font-awesome/4.6.3/css/font-awesome.min.css">""" ol3layerswitcher = """ <script src="./resources/ol3-layerswitcher.js"></script>""" ol3popup = """<div id="popup" class="ol-popup"> <a href="#" id="popup-closer" class="ol-popup-closer"></a> <div id="popup-content"></div> </div>""" ol3qgis2webjs = """<script src="./resources/qgis2web.js"></script> <script src="./resources/Autolinker.min.js"></script>""" if osmb != "": ol3qgis2webjs += """ <script>{osmb}</script>""".format(osmb=osmb) ol3layers = """ <script src="./layers/layers.js" type="text/javascript"></script>""" mapSize = iface.mapCanvas().size() values = { "@PAGETITLE@": pageTitle, "@CSSADDRESS@": cssAddress, "@EXTRACSS@": extracss, "@JSADDRESS@": jsAddress, "@MAP_WIDTH@": unicode(mapSize.width()) + "px", "@MAP_HEIGHT@": unicode(mapSize.height()) + "px", "@OL3_STYLEVARS@": styleVars, "@OL3_BACKGROUNDCOLOR@": backgroundColor, "@OL3_POPUP@": ol3popup, "@OL3_GEOJSONVARS@": geojsonVars, "@OL3_WFSVARS@": wfsVars, "@OL3_PROJ4@": proj4, "@OL3_PROJDEF@": proj, "@OL3_GEOCODINGLINKS@": geocodingLinks, "@QGIS2WEBJS@": ol3qgis2webjs, "@OL3_LAYERSWITCHER@": ol3layerswitcher, "@OL3_LAYERS@": ol3layers, "@OL3_MEASURESTYLE@": measureStyle, "@LEAFLET_ADDRESSCSS@": "", "@LEAFLET_MEASURECSS@": "", "@LEAFLET_EXTRAJS@": "", "@LEAFLET_ADDRESSJS@": "", "@LEAFLET_MEASUREJS@": "", "@LEAFLET_CRSJS@": "", "@LEAFLET_LAYERSEARCHCSS@": "", "@LEAFLET_LAYERSEARCHJS@": "", "@LEAFLET_CLUSTERCSS@": "", "@LEAFLET_CLUSTERJS@": "" } with open(os.path.join(folder, "index.html"), "w") as f: htmlTemplate = settings["Appearance"]["Template"] if htmlTemplate == "": htmlTemplate = "basic" templateOutput = replaceInTemplate(htmlTemplate + ".html", values) templateOutput = re.sub('\n[\s_]+\n', '\n', templateOutput) f.write(templateOutput) values = { "@GEOLOCATEHEAD@": geolocateHead, "@BOUNDS@": mapbounds, "@CONTROLS@": ",".join(controls), "@POPUPLAYERS@": popupLayers, "@VIEW@": view, "@LAYERSEARCH@": layerSearch, "@ONHOVER@": onHover, "@DOHIGHLIGHT@": highlight, "@HIGHLIGHTFILL@": highlightFill, "@GEOLOCATE@": geolocate, "@GEOCODINGSCRIPT@": geocodingScript, "@MEASURECONTROL@": measureControl, "@MEASURING@": measuring, "@MEASURE@": measure, "@MEASUREUNIT@": measureUnit } with open(os.path.join(folder, "resources", "qgis2web.js"), "w") as f: f.write(replaceInScript("qgis2web.js", values)) except Exception as e: print "FAIL" print traceback.format_exc() finally: QApplication.restoreOverrideCursor() return os.path.join(folder, "index.html")
def writeLayersAndGroups(layers, groups, visible, folder, popup, settings, json, matchCRS, clustered, iface, restrictToExtent, extent): canvas = iface.mapCanvas() basemapList = settings["Appearance"]["Base layer"] basemaps = [basemapOL()[item] for _, item in enumerate(basemapList)] if len(basemapList) > 1: baseGroup = "Base maps" else: baseGroup = "" baseLayer = """var baseLayer = new ol.layer.Group({ 'title': '%s', layers: [%s\n] });""" % (baseGroup, ','.join(basemaps)) layerVars = "" layer_names_id = {} for count, (layer, encode2json, cluster) in enumerate(zip(layers, json, clustered)): layer_names_id[layer.id()] = str(count) try: if is25d(layer, canvas, restrictToExtent, extent): pass else: layerVars += "\n".join([layerToJavascript(iface, layer, encode2json, matchCRS, cluster, restrictToExtent, extent, count)]) except: try: layerVars += "\n".join([layerToJavascript(iface, layer, encode2json, matchCRS, cluster, restrictToExtent, extent, count)]) except: pass groupVars = "" groupedLayers = {} for group, groupLayers in groups.iteritems(): groupLayerObjs = "" for layer in groupLayers: try: if isinstance(layer, TileLayer): continue except: pass groupLayerObjs += ("lyr_" + safeName(layer.name()) + layer_names_id[layer.id()] + ",") groupVars += ('''var %s = new ol.layer.Group({ layers: [%s], title: "%s"});\n''' % ("group_" + safeName(group), groupLayerObjs, group)) for layer in groupLayers: groupedLayers[layer.id()] = safeName(group) mapLayers = ["baseLayer"] usedGroups = [] osmb = "" for count, layer in enumerate(layers): try: renderer = layer.rendererV2() if is25d(layer, canvas, restrictToExtent, extent): shadows = "" renderer = layer.rendererV2() renderContext = QgsRenderContext.fromMapSettings( canvas.mapSettings()) fields = layer.pendingFields() renderer.startRender(renderContext, fields) for feat in layer.getFeatures(): if isinstance(renderer, QgsCategorizedSymbolRendererV2): classAttribute = renderer.classAttribute() attrValue = feat.attribute(classAttribute) catIndex = renderer.categoryIndexForValue(attrValue) categories = renderer.categories() symbol = categories[catIndex].symbol() elif isinstance(renderer, QgsGraduatedSymbolRendererV2): classAttribute = renderer.classAttribute() attrValue = feat.attribute(classAttribute) ranges = renderer.ranges() for range in ranges: if (attrValue >= range.lowerValue() and attrValue <= range.upperValue()): symbol = range.symbol().clone() else: symbol = renderer.symbolForFeature2(feat, renderContext) symbolLayer = symbol.symbolLayer(0) if not symbolLayer.paintEffect().effectList()[0].enabled(): shadows = "'2015-07-15 10:00:00'" renderer.stopRender(renderContext) osmb = """ var osmb = new OSMBuildings(map).date(new Date({shadows})); osmb.set(json_{sln}{count});""".format(shadows=shadows, sln=safeName(layer.name()), count=unicode(count)) else: try: if not isinstance(layer, TileLayer): mapLayers.append("lyr_" + safeName(layer.name()) + unicode(count)) except: mapLayers.append("lyr_" + safeName(layer.name()) + unicode(count)) except: QgsMessageLog.logMessage(traceback.format_exc(), "qgis2web", level=QgsMessageLog.CRITICAL) try: if not isinstance(layer, TileLayer): mapLayers.append("lyr_" + safeName(layer.name()) + unicode(count)) except: mapLayers.append("lyr_" + safeName(layer.name()) + unicode(count)) visibility = "" for layer, v in zip(mapLayers[1:], visible): visibility += "\n".join(["%s.setVisible(%s);" % (layer, unicode(v).lower())]) group_list = ["baseLayer"] if len(basemapList) else [] no_group_list = [] for count, layer in enumerate(layers): try: if is25d(layer, canvas, restrictToExtent, extent): pass else: if layer.id() in groupedLayers: groupName = groupedLayers[layer.id()] if groupName not in usedGroups: group_list.append("group_" + safeName(groupName)) usedGroups.append(groupName) else: no_group_list.append("lyr_" + safeName(layer.name()) + unicode(count)) except: if layer.id() in groupedLayers: groupName = groupedLayers[layer.id()] if groupName not in usedGroups: group_list.append("group_" + safeName(groupName)) usedGroups.append(groupName) else: no_group_list.append("lyr_" + safeName(layer.name()) + unicode(count)) layersList = [] for layer in (group_list + no_group_list): layersList.append(layer) layersListString = "var layersList = [" + ",".join(layersList) + "];" fieldAliases = "" fieldImages = "" fieldLabels = "" blend_mode = "" for count, (layer, labels) in enumerate(zip(layers, popup)): sln = safeName(layer.name()) + unicode(count) if layer.type() == layer.VectorLayer and not is25d(layer, canvas, restrictToExtent, extent): fieldList = layer.pendingFields() aliasFields = "" imageFields = "" labelFields = "" for field, label in zip(labels.keys(), labels.values()): labelFields += "'%(field)s': '%(label)s', " % ( {"field": field, "label": label}) labelFields = "{%(labelFields)s});\n" % ( {"labelFields": labelFields}) labelFields = "lyr_%(name)s.set('fieldLabels', " % ( {"name": sln}) + labelFields fieldLabels += labelFields for f in fieldList: fieldIndex = fieldList.indexFromName(unicode(f.name())) aliasFields += "'%(field)s': '%(alias)s', " % ( {"field": f.name(), "alias": layer.attributeDisplayName(fieldIndex)}) widget = layer.editFormConfig().widgetType(fieldIndex) imageFields += "'%(field)s': '%(image)s', " % ( {"field": f.name(), "image": widget}) aliasFields = "{%(aliasFields)s});\n" % ( {"aliasFields": aliasFields}) aliasFields = "lyr_%(name)s.set('fieldAliases', " % ( {"name": sln}) + aliasFields fieldAliases += aliasFields imageFields = "{%(imageFields)s});\n" % ( {"imageFields": imageFields}) imageFields = "lyr_%(name)s.set('fieldImages', " % ( {"name": sln}) + imageFields fieldImages += imageFields blend_mode = """lyr_%(name)s.on('precompose', function(evt) { evt.context.globalCompositeOperation = '%(blend)s'; });""" % ( {"name": sln, "blend": BLEND_MODES[layer.blendMode()]}) path = os.path.join(folder, "layers", "layers.js") with codecs.open(path, "w", "utf-8") as f: if basemapList: f.write(baseLayer + "\n") f.write(layerVars + "\n") f.write(groupVars + "\n") f.write(visibility + "\n") f.write(layersListString + "\n") f.write(fieldAliases) f.write(fieldImages) f.write(fieldLabels) f.write(blend_mode) return osmb
def layerToJavascript(iface, layer, encode2json, matchCRS, cluster): if layer.hasScaleBasedVisibility(): minRes = 1 / ((1 / layer.minimumScale()) * 39.37 * 90.7) maxRes = 1 / ((1 / layer.maximumScale()) * 39.37 * 90.7) minResolution = "\nminResolution:%s,\n" % unicode(minRes) maxResolution = "maxResolution:%s,\n" % unicode(maxRes) else: minResolution = "" maxResolution = "" layerName = safeName(layer.name()) if layer.type() == layer.VectorLayer and not is25d(layer, iface.mapCanvas()): renderer = layer.rendererV2() if cluster and (isinstance(renderer, QgsSingleSymbolRendererV2) or isinstance(renderer, QgsRuleBasedRendererV2)): cluster = True else: cluster = False if isinstance(renderer, QgsHeatmapRenderer): pointLayerType = "Heatmap" hmRadius = renderer.radius() colorRamp = renderer.colorRamp() hmStart = colorRamp.color1().name() hmEnd = colorRamp.color2().name() hmRamp = "['" + hmStart + "', " hmStops = colorRamp.stops() for stop in hmStops: hmRamp += "'" + stop.color.name() + "', " hmRamp += "'" + hmEnd + "']" hmWeight = renderer.weightExpression() hmWeightId = layer.fieldNameIndex(hmWeight) hmWeightMax = layer.maximumValue(hmWeightId) else: pointLayerType = "Vector" if matchCRS: mapCRS = iface.mapCanvas().mapSettings().destinationCrs().authid() crsConvert = """ {dataProjection: 'EPSG:4326', featureProjection: '%(d)s'}""" % { "d": mapCRS } else: crsConvert = """ {dataProjection: 'EPSG:4326', featureProjection: 'EPSG:3857'}""" if layer.providerType() == "WFS" and not encode2json: layerCode = '''var format_%(n)s = new ol.format.GeoJSON(); var jsonSource_%(n)s = new ol.source.Vector({ format: format_%(n)s });''' % { "n": layerName } if cluster: layerCode += '''cluster_%(n)s = new ol.source.Cluster({ distance: 10, source: jsonSource_%(n)s });''' % { "n": layerName } layerCode += '''var lyr_%(n)s = new ol.layer.Vector({ source: ''' % { "n": layerName } if cluster: layerCode += 'cluster_%(n)s,' % {"n": layerName} else: layerCode += 'jsonSource_%(n)s,' % {"n": layerName} layerCode += '''%(min)s %(max)s style: style_%(n)s, title: "%(name)s" }); function get%(n)sJson(geojson) { var features_%(n)s = format_%(n)s.readFeatures(geojson); jsonSource_%(n)s.addFeatures(features_%(n)s); }''' % { "name": layer.name(), "n": layerName, "min": minResolution, "max": maxResolution } return layerCode else: layerCode = '''var format_%(n)s = new ol.format.GeoJSON(); var features_%(n)s = format_%(n)s.readFeatures(geojson_%(n)s, %(crs)s); var jsonSource_%(n)s = new ol.source.Vector(); jsonSource_%(n)s.addFeatures(features_%(n)s);''' % { "n": layerName, "crs": crsConvert } if cluster: layerCode += '''cluster_%(n)s = new ol.source.Cluster({ distance: 10, source: jsonSource_%(n)s });''' % { "n": layerName } layerCode += '''var lyr_%(n)s = new ol.layer.%(t)s({ source:''' % { "n": layerName, "t": pointLayerType } if cluster: layerCode += 'cluster_%(n)s,' % {"n": layerName} else: layerCode += 'jsonSource_%(n)s,' % {"n": layerName} layerCode += '''%(min)s %(max)s''' % { "min": minResolution, "max": maxResolution } if pointLayerType == "Vector": layerCode += ''' style: style_%(n)s,''' % { "n": layerName } else: layerCode += ''' radius: %(hmRadius)d * 2, gradient: %(hmRamp)s, blur: 15, shadow: 250,''' % { "hmRadius": hmRadius, "hmRamp": hmRamp } if hmWeight != "": layerCode += ''' weight: function(feature){ var weightField = '%(hmWeight)s'; var featureWeight = feature.get(weightField); var maxWeight = %(hmWeightMax)d; var calibratedWeight = featureWeight/maxWeight; return calibratedWeight; },''' % { "hmWeight": hmWeight, "hmWeightMax": hmWeightMax } layerCode += ''' title: "%(name)s" });''' % { "name": layer.name() } return layerCode elif layer.type() == layer.RasterLayer: if layer.providerType().lower() == "wms": source = layer.source() layers = re.search(r"layers=(.*?)(?:&|$)", source).groups(0)[0] url = re.search(r"url=(.*?)(?:&|$)", source).groups(0)[0] return '''var lyr_%(n)s = new ol.layer.Tile({ source: new ol.source.TileWMS(({ url: "%(url)s", params: {"LAYERS": "%(layers)s", "TILED": "true"}, })), title: "%(name)s", %(minRes)s %(maxRes)s });''' % { "layers": layers, "url": url, "n": layerName, "name": layer.name(), "minRes": minResolution, "maxRes": maxResolution } elif layer.providerType().lower() == "gdal": provider = layer.dataProvider() crsSrc = layer.crs() crsDest = QgsCoordinateReferenceSystem(3857) xform = QgsCoordinateTransform(crsSrc, crsDest) extentRep = xform.transform(layer.extent()) sExtent = "[%f, %f, %f, %f]" % ( extentRep.xMinimum(), extentRep.yMinimum(), extentRep.xMaximum(), extentRep.yMaximum()) return '''var lyr_%(n)s = new ol.layer.Image({ opacity: 1, title: "%(name)s", %(minRes)s %(maxRes)s source: new ol.source.ImageStatic({ url: "./layers/%(n)s.png", projection: 'EPSG:3857', alwaysInRange: true, //imageSize: [%(col)d, %(row)d], imageExtent: %(extent)s }) });''' % { "n": layerName, "extent": sExtent, "col": provider.xSize(), "name": layer.name(), "minRes": minResolution, "maxRes": maxResolution, "row": provider.ySize() }
def writeLeaflet(cls, iface, feedback, folder, layer_list, visible, cluster, json, getFeatureInfo, params, popup): outputProjectFileName = folder QApplication.setOverrideCursor(QCursor(Qt.WaitCursor)) legends = {} mapUnitLayers = [] canvas = iface.mapCanvas() project = QgsProject.instance() mapSettings = canvas.mapSettings() title = project.title() pluginDir = os.path.dirname(os.path.realpath(__file__)) stamp = datetime.now().strftime("%Y_%m_%d-%H_%M_%S_%f") outputProjectFileName = os.path.join(outputProjectFileName, 'qgis2ol5_' + unicode(stamp)) outputIndex = os.path.join(outputProjectFileName, 'index.html') mapLibLocation = params["Data export"]["Mapping library location"] minify = params["Data export"]["Minify GeoJSON files"] precision = params["Data export"]["Precision"] debugLibs = params["Data export"]["Use debug libraries"] extent = params["Scale/Zoom"]["Extent"] minZoom = params["Scale/Zoom"]["Min zoom level"] maxZoom = params["Scale/Zoom"]["Max zoom level"] restrictToExtent = params["Scale/Zoom"]["Restrict to extent"] basemapList = params["Appearance"]["Base layer"] matchCRS = params["Appearance"]["Match project CRS"] addressSearch = params["Appearance"]["Add address search"] locate = params["Appearance"]["Geolocate user"] measure = params["Appearance"]["Measure tool"] highlight = params["Appearance"]["Highlight on hover"] layerSearch = params["Appearance"]["Layer search"] popupsOnHover = params["Appearance"]["Show popups on hover"] template = params["Appearance"]["Template"] usedFields = [ALL_ATTRIBUTES] * len(popup) QgsApplication.initQgis() dataStore, cssStore = writeFoldersAndFiles( pluginDir, feedback, outputProjectFileName, cluster, measure, matchCRS, layerSearch, canvas, mapLibLocation, addressSearch, locate, debugLibs) writeCSS(cssStore, mapSettings.backgroundColor().name(), feedback) wfsLayers = "" labelCode = "" vtStyles = {} useMultiStyle = False useHeat = False useVT = False useShapes = False useOSMB = False useWMS = False useWMTS = False useRaster = False scaleDependentLayers = "" labelVisibility = "" new_src = "" jsons = "" crs = QgsCoordinateReferenceSystem.EpsgCrsId exp_crs = QgsCoordinateReferenceSystem(4326, crs) lyrCount = 0 for layer, jsonEncode, eachPopup, clst in zip(layer_list, json, popup, cluster): rawLayerName = layer.name() safeLayerName = safeName(rawLayerName) + "_" + unicode(lyrCount) vts = layer.customProperty("VectorTilesReader/vector_tile_url") if layer.providerType() != 'WFS' or jsonEncode is True: if layer.type() == QgsMapLayer.VectorLayer and vts is None: feedback.showFeedback('Exporting %s to JSON...' % layer.name()) exportVector(layer, safeLayerName, dataStore, restrictToExtent, iface, extent, precision, exp_crs, minify) jsons += jsonScript(safeLayerName) scaleDependentLabels =\ scaleDependentLabelScript(layer, safeLayerName) labelVisibility += scaleDependentLabels feedback.completeStep() elif layer.type() == QgsMapLayer.RasterLayer: if layer.dataProvider().name() != "wms": layersFolder = os.path.join(outputProjectFileName, "data") exportRaster(layer, lyrCount, layersFolder, feedback, iface, matchCRS) if layer.hasScaleBasedVisibility(): scaleDependentLayers += scaleDependentLayerScript( layer, safeLayerName, clst) lyrCount += 1 if scaleDependentLayers != "": scaleDependentLayers = scaleDependentScript(scaleDependentLayers) crsSrc = mapSettings.destinationCrs() crsAuthId = crsSrc.authid() crsProj4 = crsSrc.toProj4() middle = """ """ if highlight or popupsOnHover: selectionColor = mapSettings.selectionColor().name() middle += highlightScript(highlight, popupsOnHover, selectionColor) if extent == "Canvas extent": pt0 = canvas.extent() crsDest = QgsCoordinateReferenceSystem(4326) xform = QgsCoordinateTransform(crsSrc, crsDest) pt1 = xform.transform(pt0) bbox_canvas = [ pt1.yMinimum(), pt1.yMaximum(), pt1.xMinimum(), pt1.xMaximum() ] bounds = '[[' + unicode(pt1.yMinimum()) + ',' bounds += unicode(pt1.xMinimum()) + '],[' bounds += unicode(pt1.yMaximum()) + ',' bounds += unicode(pt1.xMaximum()) + ']]' if matchCRS and crsAuthId != 'EPSG:4326': middle += crsScript(crsAuthId, crsProj4) else: bounds = 0 if matchCRS and crsAuthId != 'EPSG:4326': middle += crsScript(crsAuthId, crsProj4) middle += mapScript(extent, matchCRS, crsAuthId, measure, maxZoom, minZoom, bounds, locate) middle += featureGroupsScript() if (len(basemapList) == 0 or matchCRS): basemapText = "" else: basemapText = basemapsScript(basemapList, maxZoom) extentCode = extentScript(extent, restrictToExtent) new_src += middle new_src += basemapText new_src += extentCode for count, layer in enumerate(layer_list): rawLayerName = layer.name() safeLayerName = safeName(rawLayerName) + "_" + unicode(count) if layer.type() == QgsMapLayer.VectorLayer: (new_src, legends, wfsLayers, labelCode, vtStyles, useMapUnits, useMultiStyle, useHeat, useVT, useShapes, useOSMB) = writeVectorLayer( layer, safeLayerName, usedFields[count], highlight, popupsOnHover, popup[count], outputProjectFileName, wfsLayers, cluster[count], visible[count], json[count], legends, new_src, canvas, count, restrictToExtent, extent, feedback, labelCode, vtStyles, useMultiStyle, useHeat, useVT, useShapes, useOSMB) if useMapUnits: mapUnitLayers.append(safeLayerName) elif layer.type() == QgsMapLayer.RasterLayer: if layer.dataProvider().name() == "wms": feedback.showFeedback('Writing %s as WMS layer...' % layer.name()) new_obj, useWMS, useWMTS = wmsScript( layer, safeLayerName, useWMS, useWMTS, getFeatureInfo[count]) feedback.completeStep() else: useRaster = True feedback.showFeedback('Writing %s as raster layer...' % layer.name()) new_obj = rasterScript(layer, safeLayerName) feedback.completeStep() if visible[count]: new_obj += """ map.addLayer(overlay_""" + safeLayerName + """);""" new_src += new_obj the_src = new_src new_src = jsons + """ <script>""" if len(mapUnitLayers) > 0: new_src += """ var m2px = 1; function newM2px() { var centerLatLng = map.getCenter(); var pointC = map.latLngToContainerPoint(centerLatLng); var pointX = [pointC.x + 100, pointC.y]; var latLngC = map.containerPointToLatLng(pointC); var latLngX = map.containerPointToLatLng(pointX); var distanceX = latLngC.distanceTo(latLngX)/100; reciprocal = 1 / distanceX; m2px = reciprocal; } function geoStyle(m) { return Math.ceil(m * m2px); }""" new_src += getVTStyles(vtStyles) new_src += the_src + scaleDependentLayers if title != "": titleStart = unicode(titleSubScript(title).decode("utf-8")) new_src += unicode(titleStart) if addressSearch: address_text = addressSearchScript() new_src += address_text if (params["Appearance"]["Add layers list"] and params["Appearance"]["Add layers list"] != "" and params["Appearance"]["Add layers list"] != "None"): new_src += addLayersList( basemapList, matchCRS, layer_list, cluster, legends, params["Appearance"]["Add layers list"] == "Expanded") if project.readBoolEntry("ScaleBar", "/Enabled", False)[0]: placement = project.readNumEntry("ScaleBar", "/Placement", 0)[0] placement = PLACEMENT[placement] end = scaleBar(placement) else: end = '' layerType = "layer" try: if cluster[count]: layerType = "cluster" except: pass searchLayer = "%s_%s" % (layerType, params["Appearance"]["Search layer"]) labelList = [] for count, layer in enumerate(layer_list): vts = layer.customProperty("VectorTilesReader/vector_tile_url") safeLayerName = re.sub(r'[\W_]+', '', layer.name()) + "_" + unicode(count) if (layer.type() == QgsMapLayer.VectorLayer and vts is None): palyr = QgsPalLayerSettings() palyr.readFromLayer(layer) if palyr.enabled and palyr.fieldName and palyr.fieldName != "": labelList.append("layer_%s" % safeLayerName) labelsList = ",".join(labelList) end += endHTMLscript(wfsLayers, layerSearch, labelCode, labelVisibility, searchLayer, useHeat, useRaster, labelsList, mapUnitLayers) new_src += end try: writeHTMLstart(outputIndex, title, cluster, addressSearch, measure, matchCRS, layerSearch, canvas, mapLibLocation, locate, new_src, template, feedback, debugLibs, useMultiStyle, useHeat, useShapes, useOSMB, useWMS, useWMTS, useVT) except Exception as e: QgsMessageLog.logMessage(traceback.format_exc(), "qgis2ol5", level=QgsMessageLog.CRITICAL) QApplication.restoreOverrideCursor() finally: QApplication.restoreOverrideCursor() return outputIndex
def exportStyles(layers, folder, clustered): stylesFolder = os.path.join(folder, "styles") QDir().mkpath(stylesFolder) for layer, cluster in zip(layers, clustered): if layer.type() != layer.VectorLayer: continue labelsEnabled = unicode( layer.customProperty("labeling/enabled")).lower() == "true" if (labelsEnabled): labelField = layer.customProperty("labeling/fieldName") if labelField != "": fieldIndex = layer.pendingFields().indexFromName(labelField) try: editFormConfig = layer.editFormConfig() editorWidget = editFormConfig.widgetType(fieldIndex) except: editorWidget = layer.editorWidgetV2(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) or isinstance(renderer, QgsRuleBasedRendererV2)): if isinstance(renderer, QgsRuleBasedRendererV2): symbol = renderer.rootRule().children()[0].symbol() else: symbol = renderer.symbol() if cluster: style = "var size = feature.get('features').length;\n" else: style = "var size = 0;\n" style += " var style = " + getSymbolAsStyle( symbol, stylesFolder, layer_alpha) value = 'var value = ""' elif isinstance(renderer, QgsCategorizedSymbolRendererV2): defs += """function categories_%s(feature, value) { switch(value) {""" % safeName(layer.name()) cats = [] for cat in renderer.categories(): cats.append('''case "%s": return %s; break;''' % (cat.value(), getSymbolAsStyle(cat.symbol(), stylesFolder, layer_alpha))) defs += "\n".join(cats) + "}};" classAttr = renderer.classAttribute() fieldIndex = layer.pendingFields().indexFromName(classAttr) try: editFormConfig = layer.editFormConfig() editorWidget = editFormConfig.widgetType(fieldIndex) except: editorWidget = layer.editorWidgetV2(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)''' % (safeName(layer.name()))) elif isinstance(renderer, QgsGraduatedSymbolRendererV2): varName = "ranges_" + safeName(layer.name()) defs += "var %s = [" % varName ranges = [] for ran in renderer.ranges(): symbolstyle = getSymbolAsStyle(ran.symbol(), stylesFolder, layer_alpha) ranges.append( '[%f, %f, %s]' % (ran.lowerValue(), ran.upperValue(), symbolstyle)) defs += ",\n".join(ranges) + "];" classAttr = renderer.classAttribute() fieldIndex = layer.pendingFields().indexFromName(classAttr) try: editFormConfig = layer.editFormConfig() editorWidget = editFormConfig.widgetType(fieldIndex) except: editorWidget = layer.editorWidgetV2(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 } 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") color = "rgba(%s, %s, %s, 255)" % (r, g, b) face = layer.customProperty("labeling/fontFamily") palyr = QgsPalLayerSettings() palyr.readFromLayer(layer) sv = palyr.scaleVisibility if sv: min = float(palyr.scaleMin) max = float(palyr.scaleMax) 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 = '''function(feature, resolution){ %(value)s %(style)s; if (%(label)s !== null%(labelRes)s) { var labelText = String(%(label)s); } else { var labelText = "" } var key = value + "_" + labelText if (!%(cache)s[key]){ var text = new ol.style.Text({ font: '%(size)spx \\'%(face)s\\', sans-serif', text: labelText, textBaseline: "center", textAlign: "left", offsetX: 5, offsetY: 3, fill: new ol.style.Fill({ color: "%(color)s" }),%(stroke)s }); %(cache)s[key] = new ol.style.Style({"text": text}) } var allStyles = [%(cache)s[key]]; allStyles.push.apply(allStyles, style); return allStyles; }''' % { "style": style, "labelRes": labelRes, "label": labelText, "cache": "styleCache_" + safeName(layer.name()), "size": size, "face": face, "color": color, "stroke": stroke, "value": value } else: style = "''" except Exception, e: style = """{ /* """ + traceback.format_exc() + " */}" print traceback.format_exc() path = os.path.join(stylesFolder, safeName(layer.name()) + "_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": safeName(layer.name()), "style": style })