Example #1
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)
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)
Example #3
0
def writeLayersAndGroups(layers, groups, visible, folder, settings):
    baseLayer = "var baseLayer = " + baseLayers[settings["Appearance"]["Base layer"]]   
    scaleVisibility = settings["Scale/Zoom"]["Use layer scale dependent visibility"]
    layerVars = "\n".join([layerToJavascript(layer, scaleVisibility) for layer in layers]) 
    groupVars = ""
    groupedLayers = {}
    for group, groupLayers in groups.iteritems():        
        groupVars +=  ('''var %s = new ol.layer.Group({
                                layers: [%s], 
                                title: "%s"});''' % 
                ("group_" + group, ",".join(["lyr_" + safeName(layer.name()) for layer in groupLayers]),
                group))
        for layer in groupLayers:
            groupedLayers[layer.id()] = group    
    mapLayers = ["baseLayer"] 
    usedGroups = []
    for layer in layers:
        if layer.id() in groupedLayers:
            groupName = groupedLayers[layer.id()]
            if groupName not in usedGroups:
                mapLayers.append("group_" + safeName(groupName))
                usedGroups.append(groupName)
        else:
            mapLayers.append("lyr_" + safeName(layer.name()))
    visibility = "\n".join(["%s.setVisible(%s);" % (layer, str(v).lower()) for layer, v in zip(mapLayers[1:], visible)])
    layersList = "var layersList = [%s];" % ",".join([layer for layer in mapLayers]) 
    path = os.path.join(folder, "layers", "layers.js")  
    with open(path, "w") as f: 
        f.write(baseLayer + "\n")
        f.write(layerVars + "\n")
        f.write(groupVars + "\n")
        f.write(visibility + "\n")
        f.write(layersList)
Example #4
0
def writeOL(iface, layers, groups, popup, visible, json, cluster, labels, settings, folder):
    QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
    folder = os.path.join(folder, 'qgis2web_' + unicode(time.strftime("%Y_%m_%d-%H_%M_%S")))
    # folder = os.path.join(os.getcwd(),folder)
    try:
        dst = os.path.join(folder, "resources")
        if not os.path.exists(dst):
            shutil.copytree(os.path.join(os.path.dirname(__file__), "resources"), dst)
        precision = settings["Data export"]["Precision"]
        optimize = settings["Data export"]["Minify GeoJSON files"]
        cleanUnusedFields = settings["Data export"]["Delete unused fields"]
        if not cleanUnusedFields:
            usedFields = [ALL_ATTRIBUTES] * len(popup)
        else:
            usedFields = popup
        exportLayers(layers, folder, precision, optimize, usedFields)
        exportStyles(layers, folder)
        writeLayersAndGroups(layers, groups, visible, folder, settings)
        if settings["Data export"]["Mapping library location"] == "Local":
            cssAddress = "./resources/ol.css"
            jsAddress = "./resources/ol.js"
        else:
            cssAddress = "http://openlayers.org/en/v3.8.2/css/ol.css"
            jsAddress = "http://openlayers.org/en/v3.8.2/build/ol.js"
        geojsonVars = "\n".join(['<script src="layers/%s"></script>' % (safeName(layer.name()) + ".js")
                                for layer in layers if layer.type() == layer.VectorLayer])
        styleVars = "\n".join(['<script src="styles/%s_style.js"></script>' % (safeName(layer.name()))
                              for layer in layers if layer.type() == layer.VectorLayer])
        popupLayers = "popupLayers = [%s];" % ",".join(['"%s"' % field if isinstance(field, basestring) else unicode(field) for field in popup])
        controls = []
        if settings["Appearance"]["Add scale bar"]:
            controls.append("new ol.control.ScaleLine({})")
        if settings["Appearance"]["Add layers list"]:
            controls.append('new ol.control.LayerSwitcher({tipLabel: "Layers"})')
        mapbounds = bounds(iface, settings["Scale/Zoom"]["Extent"] == "Canvas extent", layers)
        mapextent = "extent: %s," % mapbounds if settings["Scale/Zoom"]["Restrict to extent"] else ""
        maxZoom = int(settings["Scale/Zoom"]["Max zoom level"])
        minZoom = int(settings["Scale/Zoom"]["Min zoom level"])
        onHover = unicode(settings["Appearance"]["Show popups on hover"]).lower()
        highlight = unicode(settings["Appearance"]["Highlight features"]).lower()
        highlightFill = iface.mapCanvas().mapSettings().selectionColor().name()
        view = "%s maxZoom: %d, minZoom: %d" % (mapextent, maxZoom, minZoom)
        values = {"@CSSADDRESS@": cssAddress,
                  "@JSADDRESS@": jsAddress,
                  "@STYLEVARS@": styleVars,
                  "@GEOJSONVARS@": geojsonVars,
                  "@BOUNDS@": mapbounds,
                  "@CONTROLS@": ",".join(controls),
                  "@POPUPLAYERS@": popupLayers,
                  "@VIEW@": view,
                  "@ONHOVER@": onHover,
                  "@DOHIGHLIGHT@": highlight,
                  "@HIGHLIGHTFILL@": highlightFill}

        with open(os.path.join(folder, "index.html"), "w") as f:
            f.write(replaceInTemplate(settings["Appearance"]["Template"] + ".html", values))
    finally:
        QApplication.restoreOverrideCursor()
    return os.path.join(folder, "index.html")
Example #5
0
def writeScriptIncludes(layers, json, matchCRS):
    geojsonVars = ""
    wfsVars = ""
    styleVars = ""
    for count, (layer, encode2json) in enumerate(zip(layers, json)):
        sln = safeName(layer.name()) + unicode(count)
        if layer.type() == layer.VectorLayer:
            if layer.providerType() != "WFS" or encode2json:
                geojsonVars += ('<script src="layers/%s"></script>' %
                                (sln + ".js"))
            else:
                layerSource = layer.source()
                if ("retrictToRequestBBOX" in layerSource
                        or "restrictToRequestBBOX" in layerSource):
                    provider = layer.dataProvider()
                    uri = QgsDataSourceURI(provider.dataSourceUri())
                    wfsURL = uri.param("url")
                    wfsTypename = uri.param("typename")
                    wfsSRS = uri.param("srsname")
                    layerSource = wfsURL
                    layerSource += "?SERVICE=WFS&VERSION=1.0.0&"
                    layerSource += "REQUEST=GetFeature&TYPENAME="
                    layerSource += wfsTypename
                    layerSource += "&SRSNAME="
                    layerSource += wfsSRS
                if not matchCRS:
                    layerSource = re.sub('SRSNAME\=EPSG\:\d+',
                                         'SRSNAME=EPSG:3857', layerSource)
                layerSource += "&outputFormat=text%2Fjavascript&"
                layerSource += "format_options=callback%3A"
                layerSource += "get" + sln + "Json"
                wfsVars += ('<script src="%s"></script>' % layerSource)
            styleVars += ('<script src="styles/%s_style.js">'
                          '</script>' % (sln))
    return (geojsonVars, wfsVars, styleVars)
Example #6
0
 def populateLayerSearch(self):
     global mainDlg
     layerSearch = mainDlg.paramsTreeOL.itemWidget(
         mainDlg.paramsTreeOL.findItems(
             "Layer search", (Qt.MatchExactly | Qt.MatchRecursive))[0], 1)
     layerSearch.clear()
     layerSearch.addItem("None")
     (layers, groups, popup, visible, json,
      cluster) = self.getLayersAndGroups()
     for count, layer in enumerate(layers):
         if layer.type() == layer.VectorLayer:
             options = []
             fields = layer.pendingFields()
             for f in fields:
                 fieldIndex = fields.indexFromName(unicode(f.name()))
                 try:
                     formCnf = layer.editFormConfig()
                     editorWidget = formCnf.widgetType(fieldIndex)
                 except:
                     editorWidget = layer.editorWidgetV2(fieldIndex)
                 if (editorWidget == QgsVectorLayer.Hidden
                         or editorWidget == 'Hidden'):
                     continue
                 options.append(unicode(f.name()))
             for option in options:
                 displayStr = unicode(layer.name() + ": " + option)
                 layerSearch.insertItem(0, displayStr)
                 sln = utils.safeName(layer.name())
                 layerSearch.setItemData(layerSearch.findText(displayStr),
                                         sln + unicode(count))
Example #7
0
 def populateLayerSearch(self):
     self.layer_search_combo.clear()
     self.layer_search_combo.addItem("None")
     (layers, groups, popup, visible, json,
      cluster) = self.getLayersAndGroups()
     for count, layer in enumerate(layers):
         if layer.type() == layer.VectorLayer:
             options = []
             fields = layer.pendingFields()
             for f in fields:
                 fieldIndex = fields.indexFromName(unicode(f.name()))
                 try:
                     formCnf = layer.editFormConfig()
                     editorWidget = formCnf.widgetType(fieldIndex)
                 except:
                     editorWidget = layer.editorWidgetV2(fieldIndex)
                 if editorWidget == QgsVectorLayer.Hidden \
                         or editorWidget == 'Hidden':
                     continue
                 options.append(unicode(f.name()))
             for option in options:
                 displayStr = unicode(layer.name() + ": " + option)
                 self.layer_search_combo.insertItem(0, displayStr)
                 sln = utils.safeName(layer.name())
                 self.layer_search_combo.setItemData(
                     self.layer_search_combo.findText(displayStr),
                     sln + unicode(count))
Example #8
0
  def download(self, new=False, all=False):
    """ Download files of a course"""
    courseId = 0
    if not all:
      cli.courselist()
      courseId = selectId("Veranstaltung", len(self.courses) -1)
    self.asciiout.h1("Dateien herunterladen")
    idRange = range(0, len(self.courses)) if all else [courseId]

    for id in idRange:  
      filePage = pq(self.read("seminar_main.php?auswahl="+self.courses.keys()[id]+"&redirect_to=plugins.php&cmd=show&id=19&view=seminarFolders"))
      keyword = ("Neue Dateien " if new else "")+"komprimiert herunterladen"
      downloadLink = filePage('a[title="'+keyword+'"]').eq(0).attr("href")
      courseName = self.courses[self.courses.keys()[id]]

      if downloadLink != None:
        print "Lade Dateien in '"+courseName+"' herunter"
        data = self.read(downloadLink.replace(baseUrl, ""))

        if len(data) > 0:
          fileName = "Downloads/"+safeName(courseName)+".zip"
          if not os.path.exists("Downloads"):
            os.makedirs("Downloads")
          f = open(fileName, "w+")
          f.write(data)
          f.close()
          self.asciiout.text("Dateien in '"+courseName+"' unter "+fileName+" gespeichert")
          self.asciiout.hr()
          continue
      self.asciiout.text("Keine Dateien in '"+courseName+"' gefunden")
      self.asciiout.hr()
Example #9
0
 def populateLayerSearch(self):
     layerSearch = self.paramsTreeOL.itemWidget(
             self.paramsTreeOL.findItems("Layer search",
                                         (Qt.MatchExactly |
                                          Qt.MatchRecursive))[0], 1)
     layerSearch.clear()
     layerSearch.addItem("None")
     (layers, groups, popup, visible,
      json, cluster) = self.getLayersAndGroups()
     for count, layer in enumerate(layers):
         if layer.type() == layer.VectorLayer:
             options = []
             fields = layer.pendingFields()
             for f in fields:
                 fieldIndex = fields.indexFromName(unicode(f.name()))
                 try:
                     formCnf = layer.editFormConfig()
                     editorWidget = formCnf.widgetType(fieldIndex)
                 except:
                     editorWidget = layer.editorWidgetV2(fieldIndex)
                 if (editorWidget == QgsVectorLayer.Hidden or
                         editorWidget == 'Hidden'):
                     continue
                 options.append(unicode(f.name()))
             for option in options:
                 displayStr = unicode(layer.name() + ": " + option)
                 layerSearch.insertItem(0, displayStr)
                 sln = utils.safeName(layer.name())
                 layerSearch.setItemData(layerSearch.findText(displayStr),
                                         sln + unicode(count))
def build25d(canvas, layer, count):
    shadows = ""
    renderer = layer.rendererV2()
    renderContext = QgsRenderContext.fromMapSettings(canvas.mapSettings())
    fields = layer.pendingFields()
    renderer.startRender(renderContext, fields)
    for feat in layer.getFeatures():
        if isinstance(renderer, QgsCategorizedSymbolRendererV2):
            classAttribute = renderer.classAttribute()
            attrValue = feat.attribute(classAttribute)
            catIndex = renderer.categoryIndexForValue(attrValue)
            categories = renderer.categories()
            symbol = categories[catIndex].symbol()
        elif isinstance(renderer, QgsGraduatedSymbolRendererV2):
            classAttribute = renderer.classAttribute()
            attrValue = feat.attribute(classAttribute)
            ranges = renderer.ranges()
            for range in ranges:
                if (attrValue >= range.lowerValue()
                        and attrValue <= range.upperValue()):
                    symbol = range.symbol().clone()
        else:
            symbol = renderer.symbolForFeature2(feat, renderContext)
        symbolLayer = symbol.symbolLayer(0)
        if not symbolLayer.paintEffect().effectList()[0].enabled():
            shadows = "'2015-07-15 10:00:00'"
    renderer.stopRender(renderContext)
    osmb = """
var osmb = new OSMBuildings(map).date(new Date({shadows}));
osmb.set(json_{sln}_{count});""".format(shadows=shadows,
                                        sln=safeName(layer.name()),
                                        count=unicode(count))
    return osmb
