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)
Esempio n. 2
0
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)
Esempio n. 3
0
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 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
Esempio n. 5
0
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()}
Esempio n. 6
0
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
Esempio n. 7
0
def writeVectorLayer(i, safeLayerName, usedFields, highlight, popupsOnHover,
                     popup, count, outputProjectFileName, wfsLayers, cluster,
                     cluster_num, visible, json, legends, new_src, canvas):
    (new_pop, labeltext,
     popFuncs) = labelsAndPopups(i, safeLayerName, usedFields, highlight,
                                 popupsOnHover, popup, count)
    renderer = i.rendererV2()
    layer_transp = 1 - (float(i.layerTransparency()) / 100)
    new_obj = ""

    if is25d(i, canvas):
        shadows = ""
        renderer = i.rendererV2()
        renderContext = QgsRenderContext.fromMapSettings(canvas.mapSettings())
        fields = i.pendingFields()
        renderer.startRender(renderContext, fields)
        for feat in i.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)
        new_obj = """
        var osmb = new OSMBuildings(map).date(new Date({shadows}));
        osmb.set(json_{sln});""".format(shadows=shadows, sln=safeLayerName)
    elif (isinstance(renderer, QgsSingleSymbolRendererV2)
          or isinstance(renderer, QgsRuleBasedRendererV2)):
        # print safeLayerName + ": single"
        (new_obj, legends,
         wfsLayers) = singleLayer(renderer, outputProjectFileName,
                                  safeLayerName, wfsLayers, i, layer_transp,
                                  labeltext, cluster, cluster_num, visible,
                                  json, usedFields, legends, count, popFuncs)
    elif isinstance(renderer, QgsCategorizedSymbolRendererV2):
        # print safeLayerName + ": categorized"
        (new_obj, legends, wfsLayers) = categorizedLayer(
            i, renderer, safeLayerName, outputProjectFileName, layer_transp,
            usedFields, count, legends, labeltext, cluster, cluster_num,
            popFuncs, visible, json, wfsLayers)
    elif isinstance(renderer, QgsGraduatedSymbolRendererV2):
        # print safeLayerName + ": graduated"
        (new_obj, legends,
         wfsLayers) = graduatedLayer(i, safeLayerName, renderer,
                                     outputProjectFileName, layer_transp,
                                     labeltext, popFuncs, cluster, cluster_num,
                                     visible, json, usedFields, count, legends,
                                     wfsLayers)
    elif isinstance(renderer, Qgs25DRenderer):
        # print safeLayerName + ": 2.5d"
        pass

    if usedFields[count] != 0:
        new_src += new_pop.decode("utf-8")
    new_src += """
""" + new_obj
    if is25d(i, canvas):
        pass
    else:
        new_src += """
        bounds_group.addLayer(json_""" + safeLayerName + """JSON);"""
        if visible[count]:
            if cluster[count] is False:
                new_src += """
        initialOrder[initialOrder.length] = json_""" + safeLayerName + """JSON;
        feature_group.addLayer(json_""" + safeLayerName + """JSON);"""
            else:
                new_src += """
        initialOrder[initialOrder.length] = cluster_group""" + safeLayerName
                new_src += """JSON;
        cluster_group""" + safeLayerName + """JSON.addTo(map);"""
    return new_src, legends, wfsLayers
Esempio n. 8
0
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()
            }
