def getGroups(canvas, layers, restrictToExtent, extent, groupedLayers): group_list = [] no_group_list = [] usedGroups = [] currentVT = "" for count, layer in enumerate(layers): vts = layer.customProperty("VectorTilesReader/vector_tile_url") if (vts is not None): if (vts != currentVT): no_group_list.append("lyr_" + safeName(vts)) currentVT = vts else: 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, restrictToExtent, extent, groupedLayers): group_list = [] no_group_list = [] usedGroups = [] currentVT = "" for count, layer in enumerate(layers): vts = layer.customProperty("VectorTilesReader/vector_tile_url") if (vts is not None): if (vts != currentVT): no_group_list.append("lyr_" + safeName(vts)) currentVT = vts else: 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 layerToJavascript(iface, layer, encode2json, matchCRS, interactive, cluster, info, restrictToExtent, extent, count, vtLayers): (minResolution, maxResolution) = getScaleRes(layer) layerName = safeName(layer.name()) + "_" + str(count) rawName = layer.name() layerAttr = getAttribution(layer) if layer.type() == layer.VectorLayer and not is25d(layer, iface.mapCanvas(), restrictToExtent, extent): renderer = layer.renderer() 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, interactive, cluster, minResolution, maxResolution), vtLayers else: return getJSON(layerName, crsConvert, layerAttr, interactive, 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, rawName, 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 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.renderer() 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 layersAnd25d(layers, canvas, restrictToExtent, extent, qms): mapLayers = [] layerObjs = [] 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)) layerObjs.append(layer) return (mapLayers, layerObjs, osmb)
def layersAnd25d(layers, canvas, restrictToExtent, extent, qms): mapLayers = [] layerObjs = [] 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)) layerObjs.append(layer) return (mapLayers, layerObjs, osmb)
def writeLayersAndGroups(layers, groups, visible, folder, popup, settings, json, matchCRS, clustered, getFeatureInfo, iface, restrictToExtent, extent, bounds, authid): canvas = iface.mapCanvas() layerVars = "" layer_names_id = {} vtLayers = [] for count, (layer, encode2json, cluster, info) in enumerate(zip(layers, json, clustered, getFeatureInfo)): layer_names_id[layer.id()] = str(count) if is25d(layer, canvas, restrictToExtent, extent): pass else: (layerVar, vtLayers) = layerToJavascript(iface, layer, encode2json, matchCRS, cluster, info, restrictToExtent, extent, count, vtLayers) layerVars += "\n".join([layerVar]) (groupVars, groupedLayers) = buildGroups(groups, qms, layer_names_id) (mapLayers, layerObjs, osmb) = layersAnd25d(layers, canvas, restrictToExtent, extent, qms) visibility = getVisibility(mapLayers, layerObjs, visible) usedGroups = [] (group_list, no_group_list, usedGroups) = getGroups(canvas, layers, restrictToExtent, extent, groupedLayers) layersList = [] currentVT = "" 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)): vts = layer.customProperty("VectorTilesReader/vector_tile_url") sln = safeName(layer.name()) + "_" + unicode(count) if (layer.type() == layer.VectorLayer and vts is None and not isinstance(layer.renderer(), QgsHeatmapRenderer) and not is25d(layer, canvas, restrictToExtent, extent)): (fieldLabels, fieldAliases, fieldImages, blend_mode) = getPopups(layer, labels, sln, fieldLabels, fieldAliases, fieldImages) path = os.path.join(folder, "layers", "layers.js") with codecs.open(path, "w", "utf-8") as f: if matchCRS: f.write("""ol.proj.get("%s").setExtent(%s); """ % (authid, bounds)) f.write("""var wms_layers = [];\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 writeLayersAndGroups(layers, groups, visible, folder, popup, settings, json, matchCRS, clustered, getFeatureInfo, iface, restrictToExtent, extent, bounds, authid): canvas = iface.mapCanvas() layerVars = "" layer_names_id = {} vtLayers = [] for count, (layer, encode2json, cluster, info) in enumerate(zip(layers, json, clustered, getFeatureInfo)): layer_names_id[layer.id()] = str(count) if is25d(layer, canvas, restrictToExtent, extent): pass else: (layerVar, vtLayers) = layerToJavascript(iface, layer, encode2json, matchCRS, cluster, info, restrictToExtent, extent, count, vtLayers) layerVars += "\n".join([layerVar]) (groupVars, groupedLayers) = buildGroups(groups, qms, layer_names_id) (mapLayers, layerObjs, osmb) = layersAnd25d(layers, canvas, restrictToExtent, extent, qms) visibility = getVisibility(mapLayers, layerObjs, visible) usedGroups = [] (group_list, no_group_list, usedGroups) = getGroups(canvas, layers, restrictToExtent, extent, groupedLayers) layersList = [] currentVT = "" 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)): vts = layer.customProperty("VectorTilesReader/vector_tile_url") sln = safeName(layer.name()) + "_" + unicode(count) if (layer.type() == layer.VectorLayer and vts is None and not isinstance(layer.renderer(), QgsHeatmapRenderer) and not is25d(layer, canvas, restrictToExtent, extent)): (fieldLabels, fieldAliases, fieldImages, blend_mode) = getPopups(layer, labels, sln, fieldLabels, fieldAliases, fieldImages) path = os.path.join(folder, "layers", "layers.js") with codecs.open(path, "w", "utf-8") as f: if matchCRS: f.write("""ol.proj.get("%s").setExtent(%s); """ % (authid, bounds)) f.write("""var wms_layers = [];\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 writeVectorLayer(layer, safeLayerName, usedFields, highlight, popupsOnHover, popup, outputProjectFileName, wfsLayers, cluster, visible, json, legends, new_src, canvas, zIndex, restrictToExtent, extent, feedback, labelCode, vtLabels, vtStyles, useMultiStyle, useHeat, useVT, useShapes, useOSMB): vts = layer.customProperty("VectorTilesReader/vector_tile_url") feedback.showFeedback("Writing %s as JSON..." % layer.name()) zIndex = zIndex + 400 markerFolder = os.path.join(outputProjectFileName, "markers") labeltext, vtLabels = getLabels(layer, safeLayerName, outputProjectFileName, vts, vtLabels) labelCode += labeltext (new_pop, popFuncs) = getPopups(layer, safeLayerName, highlight, popupsOnHover, popup, vts) renderer = layer.renderer() layer_transp = 1 - (float(layer.opacity()) / 100) style = "" useMapUnits = False if is25d(layer, canvas, restrictToExtent, extent): useOSMB = True shadows = "" renderer = layer.renderer() renderContext = QgsRenderContext.fromMapSettings(canvas.mapSettings()) fields = layer.fields() renderer.startRender(renderContext, fields) for feat in layer.getFeatures(): if isinstance(renderer, QgsCategorizedSymbolRenderer): classAttribute = renderer.classAttribute() attrValue = feat.attribute(classAttribute) catIndex = renderer.categoryIndexForValue(attrValue) categories = renderer.categories() symbol = categories[catIndex].symbol() elif isinstance(renderer, QgsGraduatedSymbolRenderer): 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.symbolForFeature(feat, renderContext) symbolLayer = symbol.symbolLayer(0) if not symbolLayer.paintEffect().effectList()[0].enabled(): shadows = "'2015-07-15 10:00:00'" renderer.stopRender(renderContext) new_obj = """ var osmb = new OSMBuildings(map).date(new Date({shadows})); osmb.set(json_{sln});""".format(shadows=shadows, sln=safeLayerName) elif isinstance(renderer, QgsHeatmapRenderer): useHeat = True new_obj = heatmapLayer(layer, safeLayerName, renderer) elif vts is not None: useVT = True if vts in vtStyles: new_obj = "" addVT = False else: new_obj = VTLayer(vts) vtStyles[vts] = {} addVT = True vtStyle = vtStyles[vts] (style, markerType, useMapUnits, useShapes) = getLayerStyle(layer, safeLayerName, markerFolder, outputProjectFileName, useShapes) style = style.replace("feature.properties['", "feature.['") if layer.name() not in vtStyle: vtStyle[layer.name()] = ["", "", ""] isLayer = False geom = TYPE_MAP[layer.wkbType()].replace("Multi", "") if geom == "Point": index = 0 isLayer = True if geom == "LineString": index = 1 isLayer = True if geom == "Polygon": index = 2 isLayer = True if isLayer: vtStyles[vts][layer.name()][index] = style style = "" else: (style, markerType, useMapUnits, useShapes) = getLayerStyle(layer, safeLayerName, markerFolder, outputProjectFileName, useShapes) (legend, symbol) = getLegend(layer, renderer, outputProjectFileName, safeLayerName) legends[safeLayerName] = legend (new_obj, legends, wfsLayers, useMultiStyle) = getLayer(layer, renderer, safeLayerName, outputProjectFileName, usedFields, legends, cluster, json, wfsLayers, markerType, useMultiStyle, symbol) blend = BLEND_MODES[layer.blendMode()] if vts is None: new_obj = u"""{style} map.createPane('pane_{sln}'); map.getPane('pane_{sln}').style.zIndex = {zIndex}; map.getPane('pane_{sln}').style['mix-blend-mode'] = '{blend}'; {new_obj}""".format(style=style, sln=safeLayerName, zIndex=zIndex, blend=blend, new_obj=new_obj) if usedFields != 0: new_src += new_pop new_src += """ """ + new_obj if is25d(layer, canvas, restrictToExtent, extent): pass elif vts is not None: if addVT: sln = safeName(vts) new_src += """ map.addLayer(layer_""" + sln + """);""" else: new_src += """ bounds_group.addLayer(layer_""" + safeLayerName + """);""" if visible: if cluster is False: new_src += """ map.addLayer(layer_""" + safeLayerName + """);""" else: new_src += """ cluster_""" + safeLayerName + """.addTo(map);""" feedback.completeStep() return (new_src, legends, wfsLayers, labelCode, vtLabels, vtStyles, useMapUnits, useMultiStyle, useHeat, useVT, useShapes, useOSMB)
def writeVectorLayer(layer, safeLayerName, usedFields, highlight, popupsOnHover, popup, outputProjectFileName, wfsLayers, cluster, visible, json, legends, new_src, canvas, zIndex, restrictToExtent, extent, feedback, labelCode, vtLabels, vtStyles, useMultiStyle, useHeat, useVT, useShapes, useOSMB): vts = layer.customProperty("VectorTilesReader/vector_tile_url") feedback.showFeedback("Writing %s as JSON..." % layer.name()) zIndex = zIndex + 400 markerFolder = os.path.join(outputProjectFileName, "markers") labeltext, vtLabels = getLabels(layer, safeLayerName, outputProjectFileName, vts, vtLabels) labelCode += labeltext (new_pop, popFuncs) = getPopups(layer, safeLayerName, highlight, popupsOnHover, popup, vts) renderer = layer.renderer() layer_transp = 1 - (float(layer.opacity()) / 100) style = "" useMapUnits = False if is25d(layer, canvas, restrictToExtent, extent): useOSMB = True shadows = "" renderer = layer.renderer() renderContext = QgsRenderContext.fromMapSettings(canvas.mapSettings()) fields = layer.fields() renderer.startRender(renderContext, fields) for feat in layer.getFeatures(): if isinstance(renderer, QgsCategorizedSymbolRenderer): classAttribute = renderer.classAttribute() attrValue = feat.attribute(classAttribute) catIndex = renderer.categoryIndexForValue(attrValue) categories = renderer.categories() symbol = categories[catIndex].symbol() elif isinstance(renderer, QgsGraduatedSymbolRenderer): 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.symbolForFeature(feat, renderContext) symbolLayer = symbol.symbolLayer(0) if not symbolLayer.paintEffect().effectList()[0].enabled(): shadows = "'2015-07-15 10:00:00'" renderer.stopRender(renderContext) new_obj = """ var osmb = new OSMBuildings(map).date(new Date({shadows})); osmb.set(json_{sln});""".format(shadows=shadows, sln=safeLayerName) elif isinstance(renderer, QgsHeatmapRenderer): useHeat = True new_obj = heatmapLayer(layer, safeLayerName, renderer) elif vts is not None: useVT = True if vts in vtStyles: new_obj = "" addVT = False else: new_obj = VTLayer(vts) vtStyles[vts] = {} addVT = True vtStyle = vtStyles[vts] (style, markerType, useMapUnits, useShapes) = getLayerStyle(layer, safeLayerName, markerFolder, outputProjectFileName, useShapes) style = style.replace("feature.properties['", "feature.['") if layer.name() not in vtStyle: vtStyle[layer.name()] = ["", "", ""] isLayer = False geom = TYPE_MAP[layer.wkbType()].replace("Multi", "") if geom == "Point": index = 0 isLayer = True if geom == "LineString": index = 1 isLayer = True if geom == "Polygon": index = 2 isLayer = True if isLayer: vtStyles[vts][layer.name()][index] = style style = "" else: (style, markerType, useMapUnits, useShapes) = getLayerStyle(layer, safeLayerName, markerFolder, outputProjectFileName, useShapes) (legend, symbol) = getLegend(layer, renderer, outputProjectFileName, safeLayerName) legends[safeLayerName] = legend (new_obj, legends, wfsLayers, useMultiStyle) = getLayer(layer, renderer, safeLayerName, outputProjectFileName, usedFields, legends, cluster, json, wfsLayers, markerType, useMultiStyle, symbol) blend = BLEND_MODES[layer.blendMode()] if vts is None: new_obj = u"""{style} map.createPane('pane_{sln}'); map.getPane('pane_{sln}').style.zIndex = {zIndex}; map.getPane('pane_{sln}').style['mix-blend-mode'] = '{blend}'; {new_obj}""".format(style=style, sln=safeLayerName, zIndex=zIndex, blend=blend, new_obj=new_obj) if usedFields != 0: new_src += new_pop new_src += """ """ + new_obj if is25d(layer, canvas, restrictToExtent, extent): pass elif vts is not None: if addVT: sln = safeName(vts) new_src += """ map.addLayer(layer_""" + sln + """);""" else: new_src += """ bounds_group.addLayer(layer_""" + safeLayerName + """);""" if visible: if cluster is False: new_src += """ map.addLayer(layer_""" + safeLayerName + """);""" else: new_src += """ cluster_""" + safeLayerName + """.addTo(map);""" feedback.completeStep() return (new_src, legends, wfsLayers, labelCode, vtLabels, vtStyles, useMapUnits, useMultiStyle, useHeat, useVT, useShapes, useOSMB)