Example #11
0
def writeOL(layers, groups, popup, visible, settings, folder): 
    QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
    try:
        dst = os.path.join(folder, "resources")
        if not os.path.exists(dst):
            shutil.copytree(os.path.join(os.path.dirname(__file__), "resources"), dst)
        precision = settings["Data export"]["Precision"]
        optimize = settings["Data export"]["Minify GeoJSON files"]
        cleanUnusedFields = settings["Data export"]["Delete unused fields"]
        if not cleanUnusedFields:
            usedFields = [ALL_ATTRIBUTES] * len(popup)
        else:
            usedFields = popup
        exportLayers(layers, folder, precision, optimize, usedFields)
        exportStyles(layers, folder)   
        writeLayersAndGroups(layers, groups, visible, folder, settings)   
        geojsonVars ="\n".join(['<script src="layers/%s"></script>' % (safeName(layer.name()) + ".js") 
                                for layer in layers if layer.type() == layer.VectorLayer])                      
        styleVars =  "\n".join(['<script src="styles/%s_style.js"></script>' % (safeName(layer.name())) 
                                for layer in layers if layer.type() == layer.VectorLayer])  
        popupLayers = "popupLayers = [%s];" % ",".join(['"%s"' % field if isinstance(field, basestring) else str(field) for field in popup])    
        controls = []
        if settings["Appearance"]["Add scale bar"]:
            controls.append("new ol.control.ScaleLine({})")
        if settings["Appearance"]["Add layers list"]:
            controls.append('new ol.control.LayerSwitcher({tipLabel: "Layers"})')
        mapbounds = bounds(settings["Scale/Zoom"]["Extent"] == "Canvas extent", layers) 
        mapextent = "extent: %s," % mapbounds if settings["Scale/Zoom"]["Restrict to extent"] else ""
        maxZoom = int(settings["Scale/Zoom"]["Max zoom level"])
        minZoom = int(settings["Scale/Zoom"]["Min zoom level"])
        onHover = str(settings["Appearance"]["Show popups on hover"]).lower()
        highlight = str(settings["Appearance"]["Highlight features"]).lower()
        view = "%s maxZoom: %d, minZoom: %d" % (mapextent, maxZoom, minZoom)
        values = {"@STYLEVARS@": styleVars,
                    "@GEOJSONVARS@": geojsonVars,
                    "@BOUNDS@": mapbounds,
                    "@CONTROLS@": ",".join(controls),
                    "@POPUPLAYERS@": popupLayers,
                    "@VIEW@": view,
                    "@ONHOVER@": onHover,
                    "@DOHIGHLIGHT@": highlight}    
        
        with open(os.path.join(folder, "index.html"), "w") as f:
            f.write(replaceInTemplate(settings["Appearance"]["Template"] + ".html", values))            
    finally:
        QApplication.restoreOverrideCursor() 
Example #12
0
def writeOL(layers, groups, popup, visible, settings, folder): 
    QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
    try:
        dst = os.path.join(folder, "resources")
        if not os.path.exists(dst):
            shutil.copytree(os.path.join(os.path.dirname(__file__), "resources"), dst)
        precision = settings["Data export"]["Precision"]
        optimize = settings["Data export"]["Minify GeoJSON files"]
        cleanUnusedFields = settings["Data export"]["Delete unused fields"]
        if not cleanUnusedFields:
            usedFields = [ALL_ATTRIBUTES] * len(popup)
        else:
            usedFields = popup
        exportLayers(layers, folder, precision, optimize, usedFields)
        exportStyles(layers, folder)   
        writeLayersAndGroups(layers, groups, visible, folder, settings)   
        geojsonVars ="\n".join(['<script src="layers/%s"></script>' % (safeName(layer.name()) + ".js") 
                                for layer in layers if layer.type() == layer.VectorLayer])                      
        styleVars =  "\n".join(['<script src="styles/%s_style.js"></script>' % (safeName(layer.name())) 
                                for layer in layers if layer.type() == layer.VectorLayer])  
        popupLayers = "popupLayers = [%s];" % ",".join(['"%s"' % field if isinstance(field, basestring) else str(field) for field in popup])    
        controls = []
        if settings["Appearance"]["Add scale bar"]:
            controls.append("new ol.control.ScaleLine({})")
        if settings["Appearance"]["Add layers list"]:
            controls.append('new Boundless.LayersControl({groups: {default: {title: "Layers"}}})')
        mapbounds = bounds(settings["Scale/Zoom"]["Extent"] == "Canvas extent", layers) 
        mapextent = "extent: %s," % mapbounds if settings["Scale/Zoom"]["Restrict to extent"] else ""
        maxZoom = int(settings["Scale/Zoom"]["Max zoom level"])
        minZoom = int(settings["Scale/Zoom"]["Min zoom level"])
        onHover = str(settings["Appearance"]["Show popups on hover"]).lower()
        highlight = str(settings["Appearance"]["Highlight features"]).lower()
        view = "%s maxZoom: %d, minZoom: %d" % (mapextent, maxZoom, minZoom)
        values = {"@STYLEVARS@": styleVars,
                    "@GEOJSONVARS@": geojsonVars,
                    "@BOUNDS@": mapbounds,
                    "@CONTROLS@": ",".join(controls),
                    "@POPUPLAYERS@": popupLayers,
                    "@VIEW@": view,
                    "@ONHOVER@": onHover,
                    "@DOHIGHLIGHT@": highlight}    
        
        with open(os.path.join(folder, "index.html"), "w") as f:
            f.write(replaceInTemplate(settings["Appearance"]["Template"] + ".html", values))            
    finally:
        QApplication.restoreOverrideCursor() 
Example #13
0
def buildGroups(groups, qms, layer_names_id):
    groupVars = ""
    groupedLayers = {}
    for group, groupLayers in groups.iteritems():
        groupLayerObjs = ""
        for layer in groupLayers:
            if qms:
                if isinstance(layer, TileLayer):
                    continue
            groupLayerObjs += ("lyr_" + safeName(layer.name()) + "_" +
                               layer_names_id[layer.id()] + ",")
        groupVars += ('''var %s = new ol.layer.Group({
                                layers: [%s],
                                title: "%s"});\n''' %
                      ("group_" + safeName(group), groupLayerObjs, group))
        for layer in groupLayers:
            groupedLayers[layer.id()] = safeName(group)
    return (groupVars, groupedLayers)
Example #14
0
def writeLayersAndGroups(layers, groups, visible, folder, settings):
    baseLayer = "var baseLayer = " + baseLayers[settings["Appearance"]
                                                ["Base layer"]]
    scaleVisibility = settings["Scale/Zoom"][
        "Use layer scale dependent visibility"]
    layerVars = "\n".join(
        [layerToJavascript(layer, scaleVisibility) for layer in layers])
    groupVars = ""
    groupedLayers = {}
    for group, groupLayers in groups.iteritems():
        groupVars += (
            '''var %s = new ol.layer.Group({
                                layers: [%s], 
                                title: "%s"});''' %
            ("group_" + group, ",".join(
                ["lyr_" + safeName(layer.name())
                 for layer in groupLayers]), group))
        for layer in groupLayers:
            groupedLayers[layer.id()] = group
    mapLayers = ["baseLayer"]
    usedGroups = []
    for layer in layers:
        if layer.id() in groupedLayers:
            groupName = groupedLayers[layer.id()]
            if groupName not in usedGroups:
                mapLayers.append("group_" + safeName(groupName))
                usedGroups.append(groupName)
        else:
            mapLayers.append("lyr_" + safeName(layer.name()))
    visibility = "\n".join([
        "%s.setVisible(%s);" % (layer, str(v).lower())
        for layer, v in zip(mapLayers[1:], visible)
    ])
    layersList = "var layersList = [%s];" % ",".join(
        [layer for layer in mapLayers])
    path = os.path.join(folder, "layers", "layers.js")
    with open(path, "w") as f:
        f.write(baseLayer + "\n")
        f.write(layerVars + "\n")
        f.write(groupVars + "\n")
        f.write(visibility + "\n")
        f.write(layersList)
Example #15
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)
Example #16
0
    def createAppDefinition(self, preview = False):
        layers, groups = self.getLayersAndGroups()
        appdef = {}
        appdef["Settings"] = self.getSettings()
        appdef["Base layers"] = self.getBaseLayers()
        appdef["Layers"] = layers
        if preview:
            for layer in layers:
                providerType = layer.layer.providerType().lower()
                if providerType not in ["wms", "wfs"]:
                    layer.method = utils.METHOD_FILE
        appdef["Groups"] = groups
        appdef["Widgets"] = self.getWidgets()
        appdef["Deploy"] = self.getDeployConfiguration(layers)
        if appdef["Deploy"]["GeoServer workspace"] == "":
            appdef["Deploy"]["GeoServer workspace"] = utils.safeName(appdef["Settings"]["Title"])
        if appdef["Deploy"]["PostGIS schema"] == "":
            appdef["Deploy"]["PostGIS schema"] = utils.safeName(appdef["Settings"]["Title"])

        return appdef
def buildGroups(groups, qms, layer_names_id):
    groupVars = ""
    groupedLayers = {}
    for group, groupLayers in groups.iteritems():
        groupLayerObjs = ""
        for layer in groupLayers:
            vts = layer.customProperty("VectorTilesReader/vector_tile_url")
            if qms:
                if isinstance(layer, TileLayer):
                    continue
            if vts is not None:
                continue
            groupLayerObjs += ("lyr_" + safeName(layer.name()) + "_" +
                               layer_names_id[layer.id()] + ",")
        groupVars += ('''var %s = new ol.layer.Group({
                                layers: [%s],
                                title: "%s"});\n''' %
                      ("group_" + safeName(group), groupLayerObjs, group))
        for layer in groupLayers:
            groupedLayers[layer.id()] = safeName(group)
    return (groupVars, groupedLayers)
Example #18
0
def layerToJavascript(layer, scaleVisibility):
    # TODO: change scale to resolution
    if scaleVisibility and layer.hasScaleBasedVisibility():
        minResolution = "\nminResolution:%s,\n" % unicode(1 / ((1 / layer.minimumScale()) * 39.37 * 90.7))
        maxResolution = "maxResolution:%s,\n" % unicode(1 / ((1 / layer.maximumScale()) * 39.37 * 90.7))
    else:
        minResolution = ""
        maxResolution = ""
    layerName = safeName(layer.name())
    if layer.type() == layer.VectorLayer:
        return ('''var format_%(n)s = new ol.format.GeoJSON();
var features_%(n)s = format_%(n)s.readFeatures(geojson_%(n)s);
var jsonSource_%(n)s = new ol.source.Vector();
jsonSource_%(n)s.addFeatures(features_%(n)s);
var lyr_%(n)s = new ol.layer.Vector({
                source: jsonSource_%(n)s,%(min)s %(max)s
                style: style_%(n)s,
                title: "%(name)s"
            });''' %
                {"name": layer.name(), "n": layerName, "min": minResolution,
                 "max": maxResolution})
    elif layer.type() == layer.RasterLayer:
        if layer.providerType().lower() == "wms":
            source = layer.source()
            layers = re.search(r"layers=(.*?)(?:&|$)", source).groups(0)[0]
            url = re.search(r"url=(.*?)(?:&|$)", source).groups(0)[0]
            return '''var lyr_%(n)s = new ol.layer.Tile({
                        source: new ol.source.TileWMS(({
                          url: "%(url)s",
                          params: {"LAYERS": "%(layers)s", "TILED": "true"},
                        })),
                        title: "%(name)s"
                      });''' % {"layers": layers, "url": url, "n": layerName, "name": layer.name()}
        elif layer.providerType().lower() == "gdal":
            provider = layer.dataProvider()
            transform = QgsCoordinateTransform(provider.crs(), QgsCoordinateReferenceSystem("EPSG:3857"))
            extent = transform.transform(provider.extent())
            sExtent = "[%f, %f, %f, %f]" % (extent.xMinimum(), extent.yMinimum(),
                                            extent.xMaximum(), extent.yMaximum())
            return '''var lyr_%(n)s = new ol.layer.Image({
                            opacity: 1,
                            title: "%(name)s",
                            source: new ol.source.ImageStatic({
                               url: "./layers/%(n)s.jpg",
                                projection: 'EPSG:3857',
                                alwaysInRange: true,
                                imageSize: [%(col)d, %(row)d],
                                imageExtent: %(extent)s
                            })
                        });''' % {"n": layerName, "extent": sExtent, "col": provider.xSize(),
                                  "name": layer.name(), "row": provider.ySize()}
def layerToJavascript(iface, layer, encode2json, matchCRS, cluster, info,
                      restrictToExtent, extent, count, vtLayers):
    (minResolution, maxResolution) = getScaleRes(layer)
    layerName = safeName(layer.name()) + "_" + unicode(count)
    layerAttr = getAttribution(layer)
    if layer.type() == layer.VectorLayer and not is25d(
            layer, iface.mapCanvas(), restrictToExtent, extent):
        renderer = layer.rendererV2()
        cluster = isCluster(cluster, renderer)
        hmRadius = 0
        hmRamp = ""
        hmWeight = 0
        hmWeightMax = 0
        vts = layer.customProperty("VectorTilesReader/vector_tile_url")
        if vts is not None:
            if vts not in vtLayers:
                vtLayers.append(vts)
                return getVT(vts), vtLayers
            else:
                return "", vtLayers
        if isinstance(renderer, QgsHeatmapRenderer):
            (pointLayerType, hmRadius, hmRamp, hmWeight,
             hmWeightMax) = getHeatmap(layer, renderer)
        else:
            pointLayerType = "Vector"
        crsConvert = getCRS(iface, matchCRS)
        if layer.providerType() == "WFS" and not encode2json:
            return getWFS(layer, layerName, layerAttr, cluster, minResolution,
                          maxResolution), vtLayers
        else:
            return getJSON(layerName, crsConvert, layerAttr, cluster,
                           pointLayerType, minResolution, maxResolution,
                           hmRadius, hmRamp, hmWeight, hmWeightMax, renderer,
                           layer), vtLayers
    elif layer.type() == layer.RasterLayer:
        if layer.providerType().lower() == "wms":
            source = layer.source()
            opacity = layer.renderer().opacity()
            d = parse_qs(source)
            if "type" in d and d["type"][0] == "xyz":
                return getXYZ(layerName, opacity, minResolution, maxResolution,
                              layerAttr, d["url"][0]), vtLayers
            elif "tileMatrixSet" in d:
                return getWMTS(layer, d, layerAttr, layerName, opacity,
                               minResolution, maxResolution), vtLayers
            else:
                return getWMS(source, layer, layerAttr, layerName, opacity,
                              minResolution, maxResolution, info), vtLayers
        elif layer.providerType().lower() == "gdal":
            return getRaster(iface, layer, layerName, layerAttr, minResolution,
                             maxResolution, matchCRS), vtLayers