Esempio n. 9
0
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
Esempio n. 10
0
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
Esempio n. 11
0
def exportJSONLayer(layer, eachPopup, precision, tmpFileName, exp_crs,
                    layerFileName, safeLayerName, minify, canvas,
                    restrictToExtent, iface, extent):
    cleanedLayer = writeTmpLayer(layer, eachPopup, restrictToExtent,
                                 iface, extent)
    if is25d(layer, canvas, restrictToExtent, extent):
        provider = cleanedLayer.dataProvider()
        provider.addAttributes([QgsField("height", QVariant.Double),
                                QgsField("wallColor", QVariant.String),
                                QgsField("roofColor", QVariant.String)])
        cleanedLayer.updateFields()
        fields = cleanedLayer.pendingFields()
        renderer = layer.rendererV2()
        renderContext = QgsRenderContext.fromMapSettings(
                canvas.mapSettings())
        feats = layer.getFeatures()
        context = QgsExpressionContext()
        context.appendScope(QgsExpressionContextUtils.layerScope(layer))
        expression = QgsExpression('eval(@qgis_25d_height)')
        heightField = fields.indexFromName("height")
        wallField = fields.indexFromName("wallColor")
        roofField = fields.indexFromName("roofColor")
        renderer.startRender(renderContext, fields)
        cleanedLayer.startEditing()
        for feat in feats:
            context.setFeature(feat)
            height = expression.evaluate(context)
            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)
            wallColor = symbol.symbolLayer(1).subSymbol().color().name()
            roofColor = symbol.symbolLayer(2).subSymbol().color().name()
            cleanedLayer.changeAttributeValue(feat.id() + 1,
                                              heightField, height)
            cleanedLayer.changeAttributeValue(feat.id() + 1,
                                              wallField, wallColor)
            cleanedLayer.changeAttributeValue(feat.id() + 1,
                                              roofField, roofColor)
        cleanedLayer.commitChanges()
        renderer.stopRender(renderContext)

    writer = QgsVectorFileWriter
    if precision != "maintain":
        options = "COORDINATE_PRECISION=" + unicode(precision)
    else:
        options = ""
    writer.writeAsVectorFormat(cleanedLayer, tmpFileName, 'utf-8', exp_crs,
                               'GeoJson', 0, layerOptions=[options])

    with open(layerFileName, "w") as f2:
        f2.write("var json_" + unicode(safeLayerName) + "=")
        with open(tmpFileName, "r") as tmpFile:
            for line in tmpFile:
                if minify:
                    line = line.strip("\n\t ")
                    line = removeSpaces(line)
                f2.write(line)
        os.remove(tmpFileName)

    fields = layer.pendingFields()
    for field in fields:
        exportImages(layer, field.name(), layerFileName)
Esempio n. 12
0
def writeVectorLayer(i, safeLayerName, usedFields, highlight, popupsOnHover,
                     popup, count, outputProjectFileName, wfsLayers, cluster,
                     cluster_num, visible, json, legends, new_src, canvas):
    (new_pop, labeltext,
     popFuncs) = labelsAndPopups(i, safeLayerName, usedFields, highlight,
                                 popupsOnHover, popup, count)
    renderer = i.rendererV2()
    layer_transp = 1 - (float(i.layerTransparency()) / 100)
    new_obj = ""

    if is25d(i, canvas):
        shadows = ""
        renderer = i.rendererV2()
        renderContext = QgsRenderContext.fromMapSettings(
                canvas.mapSettings())
        fields = i.pendingFields()
        renderer.startRender(renderContext, fields)
        for feat in i.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)
        new_obj = """
        var osmb = new OSMBuildings(map).date(new Date({shadows}));
        osmb.set(json_{sln});""".format(shadows=shadows, sln=safeLayerName)
    elif (isinstance(renderer, QgsSingleSymbolRendererV2) or
            isinstance(renderer, QgsRuleBasedRendererV2)):
        print safeLayerName + ": single"
        (new_obj, legends,
         wfsLayers) = singleLayer(renderer, outputProjectFileName,
                                  safeLayerName, wfsLayers, i, layer_transp,
                                  labeltext, cluster, cluster_num, visible,
                                  json, usedFields, legends, count, popFuncs)
    elif isinstance(renderer, QgsCategorizedSymbolRendererV2):
        print safeLayerName + ": categorized"
        (new_obj, legends,
         wfsLayers) = categorizedLayer(i, renderer, safeLayerName,
                                       outputProjectFileName, layer_transp,
                                       usedFields, count, legends, labeltext,
                                       cluster, cluster_num, popFuncs, visible,
                                       json, wfsLayers)
    elif isinstance(renderer, QgsGraduatedSymbolRendererV2):
        print safeLayerName + ": graduated"
        (new_obj, legends,
         wfsLayers) = graduatedLayer(i, safeLayerName, renderer,
                                     outputProjectFileName, layer_transp,
                                     labeltext, popFuncs, cluster, cluster_num,
                                     visible, json, usedFields, count, legends,
                                     wfsLayers)
    elif isinstance(renderer, Qgs25DRenderer):
        print safeLayerName + ": 2.5d"

    if usedFields[count] != 0:
        new_src += new_pop.decode("utf-8")
    new_src += """
""" + new_obj
    if is25d(i, canvas):
        pass
    else:
        new_src += """
        bounds_group.addLayer(json_""" + safeLayerName + """JSON);"""
        if visible[count]:
            if cluster[count] is False:
                new_src += """
        feature_group.addLayer(json_""" + safeLayerName + """JSON);"""
            else:
                new_src += """
        cluster_group""" + safeLayerName + """JSON.addTo(map);"""
    return new_src, legends, wfsLayers