Example #20
0
def layerToJavascript(layer, scaleVisibility):
    # TODO: change scale to resolution
    if scaleVisibility and layer.hasScaleBasedVisibility():
        minResolution = "\nminResolution:%s,\n" % unicode(1 / ((1 / layer.minimumScale()) * 39.37 * 90.7))
        maxResolution = "maxResolution:%s,\n" % unicode(1 / ((1 / layer.maximumScale()) * 39.37 * 90.7))
    else:
        minResolution = ""
        maxResolution = ""
    layerName = safeName(layer.name())
    if layer.type() == layer.VectorLayer:
        return ('''var format_%(n)s = new ol.format.GeoJSON();
var features_%(n)s = format_%(n)s.readFeatures(geojson_%(n)s);
var jsonSource_%(n)s = new ol.source.Vector();
jsonSource_%(n)s.addFeatures(features_%(n)s);
var lyr_%(n)s = new ol.layer.Vector({
                source: jsonSource_%(n)s,%(min)s %(max)s
                style: style_%(n)s,
                title: "%(name)s"
            });''' %
                {"name": layer.name(), "n": layerName, "min": minResolution,
                 "max": maxResolution})
    elif layer.type() == layer.RasterLayer:
        if layer.providerType().lower() == "wms":
            source = layer.source()
            layers = re.search(r"layers=(.*?)(?:&|$)", source).groups(0)[0]
            url = re.search(r"url=(.*?)(?:&|$)", source).groups(0)[0]
            return '''var lyr_%(n)s = new ol.layer.Tile({
                        source: new ol.source.TileWMS(({
                          url: "%(url)s",
                          params: {"LAYERS": "%(layers)s", "TILED": "true"},
                        })),
                        title: "%(name)s"
                      });''' % {"layers": layers, "url": url, "n": layerName, "name": layer.name()}
        elif layer.providerType().lower() == "gdal":
            provider = layer.dataProvider()
            transform = QgsCoordinateTransform(provider.crs(), QgsCoordinateReferenceSystem("EPSG:3857"))
            extent = transform.transform(provider.extent())
            sExtent = "[%f, %f, %f, %f]" % (extent.xMinimum(), extent.yMinimum(),
                                            extent.xMaximum(), extent.yMaximum())
            return '''var lyr_%(n)s = new ol.layer.Image({
                            opacity: 1,
                            title: "%(name)s",
                            source: new ol.source.ImageStatic({
                               url: "./layers/%(n)s.jpg",
                                projection: 'EPSG:3857',
                                alwaysInRange: true,
                                imageSize: [%(col)d, %(row)d],
                                imageExtent: %(extent)s
                            })
                        });''' % {"n": layerName, "extent": sExtent, "col": provider.xSize(),
                                  "name": layer.name(), "row": provider.ySize()}
def addLayersList(basemapList, matchCRS, layer_list, cluster, legends,
                  collapsed):
    if len(basemapList) < 2 or matchCRS:
        controlStart = """
        var baseMaps = {};"""
    else:
        comma = ""
        controlStart = """
        var baseMaps = {"""
        for count, basemap in enumerate(basemapList):
            controlStart += comma + "'" + unicode(basemap)
            controlStart += "': basemap" + unicode(count)
            comma = ", "
        controlStart += "};"
    controlStart += """
        L.control.layers(baseMaps,{"""
    layersList = controlStart

    lyrCount = len(layer_list) - 1
    for i, clustered in zip(reversed(layer_list), reversed(cluster)):
        try:
            rawLayerName = i.name()
            safeLayerName = safeName(rawLayerName) + "_" + unicode(lyrCount)
            lyrCount -= 1
            if i.type() == QgsMapLayer.VectorLayer:
                testDump = i.rendererV2().dump()
                if (clustered and i.geometryType() == QGis.Point):
                    new_layer = "'" + legends[safeLayerName].replace(
                        "'", "\\'")
                    new_layer += "': cluster_" "" + safeLayerName + ","
                else:
                    new_layer = "'" + legends[safeLayerName].replace(
                        "'", "\\'")
                    new_layer += "': layer_" + safeLayerName + ","
                layersList += new_layer
            elif i.type() == QgsMapLayer.RasterLayer:
                new_layer = '"' + rawLayerName.replace("'", "\\'") + '"'
                new_layer += ": overlay_" + safeLayerName + ""","""
                layersList += new_layer
        except:
            QgsMessageLog.logMessage(traceback.format_exc(),
                                     "qgis2ol5",
                                     level=QgsMessageLog.CRITICAL)
    controlEnd = "}"
    if collapsed:
        controlEnd += ",{collapsed:false}"
    controlEnd += ").addTo(map);"
    layersList += controlEnd
    return layersList
def getVisibility(mapLayers, layers, visible):
    visibility = ""
    currentVT = ""
    for layer, layerObj, v in zip(mapLayers[1:], layers, visible):
        vts = layerObj.customProperty("VectorTilesReader/vector_tile_url")
        if vts is None or vts != currentVT:
            if vts is not None:
                lname = "lyr_%s" % safeName(vts)
            else:
                lname = layer
            visibility += "\n".join(
                ["%s.setVisible(%s);" % (lname, unicode(v).lower())])
            if vts is not None:
                currentVT = vts
    return visibility
def getVTStyles(vtStyles):
    vtStyleString = ""
    for (vts, lyrs) in vtStyles.items():
        vtStyleString += """
        style_%s = {""" % safeName(vts)
        for (lyr, styles) in lyrs.items():
            vtStyleString += """
            %s: [""" % lyr
            for style in styles:
                if style == "":
                    style = "{}"
                vtStyleString += "%s," % style
            vtStyleString += "],"
            vtStyleString = vtStyleString.replace(",]", "]")
        vtStyleString += "}"

    return vtStyleString
Example #24
0
 def createApp(self):
     appdef = self.createAppDefinition(False)
     appName = appdef["Settings"]["Title"].replace(" ", "")
     appdefFile = utils.tempFilenameInTempFolder(appName + ".json")
     folder = os.path.dirname(appdefFile)
     print folder
     exportLayers(appdef["Layers"], folder, self.progress, 3)
     saveAppdef(appdef, appdefFile)
     from ftplib import FTP
     url = self.g3mUrlBox.text()
     ftp = FTP(url, 'qgis', 'qgis')
     utils.chdir("ftp-box/g3m-qgis/%s" % appName, ftp)
     #ftp.cwd("ftp-box/g3m-qgis/%s" % appName)
     with open(appdefFile, 'rb') as f:
         ftp.storbinary('STOR ' + appName + ".json", f)
     utils.chdir("layers", ftp)
     for layer in appdef["Layers"]:
         layerName = utils.safeName(layer.layer)
         with open(folder + "/layers/lyr_%s.js" % layerName, 'rb') as f:
             ftp.storbinary('STOR ' + layerName + ".json", f)
Example #25
0
 def createApp(self):
     appdef = self.createAppDefinition(False)
     appName = appdef["Settings"]["Title"].replace(" ", "")
     appdefFile = utils.tempFilenameInTempFolder(appName + ".json")
     folder = os.path.dirname(appdefFile)
     print folder
     exportLayers(appdef["Layers"], folder, self.progress, 3)
     saveAppdef(appdef, appdefFile)
     from ftplib import FTP
     url = self.g3mUrlBox.text()
     ftp = FTP(url, 'qgis', 'qgis')
     utils.chdir("ftp-box/g3m-qgis/%s" % appName, ftp)
     #ftp.cwd("ftp-box/g3m-qgis/%s" % appName)
     with open(appdefFile, 'rb') as f:
         ftp.storbinary('STOR ' + appName + ".json", f)
     utils.chdir("layers", ftp)
     for layer in appdef["Layers"]:
         layerName = utils.safeName(layer.layer)
         with open(folder + "/layers/lyr_%s.js" % layerName, 'rb') as f:
             ftp.storbinary('STOR ' + layerName + ".json", f)
def getVT(json_url):
    print json_url
    sln = safeName(json_url)
    key = json_url.split("?")[1]
    json = TileJSON(json_url)
    json.load()
    tile_url = json.tiles()[0].split("?")[0]
    key_url = "%s?%s" % (tile_url, key)
    layerCode = """
        var lyr_%s = new ol.layer.VectorTile({
            source: new ol.source.VectorTile({
                format: new ol.format.MVT(),
                url: '%s',
                tileGrid: new ol.tilegrid.createXYZ({
                    tileSize: 512, maxZoom: 14
                }),
                tilePixelRatio: 8
            }),
            style: style_%s
        });
        """ % (sln, key_url, sln)
    return layerCode
Example #27
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()}
Example #28
0
def writeOL(iface, layers, groups, popup, visible,
            json, clustered, settings, folder):
    QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
    stamp = time.strftime("%Y_%m_%d-%H_%M_%S")
    folder = os.path.join(folder, 'qgis2web_' + unicode(stamp))
    imagesFolder = os.path.join(folder, "images")
    QDir().mkpath(imagesFolder)
    try:
        dst = os.path.join(folder, "resources")
        if not os.path.exists(dst):
            shutil.copytree(os.path.join(os.path.dirname(__file__),
                                         "resources"),
                            dst)
        matchCRS = settings["Appearance"]["Match project CRS"]
        precision = settings["Data export"]["Precision"]
        optimize = settings["Data export"]["Minify GeoJSON files"]
        cleanUnusedFields = settings["Data export"]["Delete unused fields"]
        if not cleanUnusedFields:
            usedFields = [ALL_ATTRIBUTES] * len(popup)
        else:
            usedFields = popup
        exportLayers(iface, layers, folder, precision,
                     optimize, popup, json)
        exportStyles(layers, folder, clustered)
        osmb = writeLayersAndGroups(layers, groups, visible, folder, popup,
                                    settings, json, matchCRS, clustered, iface)
        jsAddress = '<script src="resources/polyfills.js"></script>'
        if settings["Data export"]["Mapping library location"] == "Local":
            cssAddress = """<link rel="stylesheet" """
            cssAddress += """href="./resources/ol.css" />"""
            jsAddress += """
        <script src="./resources/ol.js"></script>"""
        else:
            cssAddress = """<link rel="stylesheet" href="http://"""
            cssAddress += """openlayers.org/en/v3.12.1/css/ol.css" />"""
            jsAddress += """
        <script src="http://openlayers.org/en/v3.12.1/"""
            jsAddress += """build/ol.js"></script>"""
        jsAddress += """
        <script src="resources/OSMBuildings-OL3.js"></script>"""
        geojsonVars = ""
        wfsVars = ""
        styleVars = ""
        for layer, encode2json in zip(layers, json):
            if layer.type() == layer.VectorLayer:
                if layer.providerType() != "WFS" or encode2json:
                    geojsonVars += ('<script src="layers/%s"></script>' %
                                    (safeName(layer.name()) + ".js"))
                else:
                    layerSource = layer.source()
                    if not matchCRS:
                        layerSource = re.sub('SRSNAME\=EPSG\:\d+',
                                             'SRSNAME=EPSG:3857', layerSource)
                    layerSource += "&outputFormat=text%2Fjavascript&"
                    layerSource += "format_options=callback%3A"
                    layerSource += "get" + safeName(layer.name()) + "Json"
                    wfsVars += ('<script src="%s"></script>' % layerSource)
                styleVars += ('<script src="styles/%s_style.js"></script>' %
                              (safeName(layer.name())))
        popupLayers = "popupLayers = [%s];" % ",".join(
                ['1' for field in popup])
        controls = ['expandedAttribution']  # Check qgis2web.js 14:7
        if settings["Appearance"]["Add scale bar"]:
            controls.append("new ol.control.ScaleLine({})")
        if settings["Appearance"]["Add layers list"]:
            controls.append(
                'new ol.control.LayerSwitcher({tipLabel: "Layers"})')
        if settings["Appearance"]["Measure tool"] != "None":
            controls.append(
                'new measureControl()')
        pageTitle = QgsProject.instance().title()
        mapSettings = iface.mapCanvas().mapSettings()
        backgroundColor = """
        <style>
        html, body {{
            background-color: {bgcol};
        }}
        </style>
""".format(bgcol=mapSettings.backgroundColor().name())
        mapbounds = bounds(iface,
                           settings["Scale/Zoom"]["Extent"] == "Canvas extent",
                           layers,
                           settings["Appearance"]["Match project CRS"])
        mapextent = "extent: %s," % mapbounds if (
            settings["Scale/Zoom"]["Restrict to extent"]) else ""
        maxZoom = int(settings["Scale/Zoom"]["Max zoom level"])
        minZoom = int(settings["Scale/Zoom"]["Min zoom level"])
        popupsOnHover = settings["Appearance"]["Show popups on hover"]
        highlightFeatures = settings["Appearance"]["Highlight on hover"]
        onHover = unicode(popupsOnHover).lower()
        highlight = unicode(highlightFeatures).lower()
        highlightFill = mapSettings.selectionColor().name()
        proj4 = ""
        projdef = ""
        view = "%s maxZoom: %d, minZoom: %d" % (mapextent, maxZoom, minZoom)
        if settings["Appearance"]["Match project CRS"]:
            proj4 = """
<script src="http://cdnjs.cloudflare.com/ajax/libs/proj4js/2.3.6/proj4.js">"""
            proj4 += "</script>"
            projdef = "<script>proj4.defs('{epsg}','{defn}');</script>".format(
                epsg=mapSettings.destinationCrs().authid(),
                defn=mapSettings.destinationCrs().toProj4())
            view += ", projection: '%s'" % (
                mapSettings.destinationCrs().authid())
        if settings["Appearance"]["Measure tool"] != "None":
            measureControl = measureControlScript()
            measuring = measuringScript()
            measure = measureScript()
            if settings["Appearance"]["Measure tool"] == "Imperial":
                measureUnit = measureUnitFeetScript()
            else:
                measureUnit = measureUnitMetricScript()
            measureStyle = measureStyleScript()
        else:
            measureControl = ""
            measuring = ""
            measure = ""
            measureUnit = ""
            measureStyle = ""
        geolocate = geolocation(settings["Appearance"]["Geolocate user"])
        geocode = settings["Appearance"]["Add address search"]
        geocodingLinks = geocodeLinks(geocode)
        geocodingScript = geocodeScript(geocode)
        extracss = """
        <link rel="stylesheet" href="./resources/ol3-layerswitcher.css">
        <link rel="stylesheet" href="./resources/qgis2web.css">"""
        ol3layerswitcher = """
        <script src="./resources/ol3-layerswitcher.js"></script>"""
        ol3popup = """<div id="popup" class="ol-popup">
                <a href="#" id="popup-closer" class="ol-popup-closer"></a>
                <div id="popup-content"></div>
            </div>"""
        ol3qgis2webjs = """<script src="./resources/qgis2web.js"></script>
        <script src="./resources/Autolinker.min.js"></script>"""
        if osmb != "":
            ol3qgis2webjs += """
        <script>{osmb}</script>""".format(osmb=osmb)
        ol3layers = """
        <script src="./layers/layers.js" type="text/javascript"></script>"""
        mapSize = iface.mapCanvas().size()
        values = {"@PAGETITLE@": pageTitle,
                  "@CSSADDRESS@": cssAddress,
                  "@EXTRACSS@": extracss,
                  "@JSADDRESS@": jsAddress,
                  "@MAP_WIDTH@": unicode(mapSize.width()) + "px",
                  "@MAP_HEIGHT@": unicode(mapSize.height()) + "px",
                  "@OL3_STYLEVARS@": styleVars,
                  "@OL3_BACKGROUNDCOLOR@": backgroundColor,
                  "@OL3_POPUP@": ol3popup,
                  "@OL3_GEOJSONVARS@": geojsonVars,
                  "@OL3_WFSVARS@": wfsVars,
                  "@OL3_PROJ4@": proj4,
                  "@OL3_PROJDEF@": projdef,
                  "@OL3_GEOCODINGLINKS@": geocodingLinks,
                  "@QGIS2WEBJS@": ol3qgis2webjs,
                  "@OL3_LAYERSWITCHER@": ol3layerswitcher,
                  "@OL3_LAYERS@": ol3layers,
                  "@OL3_MEASURESTYLE@": measureStyle,
                  "@LEAFLET_ADDRESSCSS@": "",
                  "@LEAFLET_MEASURECSS@": "",
                  "@LEAFLET_EXTRAJS@": "",
                  "@LEAFLET_ADDRESSJS@": "",
                  "@LEAFLET_MEASUREJS@": "",
                  "@LEAFLET_CRSJS@": "",
                  "@LEAFLET_CLUSTERCSS@": "",
                  "@LEAFLET_CLUSTERJS@": ""}
        with open(os.path.join(folder, "index.html"), "w") as f:
            htmlTemplate = settings["Appearance"]["Template"]
            if htmlTemplate == "":
                htmlTemplate = "basic"
            templateOutput = replaceInTemplate(htmlTemplate + ".html", values)
            templateOutput = re.sub('\n[\s_]+\n', '\n', templateOutput)
            f.write(templateOutput)
        values = {"@BOUNDS@": mapbounds,
                  "@CONTROLS@": ",".join(controls),
                  "@POPUPLAYERS@": popupLayers,
                  "@VIEW@": view,
                  "@ONHOVER@": onHover,
                  "@DOHIGHLIGHT@": highlight,
                  "@HIGHLIGHTFILL@": highlightFill,
                  "@GEOLOCATE@": geolocate,
                  "@GEOCODINGSCRIPT@": geocodingScript,
                  "@MEASURECONTROL@": measureControl,
                  "@MEASURING@": measuring,
                  "@MEASURE@": measure,
                  "@MEASUREUNIT@": measureUnit}
        with open(os.path.join(folder, "resources", "qgis2web.js"), "w") as f:
            f.write(replaceInScript("qgis2web.js", values))
    except Exception as e:
        print "FAIL"
        print traceback.format_exc()
    finally:
        QApplication.restoreOverrideCursor()
    return os.path.join(folder, "index.html")
Example #29
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
Example #30
0
def exportStyles(layers, folder, clustered):
    stylesFolder = os.path.join(folder, "styles")
    QDir().mkpath(stylesFolder)
    for count, (layer, cluster) in enumerate(zip(layers, clustered)):
        sln = safeName(layer.name()) + unicode(count)
        if layer.type() != layer.VectorLayer:
            continue
        labelsEnabled = unicode(
            layer.customProperty("labeling/enabled")).lower() == "true"
        if (labelsEnabled):
            labelField = layer.customProperty("labeling/fieldName")
            if labelField != "":
                if unicode(layer.customProperty(
                        "labeling/isExpression")).lower() == "true":
                    exprFilename = os.path.join(folder, "resources",
                                                "qgis2web_expressions.js")
                    fieldName = layer.customProperty("labeling/fieldName")
                    name = compile_to_file(fieldName, "label_%s" % sln,
                                           "OpenLayers3", exprFilename)
                    js = "%s(context)" % (name)
                    js = js.strip()
                    labelText = js
                else:
                    fieldIndex = layer.pendingFields().indexFromName(
                        labelField)
                    try:
                        editFormConfig = layer.editFormConfig()
                        editorWidget = editFormConfig.widgetType(fieldIndex)
                    except:
                        editorWidget = layer.editorWidgetV2(fieldIndex)
                    if (editorWidget == QgsVectorLayer.Hidden
                            or editorWidget == 'Hidden'):
                        labelField = "q2wHide_" + labelField
                    labelText = ('feature.get("%s")' %
                                 labelField.replace('"', '\\"'))
            else:
                labelText = '""'
        else:
            labelText = '""'
        defs = "var size = 0;\n"
        try:
            renderer = layer.rendererV2()
            layer_alpha = layer.layerTransparency()
            if isinstance(renderer, QgsSingleSymbolRendererV2):
                symbol = renderer.symbol()
                if cluster:
                    style = "var size = feature.get('features').length;\n"
                else:
                    style = "var size = 0;\n"
                style += "    var style = " + getSymbolAsStyle(
                    symbol, stylesFolder, layer_alpha)
                value = 'var value = ""'
            elif isinstance(renderer, QgsCategorizedSymbolRendererV2):
                defs += """function categories_%s(feature, value) {
                switch(value) {""" % sln
                cats = []
                for cat in renderer.categories():
                    if (cat.value() is not None and cat.value() != ""
                            and not isinstance(cat.value(), QPyNullVariant)):
                        categoryStr = "case '%s':" % unicode(
                            cat.value()).replace("'", "\\'")
                    else:
                        categoryStr = "default:"
                    categoryStr += '''
                    return %s;
                    break;''' % (getSymbolAsStyle(cat.symbol(), stylesFolder,
                                                  layer_alpha))
                    cats.append(categoryStr)
                defs += "\n".join(cats) + "}};"
                classAttr = renderer.classAttribute()
                fieldIndex = layer.pendingFields().indexFromName(classAttr)
                try:
                    editFormConfig = layer.editFormConfig()
                    editorWidget = editFormConfig.widgetType(fieldIndex)
                except:
                    editorWidget = layer.editorWidgetV2(fieldIndex)
                if (editorWidget == QgsVectorLayer.Hidden
                        or editorWidget == 'Hidden'):
                    classAttr = "q2wHide_" + classAttr
                value = ('var value = feature.get("%s");' % classAttr)
                style = ('''var style = categories_%s(feature, value)''' %
                         (sln))
            elif isinstance(renderer, QgsGraduatedSymbolRendererV2):
                varName = "ranges_" + sln
                defs += "var %s = [" % varName
                ranges = []
                for ran in renderer.ranges():
                    symbolstyle = getSymbolAsStyle(ran.symbol(), stylesFolder,
                                                   layer_alpha)
                    ranges.append(
                        '[%f, %f, %s]' %
                        (ran.lowerValue(), ran.upperValue(), symbolstyle))
                defs += ",\n".join(ranges) + "];"
                classAttr = renderer.classAttribute()
                fieldIndex = layer.pendingFields().indexFromName(classAttr)
                try:
                    editFormConfig = layer.editFormConfig()
                    editorWidget = editFormConfig.widgetType(fieldIndex)
                except:
                    editorWidget = layer.editorWidgetV2(fieldIndex)
                if (editorWidget == QgsVectorLayer.Hidden
                        or editorWidget == 'Hidden'):
                    classAttr = "q2wHide_" + classAttr
                value = ('var value = feature.get("%s");' % classAttr)
                style = '''var style = %(v)s[0][2];
    for (i = 0; i < %(v)s.length; i++){
        var range = %(v)s[i];
        if (value > range[0] && value<=range[1]){
            style =  range[2];
        }
    }''' % {
                    "v": varName
                }
            elif isinstance(renderer, QgsRuleBasedRendererV2):
                template = """
        function rules_%s(feature, value) {
            var context = {
                feature: feature,
                variables: {}
            };
            // Start of if blocks and style check logic
            %s
            else {
                return %s;
            }
        }
        var style = rules_%s(feature, value);
        """
                elsejs = "[]"
                js = ""
                root_rule = renderer.rootRule()
                rules = root_rule.children()
                expFile = os.path.join(folder, "resources",
                                       "qgis2web_expressions.js")
                ifelse = "if"
                for count, rule in enumerate(rules):
                    symbol = rule.symbol()
                    styleCode = getSymbolAsStyle(symbol, stylesFolder,
                                                 layer_alpha)
                    name = "".join((sln, "rule", unicode(count)))
                    exp = rule.filterExpression()
                    if rule.isElse():
                        elsejs = styleCode
                        continue
                    name = compile_to_file(exp, name, "OpenLayers3", expFile)
                    js += """
                    %s (%s(context)) {
                      return %s;
                    }
                    """ % (ifelse, name, styleCode)
                    js = js.strip()
                    ifelse = "else if"
                value = ("var value = '';")
                style = template % (sln, js, elsejs, sln)
            else:
                style = ""
            if layer.customProperty("labeling/fontSize"):
                size = float(layer.customProperty("labeling/fontSize")) * 1.3
            else:
                size = 10
            italic = layer.customProperty("labeling/fontItalic")
            bold = layer.customProperty("labeling/fontWeight")
            r = layer.customProperty("labeling/textColorR")
            g = layer.customProperty("labeling/textColorG")
            b = layer.customProperty("labeling/textColorB")
            color = "rgba(%s, %s, %s, 255)" % (r, g, b)
            face = layer.customProperty("labeling/fontFamily")
            palyr = QgsPalLayerSettings()
            palyr.readFromLayer(layer)
            sv = palyr.scaleVisibility
            if sv:
                min = float(palyr.scaleMin)
                max = float(palyr.scaleMax)
                min = 1 / ((1 / min) * 39.37 * 90.7)
                max = 1 / ((1 / max) * 39.37 * 90.7)
                labelRes = " && resolution > %(min)d " % {"min": min}
                labelRes += "&& resolution < %(max)d" % {"max": max}
            else:
                labelRes = ""
            buffer = palyr.bufferDraw
            if buffer:
                bufferColor = palyr.bufferColor.name()
                bufferWidth = palyr.bufferSize
                stroke = """
              stroke: new ol.style.Stroke({
                color: "%s",
                width: %d
              }),""" % (bufferColor, bufferWidth)
            else:
                stroke = ""
            if style != "":
                style = '''function(feature, resolution){
    var context = {
        feature: feature,
        variables: {}
    };
    %(value)s
    %(style)s;
    if (%(label)s !== null%(labelRes)s) {
        var labelText = String(%(label)s);
    } else {
        var labelText = ""
    }
    var key = value + "_" + labelText

    if (!%(cache)s[key]){
        var text = new ol.style.Text({
              font: '%(size)spx \\'%(face)s\\', sans-serif',
              text: labelText,
              textBaseline: "center",
              textAlign: "left",
              offsetX: 5,
              offsetY: 3,
              fill: new ol.style.Fill({
                color: '%(color)s'
              }),%(stroke)s
            });
        %(cache)s[key] = new ol.style.Style({"text": text})
    }
    var allStyles = [%(cache)s[key]];
    allStyles.push.apply(allStyles, style);
    return allStyles;
}''' % {
                    "style": style,
                    "labelRes": labelRes,
                    "label": labelText,
                    "cache": "styleCache_" + sln,
                    "size": size,
                    "face": face,
                    "color": color,
                    "stroke": stroke,
                    "value": value
                }
            else:
                style = "''"
        except Exception, e:
            style = """{
            /* """ + traceback.format_exc() + " */}"
            QgsMessageLog.logMessage(traceback.format_exc(),
                                     "qgis2web",
                                     level=QgsMessageLog.CRITICAL)

        path = os.path.join(stylesFolder, sln + "_style.js")

        with codecs.open(path, "w", "utf-8") as f:
            f.write('''%(defs)s
var styleCache_%(name)s={}
var style_%(name)s = %(style)s;''' % {
                "defs": defs,
                "name": sln,
                "style": style
            })
Example #31
0
def writeLayersAndGroups(layers, groups, visible, folder,
                         settings, json, matchCRS, clustered):

    basemapList = settings["Appearance"]["Base layer"]
    basemaps = ""
    comma = ""
    for count, basemap in enumerate(basemapList):
        basemaps += comma + baseLayers[basemap.text()]
        comma = ", "

    baseLayer = baseLayerGroup % basemaps

    layerVars = ""
    for layer, encode2json, cluster in zip(layers, json, clustered):
        layerVars += "\n".join([layerToJavascript(iface, layer, encode2json,
                                                  matchCRS, cluster)])
    groupVars = ""
    groupedLayers = {}
    for group, groupLayers in groups.iteritems():
        groupVars += ('''var %s = new ol.layer.Group({
                                layers: [%s],
                                title: "%s"});\n''' %
                      ("group_" + safeName(group),
                       ",".join(["lyr_" + safeName(layer.name())
                                for layer in groupLayers]),
                       group))
        for layer in groupLayers:
            groupedLayers[layer.id()] = safeName(group)
    mapLayers = []
    if settings["Appearance"]["Base layer"] != "None":
        mapLayers.append("baseLayer")
    usedGroups = []
    for layer in layers:
        mapLayers.append("lyr_" + safeName(layer.name()))
    visibility = ""
    for layer, v in zip(mapLayers[1:], visible):
        visibility += "\n".join(["%s.setVisible(%s);" % (layer,
                                                         unicode(v).lower())])

    group_list = ["baseLayer"]
    no_group_list = []
    for layer in layers:
        if layer.id() in groupedLayers:
            groupName = groupedLayers[layer.id()]
            if groupName not in usedGroups:
                group_list.append("group_" + safeName(groupName))
                usedGroups.append(groupName)
        else:
            no_group_list.append("lyr_" + safeName(layer.name()))

    layersList = []
    for layer in (group_list + no_group_list):
        layersList.append(layer)
    layersListString = "var layersList = [" + ",".join(layersList) + "];"

    path = os.path.join(folder, "layers", "layers.js")
    with codecs.open(path, "w", "utf-8") as f:
        f.write(baseLayer + "\n")
        f.write(layerVars + "\n")
        f.write(groupVars + "\n")
        f.write(visibility + "\n")
        f.write(layersListString + "\n")