def writeLayersAndGroups(layers, groups, visible, folder, popup, settings,
                         json, matchCRS, clustered, getFeatureInfo, iface,
                         restrictToExtent, extent, bounds, authid):

    canvas = iface.mapCanvas()
    basemapList = settings["Appearance"]["Base layer"]
    baseLayer = getBasemaps(basemapList)
    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, basemapList, 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.rendererV2(), 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""")
        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
Esempio n. 14
0
def exportJSONLayer(layer, eachPopup, precision, tmpFileName, exp_crs,
                    layerFileName, safeLayerName, minify, canvas):
    cleanedLayer = writeTmpLayer(layer, eachPopup)
    if is25d(layer, canvas):
        provider = cleanedLayer.dataProvider()
        provider.addAttributes([QgsField("height", QVariant.Double),
                                QgsField("wallColor", QVariant.String),
                                QgsField("roofColor", QVariant.String)])
        cleanedLayer.updateFields()
        fields = cleanedLayer.pendingFields()
        renderer = layer.rendererV2()
        renderContext = QgsRenderContext.fromMapSettings(
                canvas.mapSettings())
        feats = layer.getFeatures()
        context = QgsExpressionContext()
        context.appendScope(QgsExpressionContextUtils.layerScope(layer))
        expression = QgsExpression('eval(@qgis_25d_height)')
        heightField = fields.indexFromName("height")
        wallField = fields.indexFromName("wallColor")
        roofField = fields.indexFromName("roofColor")
        renderer.startRender(renderContext, fields)
        cleanedLayer.startEditing()
        for feat in feats:
            context.setFeature(feat)
            height = expression.evaluate(context)
            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)
            wallColor = symbol.symbolLayer(1).subSymbol().color().name()
            roofColor = symbol.symbolLayer(2).subSymbol().color().name()
            cleanedLayer.changeAttributeValue(feat.id() + 1,
                                              heightField, height)
            cleanedLayer.changeAttributeValue(feat.id() + 1,
                                              wallField, wallColor)
            cleanedLayer.changeAttributeValue(feat.id() + 1,
                                              roofField, roofColor)
        cleanedLayer.commitChanges()
        renderer.stopRender(renderContext)

    writer = QgsVectorFileWriter
    if precision != "maintain":
        options = "COORDINATE_PRECISION=" + unicode(precision)
    else:
        options = ""
    writer.writeAsVectorFormat(cleanedLayer, tmpFileName, 'utf-8', exp_crs,
                               'GeoJson', 0, layerOptions=[options])

    with open(layerFileName, "w") as f2:
        f2.write("var json_" + unicode(safeLayerName) + "=")
        with open(tmpFileName, "r") as tmpFile:
            for line in tmpFile:
                if minify:
                    line = line.strip("\n\t ")
                    line = removeSpaces(line)
                f2.write(line)
        os.remove(tmpFileName)

    fields = layer.pendingFields()
    for field in fields:
        exportImages(layer, field.name(), layerFileName)
Esempio n. 15
0
def writeVectorLayer(layer, safeLayerName, usedFields, highlight,
                     popupsOnHover, popup, outputProjectFileName, wfsLayers,
                     cluster, visible, json, legends, new_src, canvas, zIndex,
                     restrictToExtent, extent):
    zIndex = zIndex + 600
    markerFolder = os.path.join(outputProjectFileName, "markers")
    (new_pop, labeltext,
     popFuncs) = labelsAndPopups(layer, safeLayerName, highlight,
                                 popupsOnHover, popup, outputProjectFileName)
    renderer = layer.rendererV2()
    layer_transp = 1 - (float(layer.layerTransparency()) / 100)
    style = ""

    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)
        new_obj = """
        var osmb = new OSMBuildings(map).date(new Date({shadows}));
        osmb.set(json_{sln});""".format(shadows=shadows, sln=safeLayerName)
    elif isinstance(renderer, QgsHeatmapRenderer):
        (new_obj, legends,
         wfsLayers) = heatmapLayer(layer, safeLayerName, renderer, legends,
                                   wfsLayers)
    elif isinstance(renderer, QgsSingleSymbolRendererV2):
        (style, markerType) = getLayerStyle(layer, safeLayerName, markerFolder,
                                            outputProjectFileName)
        (new_obj, legends,
         wfsLayers) = singleLayer(renderer, outputProjectFileName,
                                  safeLayerName, wfsLayers, layer, labeltext,
                                  cluster, json, usedFields, legends,
                                  markerType)
    elif isinstance(renderer, QgsCategorizedSymbolRendererV2):
        (style, markerType) = getLayerStyle(layer, safeLayerName, markerFolder,
                                            outputProjectFileName)
        (new_obj, legends,
         wfsLayers) = categorizedLayer(layer, renderer, safeLayerName,
                                       outputProjectFileName, usedFields,
                                       legends, labeltext, cluster, json,
                                       wfsLayers, markerType)
    elif isinstance(renderer, QgsGraduatedSymbolRendererV2):
        (style, markerType) = getLayerStyle(layer, safeLayerName, markerFolder,
                                            outputProjectFileName)
        (new_obj, legends,
         wfsLayers) = graduatedLayer(layer, safeLayerName, renderer,
                                     outputProjectFileName, labeltext, cluster,
                                     json, usedFields, legends, wfsLayers,
                                     markerType)
    elif isinstance(renderer, QgsRuleBasedRendererV2):
        (style, markerType) = getLayerStyle(layer, safeLayerName, markerFolder,
                                            outputProjectFileName)
        (new_obj, legends,
         wfsLayers) = ruleBasedLayer(layer, renderer, safeLayerName,
                                     outputProjectFileName, usedFields,
                                     legends, labeltext, cluster, json,
                                     wfsLayers, markerType)
    blend = BLEND_MODES[layer.blendMode()]
    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.decode("utf-8")
    new_src += """