Example #32
0
def exportStyles(layers, folder):
    stylesFolder = os.path.join(folder, "styles")
    QDir().mkpath(stylesFolder)
    for layer in layers:
        if layer.type() != layer.VectorLayer:
            continue
        labelsEnabled = str(layer.customProperty("labeling/enabled")).lower() == "true"
        if (labelsEnabled):
            labelField = layer.customProperty("labeling/fieldName")
            labelText = 'feature.get("%s")' % labelField
        else:
            labelText = '""'  
        defs = ""
        try:
            renderer = layer.rendererV2()
            if isinstance(renderer, QgsSingleSymbolRendererV2):
                symbol = renderer.symbol()
                style = "var style = " + getSymbolAsStyle(symbol, stylesFolder)  
                value = 'var value = ""'              
            elif isinstance(renderer, QgsCategorizedSymbolRendererV2):                
                defs += "var categories_%s = {" % safeName(layer.name())                
                cats = []
                for cat in renderer.categories():
                    cats.append('"%s": %s' % (cat.value(), getSymbolAsStyle(cat.symbol(), stylesFolder)))
                defs +=  ",\n".join(cats) + "};"     
                value = 'var value = feature.get("%s");' %  renderer.classAttribute()         
                style = '''var style = categories_%s[value]'''  % (safeName(layer.name()))
            elif isinstance(renderer, QgsGraduatedSymbolRendererV2):
                varName = "ranges_" + safeName(layer.name())
                defs += "var %s = [" % varName               
                ranges = []
                for ran in renderer.ranges():
                    symbolstyle = getSymbolAsStyle(ran.symbol(), stylesFolder)
                    ranges.append('[%f, %f, %s]' % (ran.lowerValue(), ran.upperValue(), symbolstyle))
                defs += ",\n".join(ranges) + "];" 
                value = 'var value = feature.get("%s");' %  renderer.classAttribute()                
                style = '''var style = %(v)s[0][2];
                            for (i = 0; i < %(v)s.length; i++){
                                var range = %(v)s[i];
                                if (value > range[0] && value<=range[1]){
                                    style =  range[2];
                                }
                            }
                            ''' % {"v": varName}
            size = layer.customProperty("labeling/fontSize")
            r = layer.customProperty("labeling/textColorR")
            g = layer.customProperty("labeling/textColorG")
            b = layer.customProperty("labeling/textColorB")
            color = "rgba(%s, %s, %s, 255)" % (r,g,b)
            style = '''function(feature, resolution){
                        %(value)s
                        %(style)s;
                        var labelText = %(label)s;
                        var key = value + "_" + labelText

                        if (!%(cache)s[key]){
                            var text = new ol.style.Text({
                                  font: '%(size)spx Calibri,sans-serif',
                                  text: labelText,
                                  fill: new ol.style.Fill({
                                    color: "%(color)s"
                                  }),
                                });
                            %(cache)s[key] = new ol.style.Style({"text": text});
                        }
                        var allStyles = [%(cache)s[key]];
                        allStyles.push.apply(allStyles, style);
                        return allStyles;
                    }''' % {"style": style, "label": labelText, "cache": "styleCache_" + safeName(layer.name()),
                            "size": size, "color": color, "value": value} 
        except Exception, e:      
            style = "{}"
            
        path = os.path.join(stylesFolder, safeName(layer.name()) + "_style.js")  

        with open(path, "w") as f: 
            f.write('''%(defs)s
                    var styleCache_%(name)s={}
                    var style_%(name)s = %(style)s;''' % 
                {"defs":defs, "name":safeName(layer.name()), "style":style})                    
Example #33
0
def exportStyles(layers, folder, clustered):
    stylesFolder = os.path.join(folder, "styles")
    QDir().mkpath(stylesFolder)
    for layer, cluster in zip(layers, clustered):
        if layer.type() != layer.VectorLayer:
            continue
        labelsEnabled = unicode(
            layer.customProperty("labeling/enabled")).lower() == "true"
        if (labelsEnabled):
            labelField = layer.customProperty("labeling/fieldName")
            if labelField != "":
                labelText = ('feature.get("%s")' %
                             labelField.replace('"', '\\"'))
            else:
                labelText = '""'
        else:
            labelText = '""'
        defs = "var size = 0;\n"
        try:
            renderer = layer.rendererV2()
            layer_alpha = layer.layerTransparency()
            if (isinstance(renderer, QgsSingleSymbolRendererV2) or
                    isinstance(renderer, QgsRuleBasedRendererV2)):
                if isinstance(renderer, QgsRuleBasedRendererV2):
                    symbol = renderer.rootRule().children()[0].symbol()
                else:
                    symbol = renderer.symbol()
                if cluster:
                    style = "var size = feature.get('features').length;\n"
                else:
                    style = "var size = 0;\n"
                style += "    var style = " + getSymbolAsStyle(symbol,
                                                               stylesFolder,
                                                               layer_alpha)
                value = 'var value = ""'
            elif isinstance(renderer, QgsCategorizedSymbolRendererV2):
                defs += "var categories_%s = {" % safeName(layer.name())
                cats = []
                for cat in renderer.categories():
                    cats.append('"%s": %s' %
                                (cat.value(), getSymbolAsStyle(
                                    cat.symbol(),
                                    stylesFolder,
                                    layer_alpha)))
                defs += ",\n".join(cats) + "};"
                value = ('var value = feature.get("%s");' %
                         renderer.classAttribute())
                style = ('''var style = categories_%s[value]''' %
                         (safeName(layer.name())))
            elif isinstance(renderer, QgsGraduatedSymbolRendererV2):
                varName = "ranges_" + safeName(layer.name())
                defs += "var %s = [" % varName
                ranges = []
                for ran in renderer.ranges():
                    symbolstyle = getSymbolAsStyle(ran.symbol(), stylesFolder,
                                                   layer_alpha)
                    ranges.append('[%f, %f, %s]' % (ran.lowerValue(),
                                                    ran.upperValue(),
                                                    symbolstyle))
                defs += ",\n".join(ranges) + "];"
                value = ('var value = feature.get("%s");' %
                         renderer.classAttribute())
                style = '''var style = %(v)s[0][2];
    for (i = 0; i < %(v)s.length; i++){
        var range = %(v)s[i];
        if (value > range[0] && value<=range[1]){
            style =  range[2];
        }
    }''' % {"v": varName}
            else:
                style = ""
            if layer.customProperty("labeling/fontSize"):
                size = float(layer.customProperty("labeling/fontSize")) * 1.3
            else:
                size = 10
            r = layer.customProperty("labeling/textColorR")
            g = layer.customProperty("labeling/textColorG")
            b = layer.customProperty("labeling/textColorB")
            color = "rgba(%s, %s, %s, 255)" % (r, g, b)
            if style != "":
                style = '''function(feature, resolution){
    %(value)s
    %(style)s;
    if (%(label)s !== null) {
        var labelText = String(%(label)s);
    } else {
        var labelText = ""
    }
    var key = value + "_" + labelText

    if (!%(cache)s[key]){
        var text = new ol.style.Text({
              font: '%(size)spx Calibri,sans-serif',
              text: labelText,
              textBaseline: "center",
              textAlign: "left",
              offsetX: 5,
              offsetY: 3,
              fill: new ol.style.Fill({
                color: "%(color)s"
              }),
            });
        %(cache)s[key] = new ol.style.Style({"text": text})
    }
    var allStyles = [%(cache)s[key]];
    allStyles.push.apply(allStyles, style);
    return allStyles;
}''' % {
                    "style": style, "label": labelText,
                    "cache": "styleCache_" + safeName(layer.name()),
                    "size": size, "color": color, "value": value}
            else:
                style = "''"
        except Exception, e:
            style = """{
            /* """ + traceback.format_exc() + " */}"
            print traceback.format_exc()

        path = os.path.join(stylesFolder, safeName(layer.name()) + "_style.js")

        with codecs.open(path, "w", "utf-8") as f:
            f.write('''%(defs)s
var styleCache_%(name)s={}
var style_%(name)s = %(style)s;''' %
                    {"defs": defs, "name": safeName(layer.name()),
                     "style": style})
def exportStyles(layers, folder, clustered):
    stylesFolder = os.path.join(folder, "styles")
    QDir().mkpath(stylesFolder)
    legendFolder = os.path.join(stylesFolder, "legend")
    QDir().mkpath(legendFolder)
    vtStyles = {}
    mapUnitLayers = []
    for count, (layer, cluster) in enumerate(zip(layers, clustered)):
        sln = safeName(layer.name()) + "_" + unicode(count)
        if layer.type() != layer.VectorLayer:
            continue
        labelsEnabled = unicode(
            layer.customProperty("labeling/enabled")).lower() == "true"
        pattern = ""
        setPattern = ""
        vts = layer.customProperty("VectorTilesReader/vector_tile_url")
        labelText = getLabels(labelsEnabled, layer, folder, sln)
        defs = "var size = 0;\nvar placement = 'point';"
        try:
            renderer = layer.rendererV2()
            layer_alpha = layer.layerTransparency()
            if isinstance(renderer, QgsSingleSymbolRendererV2):
                (style, pattern, setPattern, value,
                 useMapUnits) = singleSymbol(renderer, stylesFolder,
                                             layer_alpha, sln, legendFolder,
                                             layer)
            elif isinstance(renderer, QgsCategorizedSymbolRendererV2):
                (style, pattern, setPattern, value, defs,
                 useMapUnits) = categorized(defs, sln, layer, renderer,
                                            legendFolder, stylesFolder,
                                            layer_alpha)
            elif isinstance(renderer, QgsGraduatedSymbolRendererV2):
                (style, pattern, setPattern, value,
                 useMapUnits) = graduated(layer, renderer, legendFolder, sln,
                                          stylesFolder, layer_alpha)
            elif isinstance(renderer, QgsRuleBasedRendererV2):
                (style, pattern, setPattern, value,
                 useMapUnits) = ruleBased(renderer, folder, stylesFolder,
                                          layer_alpha, sln, layer)
            else:
                style = """
    var style = [ new ol.style.Style({
        text: createTextStyle(feature, resolution, labelText, labelFont,
                              labelFill, placement)
    })];"""
                useMapUnits = False
            if useMapUnits:
                if vts is None:
                    mapUnitLayers.append(sln)
                else:
                    mapUnitLayers.append(safeName(vts))
            (labelRes, size, face, color) = getLabelFormat(layer)
            if style != "":
                geom = TYPE_MAP[layer.wkbType()].replace("Multi", "")
                style = getStyle(style, cluster, labelRes, labelText, sln,
                                 size, face, color, value, geom)
            else:
                style = "''"
        except Exception, e:
            style = ""
            QgsMessageLog.logMessage(traceback.format_exc(),
                                     "qgis2ol5",
                                     level=QgsMessageLog.CRITICAL)

        if vts is None:
            path = os.path.join(stylesFolder, sln + "_style.js")

            with codecs.open(path, "w", "utf-8") as f:
                f.write(
                    '''%(defs)s
%(pattern)s
var style_%(name)s = %(style)s;
%(setPattern)s''' % {
                        "defs": defs,
                        "pattern": pattern,
                        "name": sln,
                        "style": style,
                        "setPattern": setPattern
                    })
        elif style != "" and style != "''":
            new_vtStyle = "if (feature.get('layer') == "
            new_vtStyle += """'%s' && feature.getGeometry().getType() == '%s'){
            return %s(feature, resolution);
        }""" % (layer.name(), TYPE_MAP[layer.wkbType()].replace("Multi",
                                                                ""), style)
            try:
                old_vtStyles = vtStyles[vts]
                new_vtStyles = """%s
                %s""" % (old_vtStyles, new_vtStyle)
            except:
                new_vtStyles = new_vtStyle
            vtStyles[vts] = new_vtStyles
Example #35
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()}
Example #36
0
def exportStyles(layers, folder):
    stylesFolder = os.path.join(folder, "styles")
    QDir().mkpath(stylesFolder)
    for layer in layers:
        if layer.type() != layer.VectorLayer:
            continue
        labelsEnabled = str(
            layer.customProperty("labeling/enabled")).lower() == "true"
        if (labelsEnabled):
            labelField = layer.customProperty("labeling/fieldName")
            labelText = 'feature.get("%s")' % labelField
        else:
            labelText = '""'
        defs = ""
        try:
            renderer = layer.rendererV2()
            if isinstance(renderer, QgsSingleSymbolRendererV2):
                symbol = renderer.symbol()
                style = "var style = " + getSymbolAsStyle(symbol, stylesFolder)
                value = 'var value = ""'
            elif isinstance(renderer, QgsCategorizedSymbolRendererV2):
                defs += "var categories_%s = {" % safeName(layer.name())
                cats = []
                for cat in renderer.categories():
                    cats.append('"%s": %s' %
                                (cat.value(),
                                 getSymbolAsStyle(cat.symbol(), stylesFolder)))
                defs += ",\n".join(cats) + "};"
                value = 'var value = feature.get("%s");' % renderer.classAttribute(
                )
                style = '''var style = categories_%s[value]''' % (safeName(
                    layer.name()))
            elif isinstance(renderer, QgsGraduatedSymbolRendererV2):
                varName = "ranges_" + safeName(layer.name())
                defs += "var %s = [" % varName
                ranges = []
                for ran in renderer.ranges():
                    symbolstyle = getSymbolAsStyle(ran.symbol(), stylesFolder)
                    ranges.append(
                        '[%f, %f, %s]' %
                        (ran.lowerValue(), ran.upperValue(), symbolstyle))
                defs += ",\n".join(ranges) + "];"
                value = 'var value = feature.get("%s");' % renderer.classAttribute(
                )
                style = '''var style = %(v)s[0][2];
                            for (i = 0; i < %(v)s.length; i++){
                                var range = %(v)s[i];
                                if (value > range[0] && value<=range[1]){
                                    style =  range[2];
                                }
                            }
                            ''' % {
                    "v": varName
                }
            size = layer.customProperty("labeling/fontSize")
            r = layer.customProperty("labeling/textColorR")
            g = layer.customProperty("labeling/textColorG")
            b = layer.customProperty("labeling/textColorB")
            color = "rgba(%s, %s, %s, 255)" % (r, g, b)
            style = '''function(feature, resolution){
                        %(value)s
                        %(style)s;
                        var labelText = %(label)s;
                        var key = value + "_" + labelText

                        if (!%(cache)s[key]){
                            var text = new ol.style.Text({
                                  font: '%(size)spx Calibri,sans-serif',
                                  text: labelText,
                                  fill: new ol.style.Fill({
                                    color: "%(color)s"
                                  }),
                                });
                            %(cache)s[key] = new ol.style.Style({"text": text});
                        }
                        var allStyles = [%(cache)s[key]];
                        allStyles.push.apply(allStyles, style);
                        return allStyles;
                    }''' % {
                "style": style,
                "label": labelText,
                "cache": "styleCache_" + safeName(layer.name()),
                "size": size,
                "color": color,
                "value": value
            }
        except Exception, e:
            style = "{}"

        path = os.path.join(stylesFolder, safeName(layer.name()) + "_style.js")

        with open(path, "w") as f:
            f.write('''%(defs)s
                    var styleCache_%(name)s={}
                    var style_%(name)s = %(style)s;''' % {
                "defs": defs,
                "name": safeName(layer.name()),
                "style": style
            })