""" + new_obj
    if is25d(layer, canvas, restrictToExtent, extent):
        pass
    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);"""
    return new_src, legends, wfsLayers
Esempio n. 16
0
def writeVectorLayer(layer, safeLayerName, usedFields, highlight,
                     popupsOnHover, popup, outputProjectFileName, wfsLayers,
                     cluster, visible, json, legends, new_src, canvas, zIndex):
    zIndex = zIndex + 600
    markerFolder = os.path.join(outputProjectFileName, "markers")
    (new_pop, labeltext,
     popFuncs) = labelsAndPopups(layer, safeLayerName, highlight,
                                 popupsOnHover, popup)
    renderer = layer.rendererV2()
    layer_transp = 1 - (float(layer.layerTransparency()) / 100)
    style = ""

    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)
        new_obj = """
        var osmb = new OSMBuildings(map).date(new Date({shadows}));
        osmb.set(json_{sln});""".format(shadows=shadows, sln=safeLayerName)
    # else:
    #     layer_style = getLayerStyle(layer, safeLayerName)
    elif isinstance(renderer, QgsHeatmapRenderer):
        (new_obj, legends,
         wfsLayers) = heatmapLayer(layer, safeLayerName, renderer, legends,
                                   wfsLayers)
    elif (isinstance(renderer, QgsSingleSymbolRendererV2) or
            isinstance(renderer, QgsRuleBasedRendererV2)):
        (style, markerType) = getLayerStyle(layer, safeLayerName, markerFolder)
        (new_obj, legends,
         wfsLayers) = singleLayer(renderer, outputProjectFileName,
                                  safeLayerName, wfsLayers, layer, labeltext,
                                  cluster, json, usedFields, legends,
                                  markerType)
    elif isinstance(renderer, QgsCategorizedSymbolRendererV2):
        (style, markerType) = getLayerStyle(layer, safeLayerName, markerFolder)
        (new_obj, legends,
         wfsLayers) = categorizedLayer(layer, renderer, safeLayerName,
                                       outputProjectFileName, usedFields,
                                       legends, labeltext, cluster, json,
                                       wfsLayers, markerType)
    elif isinstance(renderer, QgsGraduatedSymbolRendererV2):
        (style, markerType) = getLayerStyle(layer, safeLayerName, markerFolder)
        (new_obj, legends,
         wfsLayers) = graduatedLayer(layer, safeLayerName, renderer,
                                     outputProjectFileName, labeltext, cluster,
                                     json, usedFields, legends, wfsLayers,
                                     markerType)
    blend = BLEND_MODES[layer.blendMode()]
    new_obj = """{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.decode("utf-8")
    new_src += """