Example #37
0
def writeOL(iface, layers, groups, popup, visible,
            json, clustered, settings, folder):
    QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
    stamp = time.strftime("%Y_%m_%d-%H_%M_%S")
    folder = os.path.join(folder, 'qgis2web_' + unicode(stamp))
    try:
        dst = os.path.join(folder, "resources")
        if not os.path.exists(dst):
            shutil.copytree(os.path.join(os.path.dirname(__file__),
                                         "resources"),
                            dst)
        matchCRS = settings["Appearance"]["Match project CRS"]
        precision = settings["Data export"]["Precision"]
        optimize = settings["Data export"]["Minify GeoJSON files"]
        cleanUnusedFields = settings["Data export"]["Delete unused fields"]
        if not cleanUnusedFields:
            usedFields = [ALL_ATTRIBUTES] * len(popup)
        else:
            usedFields = popup
        exportLayers(iface, layers, folder, precision,
                     optimize, usedFields, json)
        exportStyles(layers, folder, clustered)
        writeLayersAndGroups(layers, groups, visible, folder,
                             settings, json, matchCRS, clustered)
        if settings["Data export"]["Mapping library location"] == "Local":
            cssAddress = """<link rel="stylesheet" """
            cssAddress += """href="./resources/ol.css" />"""
            jsAddress = """<script src="./resources/ol.js"></script>"""
        else:
            cssAddress = """<link rel="stylesheet" href="http://"""
            cssAddress += """openlayers.org/en/v3.12.1/css/ol.css" />"""
            jsAddress = """<script src="http://openlayers.org/en/v3.12.1/"""
            jsAddress += """build/ol.js"></script>"""
        geojsonVars = ""
        wfsVars = ""
        styleVars = ""
        for layer, encode2json in zip(layers, json):
            if layer.type() == layer.VectorLayer:
                if layer.providerType() != "WFS" or encode2json:
                    geojsonVars += ('<script src="layers/%s"></script>' %
                                    (safeName(layer.name()) + ".js"))
                else:
                    layerSource = layer.source()
                    if not matchCRS:
                        layerSource = re.sub('SRSNAME\=EPSG\:\d+',
                                             'SRSNAME=EPSG:3857', layerSource)
                    layerSource += "&outputFormat=text%2Fjavascript&"
                    layerSource += "format_options=callback%3A"
                    layerSource += "get" + safeName(layer.name()) + "Json"
                    wfsVars += ('<script src="%s"></script>' % layerSource)
                styleVars += ('<script src="styles/%s_style.js"></script>' %
                              (safeName(layer.name())))
        popupLayers = "popupLayers = [%s];" % ",".join(['"%s"' % field if (
            isinstance(field, basestring)) else
            unicode(field) for field in popup])
        controls = ['expandedAttribution']  # Check qgis2web.js 14:7
        if settings["Appearance"]["Add scale bar"]:
            controls.append("new ol.control.ScaleLine({})")
        if settings["Appearance"]["Add layers list"]:
            controls.append(
                'new ol.control.LayerSwitcher({tipLabel: "Layers"})')
        if settings["Appearance"]["Add measure tool"]:
            controls.append(
                'new measureControl()')
        pageTitle = QgsProject.instance().title()
        mapSettings = iface.mapCanvas().mapSettings()
        backgroundColor = """
    <style>
      html, body {{
          background-color: {bgcol};
        }}
    </style>
""".format(bgcol=mapSettings.backgroundColor().name())
        mapbounds = bounds(iface,
                           settings["Scale/Zoom"]["Extent"] == "Canvas extent",
                           layers,
                           settings["Appearance"]["Match project CRS"])
        mapextent = "extent: %s," % mapbounds if (
            settings["Scale/Zoom"]["Restrict to extent"]) else ""
        maxZoom = int(settings["Scale/Zoom"]["Max zoom level"])
        minZoom = int(settings["Scale/Zoom"]["Min zoom level"])
        popupsOnHover = settings["Appearance"]["Show popups on hover"]
        highlightFeatures = settings["Appearance"]["Highlight features"]
        onHover = unicode(popupsOnHover).lower()
        highlight = unicode(highlightFeatures).lower()
        highlightFill = mapSettings.selectionColor().name()
        proj4 = ""
        projdef = ""
        view = "%s maxZoom: %d, minZoom: %d" % (mapextent, maxZoom, minZoom)
        if settings["Appearance"]["Match project CRS"]:
            proj4 = """
<script src="http://cdnjs.cloudflare.com/ajax/libs/proj4js/2.3.6/proj4.js">"""
            proj4 += "</script>"
            projdef = "<script>proj4.defs('{epsg}','{defn}');</script>".format(
                epsg=mapSettings.destinationCrs().authid(),
                defn=mapSettings.destinationCrs().toProj4())
            view += ", projection: '%s'" % (
                mapSettings.destinationCrs().authid())
        if settings["Appearance"]["Add measure tool"]:
            measureControl = """
var measuring = false;
measureControl = function(opt_options) {

  var options = opt_options || {};

  var button = document.createElement('button');
  button.innerHTML = '<img src="resources/measure-control.png" />';

  var this_ = this;
  var handleMeasure = function(e) {
    if (!measuring) {
        this_.getMap().addInteraction(draw);
        measuring = true;
    } else {
        this_.getMap().removeInteraction(draw);
        measuring = false;
    }
  };

  button.addEventListener('click', handleMeasure, false);
  button.addEventListener('touchstart', handleMeasure, false);

  var element = document.createElement('div');
  element.className = 'measure-control ol-unselectable ol-control';
  element.appendChild(button);

  ol.control.Control.call(this, {
    element: element,
    target: options.target
  });

};
ol.inherits(measureControl, ol.control.Control);"""
            measuring = """
 if (evt.dragging) {
    return;
  }
  /** @type {string} */
    var helpMsg = 'Click to start drawing';

      if (sketch) {
        var geom = (sketch.getGeometry());
        if (geom instanceof ol.geom.Polygon) {
          helpMsg = continuePolygonMsg;
        } else if (geom instanceof ol.geom.LineString) {
          helpMsg = continueLineMsg;
        }
      }

      helpTooltipElement.innerHTML = helpMsg;
      helpTooltip.setPosition(evt.coordinate);
  document.getElementById('helpTooltipElement').removeClass('hidden');"""
            measure = """
/**
 * Currently drawn feature.
 * @type {ol.Feature}
 */
var sketch;


/**
 * The help tooltip element.
 * @type {Element}
 */
var helpTooltipElement;


/**
 * Overlay to show the help messages.
 * @type {ol.Overlay}
 */
var helpTooltip;


/**
 * The measure tooltip element.
 * @type {Element}
 */
var measureTooltipElement;


/**
 * Overlay to show the measurement.
 * @type {ol.Overlay}
 */
var measureTooltip;


/**
 * Message to show when the user is drawing a line.
 * @type {string}
 */
var continueLineMsg = 'Click to continue drawing the line';






var source = new ol.source.Vector();

var draw; // global so we can remove it later
function addInteraction() {
  var type = 'LineString';
  draw = new ol.interaction.Draw({
    source: source,
    type: /** @type {ol.geom.GeometryType} */ (type),
    style: new ol.style.Style({
      fill: new ol.style.Fill({
        color: 'rgba(255, 255, 255, 0.2)'
      }),
      stroke: new ol.style.Stroke({
        color: 'rgba(0, 0, 0, 0.5)',
        lineDash: [10, 10],
        width: 2
      }),
      image: new ol.style.Circle({
        radius: 5,
        stroke: new ol.style.Stroke({
          color: 'rgba(0, 0, 0, 0.7)'
        }),
        fill: new ol.style.Fill({
          color: 'rgba(255, 255, 255, 0.2)'
        })
      })
    })
  });
  //map.addInteraction(draw);

  createMeasureTooltip();
  createHelpTooltip();

  var listener;
  draw.on('drawstart',
      function(evt) {
        // set sketch
        sketch = evt.feature;

        /** @type {ol.Coordinate|undefined} */
        var tooltipCoord = evt.coordinate;

        listener = sketch.getGeometry().on('change', function(evt) {
          var geom = evt.target;
          var output;
            output = formatLength( /** @type {ol.geom.LineString} */ (geom));
            tooltipCoord = geom.getLastCoordinate();
          measureTooltipElement.innerHTML = output;
          measureTooltip.setPosition(tooltipCoord);
        });
      }, this);

  draw.on('drawend',
      function(evt) {
        measureTooltipElement.className = 'tooltip tooltip-static';
        measureTooltip.setOffset([0, -7]);
        // unset sketch
        sketch = null;
        // unset tooltip so that a new one can be created
        measureTooltipElement = null;
        createMeasureTooltip();
        ol.Observable.unByKey(listener);
      }, this);
}


/**
 * Creates a new help tooltip
 */
function createHelpTooltip() {
  if (helpTooltipElement) {
    helpTooltipElement.parentNode.removeChild(helpTooltipElement);
  }
  helpTooltipElement = document.createElement('div');
  helpTooltipElement.className = 'tooltip hidden';
  helpTooltip = new ol.Overlay({
    element: helpTooltipElement,
    offset: [15, 0],
    positioning: 'center-left'
  });
  map.addOverlay(helpTooltip);
}


/**
 * Creates a new measure tooltip
 */
function createMeasureTooltip() {
  if (measureTooltipElement) {
    measureTooltipElement.parentNode.removeChild(measureTooltipElement);
  }
  measureTooltipElement = document.createElement('div');
  measureTooltipElement.className = 'tooltip tooltip-measure';
  measureTooltip = new ol.Overlay({
    element: measureTooltipElement,
    offset: [0, -15],
    positioning: 'bottom-center'
  });
  map.addOverlay(measureTooltip);
}


/**
 * format length output
 * @param {ol.geom.LineString} line
 * @return {string}
 */
var formatLength = function(line) {
  var length;
    length = Math.round(line.getLength() * 100) / 100;
  var output;
  if (length > 100) {
    output = (Math.round(length / 1000 * 100) / 100) +
        ' ' + 'km';
  } else {
    output = (Math.round(length * 100) / 100) +
        ' ' + 'm';
  }
  return output;
};

addInteraction();"""
            measureStyle = """
<style>
.tooltip {
  position: relative;
  background: rgba(0, 0, 0, 0.5);
  border-radius: 4px;
  color: white;
  padding: 4px 8px;
  opacity: 0.7;
  white-space: nowrap;
}
.tooltip-measure {
  opacity: 1;
  font-weight: bold;
}
.tooltip-static {
  background-color: #ffcc33;
  color: black;
  border: 1px solid white;
}
.tooltip-measure:before,
.tooltip-static:before {
  border-top: 6px solid rgba(0, 0, 0, 0.5);
  border-right: 6px solid transparent;
  border-left: 6px solid transparent;
  content: "";
  position: absolute;
  bottom: -6px;
  margin-left: -7px;
  left: 50%;
}
.tooltip-static:before {
  border-top-color: #ffcc33;
}
.measure-control {
  top: 65px;
  left: .5em;
}
.ol-touch .measure-control {
  top: 80px;
}
</style>"""
        else:
            measureControl = ""
            measuring = ""
            measure = ""
            measureStyle = ""
        geolocate = geolocation(settings["Appearance"]["Geolocate user"])
        geocode = settings["Appearance"]["Add address search"]
        geocodingLinks = geocodeLinks(geocode)
        geocodingScript = geocodeScript(geocode)
        extracss = """
        <link rel="stylesheet" href="./resources/ol3-layerswitcher.css">
        <link rel="stylesheet" href="./resources/qgis2web.css">"""
        ol3layerswitcher = """
        <script src="./resources/ol3-layerswitcher.js"></script>"""
        ol3popup = """<div id="popup" class="ol-popup">
          <a href="#" id="popup-closer" class="ol-popup-closer"></a>
          <div id="popup-content"></div>
        </div>"""
        ol3qgis2webjs = """<script src="./resources/qgis2web.js"></script>"""
        ol3layers = """
        <script src="./layers/layers.js" type="text/javascript"></script>"""
        mapSize = iface.mapCanvas().size()
        values = {"@PAGETITLE@": pageTitle,
                  "@CSSADDRESS@": cssAddress,
                  "@EXTRACSS@": extracss,
                  "@JSADDRESS@": jsAddress,
                  "@MAP_WIDTH@": unicode(mapSize.width()) + "px",
                  "@MAP_HEIGHT@": unicode(mapSize.height()) + "px",
                  "@OL3_STYLEVARS@": styleVars,
                  "@OL3_BACKGROUNDCOLOR@": backgroundColor,
                  "@OL3_POPUP@": ol3popup,
                  "@OL3_GEOJSONVARS@": geojsonVars,
                  "@OL3_WFSVARS@": wfsVars,
                  "@OL3_PROJ4@": proj4,
                  "@OL3_PROJDEF@": projdef,
                  "@OL3_GEOCODINGLINKS@": geocodingLinks,
                  "@QGIS2WEBJS@": ol3qgis2webjs,
                  "@OL3_LAYERSWITCHER@": ol3layerswitcher,
                  "@OL3_LAYERS@": ol3layers,
                  "@OL3_MEASURESTYLE@": measureStyle,
                  "@LEAFLET_ADDRESSCSS@": "",
                  "@LEAFLET_MEASURECSS@": "",
                  "@LEAFLET_EXTRAJS@": "",
                  "@LEAFLET_ADDRESSJS@": "",
                  "@LEAFLET_MEASUREJS@": "",
                  "@LEAFLET_CRSJS@": "",
                  "@LEAFLET_CLUSTERCSS@": "",
                  "@LEAFLET_CLUSTERJS@": ""}
        with open(os.path.join(folder, "index.html"), "w") as f:
            htmlTemplate = settings["Appearance"]["Template"]
            if htmlTemplate == "":
                htmlTemplate = "basic"
            f.write(replaceInTemplate(htmlTemplate + ".html", values))
        values = {"@BOUNDS@": mapbounds,
                  "@CONTROLS@": ",".join(controls),
                  "@POPUPLAYERS@": popupLayers,
                  "@VIEW@": view,
                  "@ONHOVER@": onHover,
                  "@DOHIGHLIGHT@": highlight,
                  "@HIGHLIGHTFILL@": highlightFill,
                  "@GEOLOCATE@": geolocate,
                  "@GEOCODINGSCRIPT@": geocodingScript,
                  "@MEASURECONTROL@": measureControl,
                  "@MEASURING@": measuring,
                  "@MEASURE@": measure}
        with open(os.path.join(folder, "resources", "qgis2web.js"), "w") as f:
            f.write(replaceInScript("qgis2web.js", values))
    except Exception as e:
        print "FAIL"
        print traceback.format_exc()
    finally:
        QApplication.restoreOverrideCursor()
    return os.path.join(folder, "index.html")
                    })
        elif style != "" and style != "''":
            new_vtStyle = "if (feature.get('layer') == "
            new_vtStyle += """'%s' && feature.getGeometry().getType() == '%s'){
            return %s(feature, resolution);
        }""" % (layer.name(), TYPE_MAP[layer.wkbType()].replace("Multi",
                                                                ""), style)
            try:
                old_vtStyles = vtStyles[vts]
                new_vtStyles = """%s
                %s""" % (old_vtStyles, new_vtStyle)
            except:
                new_vtStyles = new_vtStyle
            vtStyles[vts] = new_vtStyles
    for k, v in vtStyles.items():
        styleName = safeName(k)
        styleString = v
        path = os.path.join(stylesFolder, styleName + "_style.js")

        with codecs.open(path, "w", "utf-8") as f:
            f.write(
                '''
var style_%(name)s = function(feature, resolution) {
    %(style)s;
}''' % {
                    "defs": defs,
                    "pattern": pattern,
                    "name": styleName,
                    "style": styleString,
                    "setPattern": setPattern
                })