""" + new_obj
    if is25d(layer, canvas):
        pass
    else:
        new_src += """
        bounds_group.addLayer(layer_""" + safeLayerName + """);"""
        if visible:
            if cluster is False:
                new_src += """
        feature_group.addLayer(layer_""" + safeLayerName + """);"""
            else:
                new_src += """
        cluster_""" + safeLayerName + """.addTo(map);"""
    return new_src, legends, wfsLayers
Esempio n. 17
0
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()
            }
Esempio n. 18
0
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()}
Esempio n. 19
0
def writeLayersAndGroups(layers, groups, visible, folder, popup,
                         settings, json, matchCRS, clustered, iface,
                         restrictToExtent, extent):

    canvas = iface.mapCanvas()
    basemapList = settings["Appearance"]["Base layer"]
    baseLayer = getBasemaps(basemapList)
    layerVars = ""
    layer_names_id = {}
    for count, (layer, encode2json, cluster) in enumerate(zip(layers, json,
                                                              clustered)):
        layer_names_id[layer.id()] = str(count)
        if is25d(layer, canvas, restrictToExtent, extent):
            pass
        else:
            layerVars += "\n".join([layerToJavascript(iface, layer,
                                                      encode2json,
                                                      matchCRS, cluster,
                                                      restrictToExtent,
                                                      extent, count)])
    (groupVars, groupedLayers) = buildGroups(groups, qms, layer_names_id)
    (mapLayers, osmb) = layersAnd25d(layers, canvas, restrictToExtent, extent,
                                     qms)
    visibility = getVisibility(mapLayers, visible)

    usedGroups = []
    (group_list, no_group_list,
     usedGroups) = getGroups(canvas, layers, basemapList, restrictToExtent,
                             extent, groupedLayers)
    layersList = []
    for layer in (group_list + no_group_list):
        layersList.append(layer)
    layersListString = "var layersList = [" + ",".join(layersList) + "];"

    fieldAliases = ""
    fieldImages = ""
    fieldLabels = ""
    blend_mode = ""
    labelgun = ""
    for count, (layer, labels) in enumerate(zip(layers, popup)):
        sln = safeName(layer.name()) + "_" + unicode(count)
        if (layer.type() == layer.VectorLayer and
                not isinstance(layer.rendererV2(), QgsHeatmapRenderer) and
                not is25d(layer, canvas, restrictToExtent, extent)):
            (fieldLabels, fieldAliases, fieldImages,
             blend_mode, labelgun) = 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 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)
        f.write(labelgun)
    return osmb