Example #39
0
def writeOL(iface, layers, groups, popup, visible, json, clustered, settings,
            folder):
    QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
    stamp = time.strftime("%Y_%m_%d-%H_%M_%S")
    folder = os.path.join(folder, 'qgis2web_' + unicode(stamp))
    imagesFolder = os.path.join(folder, "images")
    QDir().mkpath(imagesFolder)
    try:
        dst = os.path.join(folder, "resources")
        if not os.path.exists(dst):
            shutil.copytree(
                os.path.join(os.path.dirname(__file__), "resources"), dst)
        matchCRS = settings["Appearance"]["Match project CRS"]
        precision = settings["Data export"]["Precision"]
        optimize = settings["Data export"]["Minify GeoJSON files"]
        exportLayers(iface, layers, folder, precision, optimize, popup, json)
        exportStyles(layers, folder, clustered)
        osmb = writeLayersAndGroups(layers, groups, visible, folder, popup,
                                    settings, json, matchCRS, clustered, iface)
        jsAddress = '<script src="resources/polyfills.js"></script>'
        if settings["Data export"]["Mapping library location"] == "Local":
            cssAddress = """<link rel="stylesheet" """
            cssAddress += """href="./resources/ol.css" />"""
            jsAddress += """
        <script src="./resources/ol.js"></script>"""
        else:
            cssAddress = """<link rel="stylesheet" href="http://"""
            cssAddress += """openlayers.org/en/v3.18.2/css/ol.css" />"""
            jsAddress += """
        <script src="http://openlayers.org/en/v3.18.2/"""
            jsAddress += """build/ol.js"></script>"""
        layerSearch = settings["Appearance"]["Layer search"]
        if layerSearch != "None" and layerSearch != "":
            cssAddress += """
        <link rel="stylesheet" href="resources/horsey.min.css">
        <link rel="stylesheet" href="resources/ol3-search-layer.min.css">"""
            jsAddress += """
        <script src="http://cdn.polyfill.io/v2/polyfill.min.js?features="""
            jsAddress += """Element.prototype.classList,URL"></script>
        <script src="resources/horsey.min.js"></script>
        <script src="resources/ol3-search-layer.min.js"></script>"""
            searchVals = layerSearch.split(": ")
            layerSearch = """
    var searchLayer = new ol.SearchLayer({{
      layer: lyr_{layer},
      colName: '{field}',
      zoom: 10,
      collapsed: true,
      map: map
    }});

    map.addControl(searchLayer);""".format(layer=searchVals[0],
                                           field=searchVals[1])
        else:
            layerSearch = ""
        if osmb != "":
            jsAddress += """
        <script src="resources/OSMBuildings-OL3.js"></script>"""
        geojsonVars = ""
        wfsVars = ""
        styleVars = ""
        for layer, encode2json in zip(layers, json):
            if layer.type() == layer.VectorLayer:
                if layer.providerType() != "WFS" or encode2json:
                    geojsonVars += ('<script src="layers/%s"></script>' %
                                    (safeName(layer.name()) + ".js"))
                else:
                    layerSource = layer.source()
                    if "retrictToRequestBBOX" in layerSource:
                        provider = layer.dataProvider()
                        uri = QgsDataSourceURI(provider.dataSourceUri())
                        wfsURL = uri.param("url")
                        wfsTypename = uri.param("typename")
                        wfsSRS = uri.param("srsname")
                        layerSource = wfsURL
                        layerSource += "?SERVICE=WFS&VERSION=1.0.0&"
                        layerSource += "REQUEST=GetFeature&TYPENAME="
                        layerSource += wfsTypename
                        layerSource += "&SRSNAME="
                        layerSource += wfsSRS
                    if not matchCRS:
                        layerSource = re.sub('SRSNAME\=EPSG\:\d+',
                                             'SRSNAME=EPSG:3857', layerSource)
                    layerSource += "&outputFormat=text%2Fjavascript&"
                    layerSource += "format_options=callback%3A"
                    layerSource += "get" + safeName(layer.name()) + "Json"
                    wfsVars += ('<script src="%s"></script>' % layerSource)
                styleVars += ('<script src="styles/%s_style.js"></script>' %
                              (safeName(layer.name())))
        popupLayers = "popupLayers = [%s];" % ",".join(
            ['1' for field in popup])
        controls = ['expandedAttribution']
        project = QgsProject.instance()
        if project.readBoolEntry("ScaleBar", "/Enabled", False)[0]:
            controls.append("new ol.control.ScaleLine({})")
        if settings["Appearance"]["Add layers list"]:
            controls.append(
                'new ol.control.LayerSwitcher({tipLabel: "Layers"})')
        if settings["Appearance"]["Measure tool"] != "None":
            controls.append('new measureControl()')
        if settings["Appearance"]["Geolocate user"]:
            controls.append('new geolocateControl()')
        pageTitle = project.title()
        mapSettings = iface.mapCanvas().mapSettings()
        backgroundColor = """
        <style>
        html, body {{
            background-color: {bgcol};
        }}
        </style>
""".format(bgcol=mapSettings.backgroundColor().name())
        geolocateUser = settings["Appearance"]["Geolocate user"]
        backgroundColor += geolocateStyle(geolocateUser)
        mapbounds = bounds(iface,
                           settings["Scale/Zoom"]["Extent"] == "Canvas extent",
                           layers, settings["Appearance"]["Match project CRS"])
        mapextent = "extent: %s," % mapbounds if (
            settings["Scale/Zoom"]["Restrict to extent"]) else ""
        maxZoom = int(settings["Scale/Zoom"]["Max zoom level"])
        minZoom = int(settings["Scale/Zoom"]["Min zoom level"])
        popupsOnHover = settings["Appearance"]["Show popups on hover"]
        highlightFeatures = settings["Appearance"]["Highlight on hover"]
        onHover = unicode(popupsOnHover).lower()
        highlight = unicode(highlightFeatures).lower()
        highlightFill = mapSettings.selectionColor().name()
        proj4 = ""
        proj = ""
        view = "%s maxZoom: %d, minZoom: %d" % (mapextent, maxZoom, minZoom)
        if settings["Appearance"]["Match project CRS"]:
            proj4 = """
<script src="http://cdnjs.cloudflare.com/ajax/libs/proj4js/2.3.6/proj4.js">"""
            proj4 += "</script>"
            proj = "<script>proj4.defs('{epsg}','{defn}');</script>".format(
                epsg=mapSettings.destinationCrs().authid(),
                defn=mapSettings.destinationCrs().toProj4())
            view += ", projection: '%s'" % (
                mapSettings.destinationCrs().authid())
        if settings["Appearance"]["Measure tool"] != "None":
            measureControl = measureControlScript()
            measuring = measuringScript()
            measure = measureScript()
            if settings["Appearance"]["Measure tool"] == "Imperial":
                measureUnit = measureUnitFeetScript()
            else:
                measureUnit = measureUnitMetricScript()
            measureStyle = measureStyleScript()
        else:
            measureControl = ""
            measuring = ""
            measure = ""
            measureUnit = ""
            measureStyle = ""
        geolocateHead = geolocationHead(geolocateUser)
        geolocate = geolocation(geolocateUser)
        geocode = settings["Appearance"]["Add address search"]
        geocodingLinks = geocodeLinks(geocode)
        geocodingScript = geocodeScript(geocode)
        extracss = """
        <link rel="stylesheet" href="./resources/ol3-layerswitcher.css">
        <link rel="stylesheet" href="./resources/qgis2web.css">"""
        if settings["Appearance"]["Geolocate user"]:
            extracss += """
        <link rel="stylesheet" href="http://maxcdn.bootstrapcdn.com/"""
            extracss += """font-awesome/4.6.3/css/font-awesome.min.css">"""
        ol3layerswitcher = """
        <script src="./resources/ol3-layerswitcher.js"></script>"""
        ol3popup = """<div id="popup" class="ol-popup">
                <a href="#" id="popup-closer" class="ol-popup-closer"></a>
                <div id="popup-content"></div>
            </div>"""
        ol3qgis2webjs = """<script src="./resources/qgis2web.js"></script>
        <script src="./resources/Autolinker.min.js"></script>"""
        if osmb != "":
            ol3qgis2webjs += """
        <script>{osmb}</script>""".format(osmb=osmb)
        ol3layers = """
        <script src="./layers/layers.js" type="text/javascript"></script>"""
        mapSize = iface.mapCanvas().size()
        values = {
            "@PAGETITLE@": pageTitle,
            "@CSSADDRESS@": cssAddress,
            "@EXTRACSS@": extracss,
            "@JSADDRESS@": jsAddress,
            "@MAP_WIDTH@": unicode(mapSize.width()) + "px",
            "@MAP_HEIGHT@": unicode(mapSize.height()) + "px",
            "@OL3_STYLEVARS@": styleVars,
            "@OL3_BACKGROUNDCOLOR@": backgroundColor,
            "@OL3_POPUP@": ol3popup,
            "@OL3_GEOJSONVARS@": geojsonVars,
            "@OL3_WFSVARS@": wfsVars,
            "@OL3_PROJ4@": proj4,
            "@OL3_PROJDEF@": proj,
            "@OL3_GEOCODINGLINKS@": geocodingLinks,
            "@QGIS2WEBJS@": ol3qgis2webjs,
            "@OL3_LAYERSWITCHER@": ol3layerswitcher,
            "@OL3_LAYERS@": ol3layers,
            "@OL3_MEASURESTYLE@": measureStyle,
            "@LEAFLET_ADDRESSCSS@": "",
            "@LEAFLET_MEASURECSS@": "",
            "@LEAFLET_EXTRAJS@": "",
            "@LEAFLET_ADDRESSJS@": "",
            "@LEAFLET_MEASUREJS@": "",
            "@LEAFLET_CRSJS@": "",
            "@LEAFLET_LAYERSEARCHCSS@": "",
            "@LEAFLET_LAYERSEARCHJS@": "",
            "@LEAFLET_CLUSTERCSS@": "",
            "@LEAFLET_CLUSTERJS@": ""
        }
        with open(os.path.join(folder, "index.html"), "w") as f:
            htmlTemplate = settings["Appearance"]["Template"]
            if htmlTemplate == "":
                htmlTemplate = "basic"
            templateOutput = replaceInTemplate(htmlTemplate + ".html", values)
            templateOutput = re.sub('\n[\s_]+\n', '\n', templateOutput)
            f.write(templateOutput)
        values = {
            "@GEOLOCATEHEAD@": geolocateHead,
            "@BOUNDS@": mapbounds,
            "@CONTROLS@": ",".join(controls),
            "@POPUPLAYERS@": popupLayers,
            "@VIEW@": view,
            "@LAYERSEARCH@": layerSearch,
            "@ONHOVER@": onHover,
            "@DOHIGHLIGHT@": highlight,
            "@HIGHLIGHTFILL@": highlightFill,
            "@GEOLOCATE@": geolocate,
            "@GEOCODINGSCRIPT@": geocodingScript,
            "@MEASURECONTROL@": measureControl,
            "@MEASURING@": measuring,
            "@MEASURE@": measure,
            "@MEASUREUNIT@": measureUnit
        }
        with open(os.path.join(folder, "resources", "qgis2web.js"), "w") as f:
            f.write(replaceInScript("qgis2web.js", values))
    except Exception as e:
        print "FAIL"
        print traceback.format_exc()
    finally:
        QApplication.restoreOverrideCursor()
    return os.path.join(folder, "index.html")
Example #40
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
Example #41
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()
            }
    def writeLeaflet(cls, iface, feedback, folder, layer_list, visible,
                     cluster, json, getFeatureInfo, params, popup):
        outputProjectFileName = folder
        QApplication.setOverrideCursor(QCursor(Qt.WaitCursor))
        legends = {}
        mapUnitLayers = []
        canvas = iface.mapCanvas()
        project = QgsProject.instance()
        mapSettings = canvas.mapSettings()
        title = project.title()
        pluginDir = os.path.dirname(os.path.realpath(__file__))
        stamp = datetime.now().strftime("%Y_%m_%d-%H_%M_%S_%f")
        outputProjectFileName = os.path.join(outputProjectFileName,
                                             'qgis2ol5_' + unicode(stamp))
        outputIndex = os.path.join(outputProjectFileName, 'index.html')

        mapLibLocation = params["Data export"]["Mapping library location"]
        minify = params["Data export"]["Minify GeoJSON files"]
        precision = params["Data export"]["Precision"]
        debugLibs = params["Data export"]["Use debug libraries"]
        extent = params["Scale/Zoom"]["Extent"]
        minZoom = params["Scale/Zoom"]["Min zoom level"]
        maxZoom = params["Scale/Zoom"]["Max zoom level"]
        restrictToExtent = params["Scale/Zoom"]["Restrict to extent"]
        basemapList = params["Appearance"]["Base layer"]
        matchCRS = params["Appearance"]["Match project CRS"]
        addressSearch = params["Appearance"]["Add address search"]
        locate = params["Appearance"]["Geolocate user"]
        measure = params["Appearance"]["Measure tool"]
        highlight = params["Appearance"]["Highlight on hover"]
        layerSearch = params["Appearance"]["Layer search"]
        popupsOnHover = params["Appearance"]["Show popups on hover"]
        template = params["Appearance"]["Template"]

        usedFields = [ALL_ATTRIBUTES] * len(popup)

        QgsApplication.initQgis()

        dataStore, cssStore = writeFoldersAndFiles(
            pluginDir, feedback, outputProjectFileName, cluster, measure,
            matchCRS, layerSearch, canvas, mapLibLocation, addressSearch,
            locate, debugLibs)
        writeCSS(cssStore, mapSettings.backgroundColor().name(), feedback)

        wfsLayers = ""
        labelCode = ""
        vtStyles = {}
        useMultiStyle = False
        useHeat = False
        useVT = False
        useShapes = False
        useOSMB = False
        useWMS = False
        useWMTS = False
        useRaster = False
        scaleDependentLayers = ""
        labelVisibility = ""
        new_src = ""
        jsons = ""
        crs = QgsCoordinateReferenceSystem.EpsgCrsId
        exp_crs = QgsCoordinateReferenceSystem(4326, crs)
        lyrCount = 0
        for layer, jsonEncode, eachPopup, clst in zip(layer_list, json, popup,
                                                      cluster):
            rawLayerName = layer.name()
            safeLayerName = safeName(rawLayerName) + "_" + unicode(lyrCount)
            vts = layer.customProperty("VectorTilesReader/vector_tile_url")
            if layer.providerType() != 'WFS' or jsonEncode is True:
                if layer.type() == QgsMapLayer.VectorLayer and vts is None:
                    feedback.showFeedback('Exporting %s to JSON...' %
                                          layer.name())
                    exportVector(layer, safeLayerName, dataStore,
                                 restrictToExtent, iface, extent, precision,
                                 exp_crs, minify)
                    jsons += jsonScript(safeLayerName)
                    scaleDependentLabels =\
                        scaleDependentLabelScript(layer, safeLayerName)
                    labelVisibility += scaleDependentLabels
                    feedback.completeStep()

                elif layer.type() == QgsMapLayer.RasterLayer:
                    if layer.dataProvider().name() != "wms":
                        layersFolder = os.path.join(outputProjectFileName,
                                                    "data")
                        exportRaster(layer, lyrCount, layersFolder, feedback,
                                     iface, matchCRS)
            if layer.hasScaleBasedVisibility():
                scaleDependentLayers += scaleDependentLayerScript(
                    layer, safeLayerName, clst)
            lyrCount += 1
        if scaleDependentLayers != "":
            scaleDependentLayers = scaleDependentScript(scaleDependentLayers)

        crsSrc = mapSettings.destinationCrs()
        crsAuthId = crsSrc.authid()
        crsProj4 = crsSrc.toProj4()
        middle = """
        """
        if highlight or popupsOnHover:
            selectionColor = mapSettings.selectionColor().name()
            middle += highlightScript(highlight, popupsOnHover, selectionColor)
        if extent == "Canvas extent":
            pt0 = canvas.extent()
            crsDest = QgsCoordinateReferenceSystem(4326)
            xform = QgsCoordinateTransform(crsSrc, crsDest)
            pt1 = xform.transform(pt0)
            bbox_canvas = [
                pt1.yMinimum(),
                pt1.yMaximum(),
                pt1.xMinimum(),
                pt1.xMaximum()
            ]
            bounds = '[[' + unicode(pt1.yMinimum()) + ','
            bounds += unicode(pt1.xMinimum()) + '],['
            bounds += unicode(pt1.yMaximum()) + ','
            bounds += unicode(pt1.xMaximum()) + ']]'
            if matchCRS and crsAuthId != 'EPSG:4326':
                middle += crsScript(crsAuthId, crsProj4)
        else:
            bounds = 0
            if matchCRS and crsAuthId != 'EPSG:4326':
                middle += crsScript(crsAuthId, crsProj4)
        middle += mapScript(extent, matchCRS, crsAuthId, measure, maxZoom,
                            minZoom, bounds, locate)
        middle += featureGroupsScript()
        if (len(basemapList) == 0 or matchCRS):
            basemapText = ""
        else:
            basemapText = basemapsScript(basemapList, maxZoom)
        extentCode = extentScript(extent, restrictToExtent)
        new_src += middle
        new_src += basemapText
        new_src += extentCode

        for count, layer in enumerate(layer_list):
            rawLayerName = layer.name()
            safeLayerName = safeName(rawLayerName) + "_" + unicode(count)
            if layer.type() == QgsMapLayer.VectorLayer:
                (new_src, legends, wfsLayers, labelCode, vtStyles, useMapUnits,
                 useMultiStyle, useHeat, useVT,
                 useShapes, useOSMB) = writeVectorLayer(
                     layer, safeLayerName, usedFields[count], highlight,
                     popupsOnHover, popup[count], outputProjectFileName,
                     wfsLayers, cluster[count], visible[count], json[count],
                     legends, new_src, canvas, count, restrictToExtent, extent,
                     feedback, labelCode, vtStyles, useMultiStyle, useHeat,
                     useVT, useShapes, useOSMB)
                if useMapUnits:
                    mapUnitLayers.append(safeLayerName)
            elif layer.type() == QgsMapLayer.RasterLayer:
                if layer.dataProvider().name() == "wms":
                    feedback.showFeedback('Writing %s as WMS layer...' %
                                          layer.name())
                    new_obj, useWMS, useWMTS = wmsScript(
                        layer, safeLayerName, useWMS, useWMTS,
                        getFeatureInfo[count])
                    feedback.completeStep()
                else:
                    useRaster = True
                    feedback.showFeedback('Writing %s as raster layer...' %
                                          layer.name())
                    new_obj = rasterScript(layer, safeLayerName)
                    feedback.completeStep()
                if visible[count]:
                    new_obj += """
        map.addLayer(overlay_""" + safeLayerName + """);"""
                new_src += new_obj
        the_src = new_src
        new_src = jsons + """
        <script>"""
        if len(mapUnitLayers) > 0:
            new_src += """
        var m2px = 1;
        function newM2px() {
            var centerLatLng = map.getCenter();
            var pointC = map.latLngToContainerPoint(centerLatLng);
            var pointX = [pointC.x + 100, pointC.y];

            var latLngC = map.containerPointToLatLng(pointC);
            var latLngX = map.containerPointToLatLng(pointX);

            var distanceX = latLngC.distanceTo(latLngX)/100;

            reciprocal = 1 / distanceX;
            m2px = reciprocal;
        }
        function geoStyle(m) {
            return Math.ceil(m * m2px);
        }"""
        new_src += getVTStyles(vtStyles)
        new_src += the_src + scaleDependentLayers
        if title != "":
            titleStart = unicode(titleSubScript(title).decode("utf-8"))
            new_src += unicode(titleStart)
        if addressSearch:
            address_text = addressSearchScript()
            new_src += address_text

        if (params["Appearance"]["Add layers list"]
                and params["Appearance"]["Add layers list"] != ""
                and params["Appearance"]["Add layers list"] != "None"):
            new_src += addLayersList(
                basemapList, matchCRS, layer_list, cluster, legends,
                params["Appearance"]["Add layers list"] == "Expanded")
        if project.readBoolEntry("ScaleBar", "/Enabled", False)[0]:
            placement = project.readNumEntry("ScaleBar", "/Placement", 0)[0]
            placement = PLACEMENT[placement]
            end = scaleBar(placement)
        else:
            end = ''
        layerType = "layer"
        try:
            if cluster[count]:
                layerType = "cluster"
        except:
            pass
        searchLayer = "%s_%s" % (layerType,
                                 params["Appearance"]["Search layer"])
        labelList = []
        for count, layer in enumerate(layer_list):
            vts = layer.customProperty("VectorTilesReader/vector_tile_url")
            safeLayerName = re.sub(r'[\W_]+', '',
                                   layer.name()) + "_" + unicode(count)
            if (layer.type() == QgsMapLayer.VectorLayer and vts is None):
                palyr = QgsPalLayerSettings()
                palyr.readFromLayer(layer)
                if palyr.enabled and palyr.fieldName and palyr.fieldName != "":
                    labelList.append("layer_%s" % safeLayerName)
        labelsList = ",".join(labelList)
        end += endHTMLscript(wfsLayers, layerSearch, labelCode,
                             labelVisibility, searchLayer, useHeat, useRaster,
                             labelsList, mapUnitLayers)
        new_src += end
        try:
            writeHTMLstart(outputIndex, title, cluster, addressSearch, measure,
                           matchCRS, layerSearch, canvas, mapLibLocation,
                           locate, new_src, template, feedback, debugLibs,
                           useMultiStyle, useHeat, useShapes, useOSMB, useWMS,
                           useWMTS, useVT)
        except Exception as e:
            QgsMessageLog.logMessage(traceback.format_exc(),
                                     "qgis2ol5",
                                     level=QgsMessageLog.CRITICAL)
            QApplication.restoreOverrideCursor()
        finally:
            QApplication.restoreOverrideCursor()
        return outputIndex
Example #43
0
def exportStyles(layers, folder, clustered):
    stylesFolder = os.path.join(folder, "styles")
    QDir().mkpath(stylesFolder)
    for layer, cluster in zip(layers, clustered):
        if layer.type() != layer.VectorLayer:
            continue
        labelsEnabled = unicode(
            layer.customProperty("labeling/enabled")).lower() == "true"
        if (labelsEnabled):
            labelField = layer.customProperty("labeling/fieldName")
            if labelField != "":
                fieldIndex = layer.pendingFields().indexFromName(labelField)
                try:
                    editFormConfig = layer.editFormConfig()
                    editorWidget = editFormConfig.widgetType(fieldIndex)
                except:
                    editorWidget = layer.editorWidgetV2(fieldIndex)
                if (editorWidget == QgsVectorLayer.Hidden
                        or editorWidget == 'Hidden'):
                    labelField = "q2wHide_" + labelField
                labelText = ('feature.get("%s")' %
                             labelField.replace('"', '\\"'))
            else:
                labelText = '""'
        else:
            labelText = '""'
        defs = "var size = 0;\n"
        try:
            renderer = layer.rendererV2()
            layer_alpha = layer.layerTransparency()
            if (isinstance(renderer, QgsSingleSymbolRendererV2)
                    or isinstance(renderer, QgsRuleBasedRendererV2)):
                if isinstance(renderer, QgsRuleBasedRendererV2):
                    symbol = renderer.rootRule().children()[0].symbol()
                else:
                    symbol = renderer.symbol()
                if cluster:
                    style = "var size = feature.get('features').length;\n"
                else:
                    style = "var size = 0;\n"
                style += "    var style = " + getSymbolAsStyle(
                    symbol, stylesFolder, layer_alpha)
                value = 'var value = ""'
            elif isinstance(renderer, QgsCategorizedSymbolRendererV2):
                defs += """function categories_%s(feature, value) {
                switch(value) {""" % safeName(layer.name())
                cats = []
                for cat in renderer.categories():
                    cats.append('''case "%s":
                    return %s;
                    break;''' % (cat.value(),
                                 getSymbolAsStyle(cat.symbol(), stylesFolder,
                                                  layer_alpha)))
                defs += "\n".join(cats) + "}};"
                classAttr = renderer.classAttribute()
                fieldIndex = layer.pendingFields().indexFromName(classAttr)
                try:
                    editFormConfig = layer.editFormConfig()
                    editorWidget = editFormConfig.widgetType(fieldIndex)
                except:
                    editorWidget = layer.editorWidgetV2(fieldIndex)
                if (editorWidget == QgsVectorLayer.Hidden
                        or editorWidget == 'Hidden'):
                    classAttr = "q2wHide_" + classAttr
                value = ('var value = feature.get("%s");' % classAttr)
                style = ('''var style = categories_%s(feature, value)''' %
                         (safeName(layer.name())))
            elif isinstance(renderer, QgsGraduatedSymbolRendererV2):
                varName = "ranges_" + safeName(layer.name())
                defs += "var %s = [" % varName
                ranges = []
                for ran in renderer.ranges():
                    symbolstyle = getSymbolAsStyle(ran.symbol(), stylesFolder,
                                                   layer_alpha)
                    ranges.append(
                        '[%f, %f, %s]' %
                        (ran.lowerValue(), ran.upperValue(), symbolstyle))
                defs += ",\n".join(ranges) + "];"
                classAttr = renderer.classAttribute()
                fieldIndex = layer.pendingFields().indexFromName(classAttr)
                try:
                    editFormConfig = layer.editFormConfig()
                    editorWidget = editFormConfig.widgetType(fieldIndex)
                except:
                    editorWidget = layer.editorWidgetV2(fieldIndex)
                if (editorWidget == QgsVectorLayer.Hidden
                        or editorWidget == 'Hidden'):
                    classAttr = "q2wHide_" + classAttr
                value = ('var value = feature.get("%s");' % classAttr)
                style = '''var style = %(v)s[0][2];
    for (i = 0; i < %(v)s.length; i++){
        var range = %(v)s[i];
        if (value > range[0] && value<=range[1]){
            style =  range[2];
        }
    }''' % {
                    "v": varName
                }
            else:
                style = ""
            if layer.customProperty("labeling/fontSize"):
                size = float(layer.customProperty("labeling/fontSize")) * 1.3
            else:
                size = 10
            italic = layer.customProperty("labeling/fontItalic")
            bold = layer.customProperty("labeling/fontWeight")
            r = layer.customProperty("labeling/textColorR")
            g = layer.customProperty("labeling/textColorG")
            b = layer.customProperty("labeling/textColorB")
            color = "rgba(%s, %s, %s, 255)" % (r, g, b)
            face = layer.customProperty("labeling/fontFamily")
            palyr = QgsPalLayerSettings()
            palyr.readFromLayer(layer)
            sv = palyr.scaleVisibility
            if sv:
                min = float(palyr.scaleMin)
                max = float(palyr.scaleMax)
                min = 1 / ((1 / min) * 39.37 * 90.7)
                max = 1 / ((1 / max) * 39.37 * 90.7)
                labelRes = " && resolution > %(min)d " % {"min": min}
                labelRes += "&& resolution < %(max)d" % {"max": max}
            else:
                labelRes = ""
            buffer = palyr.bufferDraw
            if buffer:
                bufferColor = palyr.bufferColor.name()
                bufferWidth = palyr.bufferSize
                stroke = """
              stroke: new ol.style.Stroke({
                color: "%s",
                width: %d
              }),""" % (bufferColor, bufferWidth)
            else:
                stroke = ""
            if style != "":
                style = '''function(feature, resolution){
    %(value)s
    %(style)s;
    if (%(label)s !== null%(labelRes)s) {
        var labelText = String(%(label)s);
    } else {
        var labelText = ""
    }
    var key = value + "_" + labelText

    if (!%(cache)s[key]){
        var text = new ol.style.Text({
              font: '%(size)spx \\'%(face)s\\', sans-serif',
              text: labelText,
              textBaseline: "center",
              textAlign: "left",
              offsetX: 5,
              offsetY: 3,
              fill: new ol.style.Fill({
                color: "%(color)s"
              }),%(stroke)s
            });
        %(cache)s[key] = new ol.style.Style({"text": text})
    }
    var allStyles = [%(cache)s[key]];
    allStyles.push.apply(allStyles, style);
    return allStyles;
}''' % {
                    "style": style,
                    "labelRes": labelRes,
                    "label": labelText,
                    "cache": "styleCache_" + safeName(layer.name()),
                    "size": size,
                    "face": face,
                    "color": color,
                    "stroke": stroke,
                    "value": value
                }
            else:
                style = "''"
        except Exception, e:
            style = """{
            /* """ + traceback.format_exc() + " */}"
            print traceback.format_exc()

        path = os.path.join(stylesFolder, safeName(layer.name()) + "_style.js")

        with codecs.open(path, "w", "utf-8") as f:
            f.write('''%(defs)s
var styleCache_%(name)s={}
var style_%(name)s = %(style)s;''' % {
                "defs": defs,
                "name": safeName(layer.name()),
                "style": style
            })