Ejemplo n.º 1
0
def createAndParseSld(qgisLayerItem):
    document = QDomDocument()
    header = document.createProcessingInstruction(
        'xml', 'version=\'1.0\' encoding=\'UTF-8\'')
    document.appendChild(header)
    root = document.createElementNS('http://www.opengis.net/sld',
                                    'StyledLayerDescriptor')
    root.setAttribute('version', '1.0.0')
    root.setAttribute('xmlns:ogc', 'http://www.opengis.net/ogc')
    root.setAttribute('xmlns:sld', 'http://www.opengis.net/sld')
    root.setAttribute('xmlns:gml', 'http://www.opengis.net/gml')
    document.appendChild(root)

    namedLayerNode = document.createElement('sld:NamedLayer')
    root.appendChild(namedLayerNode)

    qgisLayerItem.layer.writeSld(namedLayerNode, document,
                                 '')  ## TODO: if could not be created...

    nameNode = namedLayerNode.firstChildElement('se:Name')
    oldNameText = nameNode.firstChild()
    newname = qgisLayerItem.parentShogunLayer.source['layerNames']
    newNameText = document.createTextNode(newname)
    nameNode.appendChild(newNameText)
    nameNode.removeChild(oldNameText)

    userStyleNode = namedLayerNode.firstChildElement('UserStyle')
    userStyleNameNode = userStyleNode.firstChildElement('se:Name')
    userStyleNameText = userStyleNameNode.firstChild()
    userStyleNameNode.removeChild(userStyleNameText)
    userStyleNameNode.appendChild(
        document.createTextNode(qgisLayerItem.stylename))

    titleNode = document.createElement('sld:Title')
    title = document.createTextNode('A QGIS-Style for ' +
                                    qgisLayerItem.layer.name())
    titleNode.appendChild(title)
    userStyleNode.appendChild(titleNode)
    defaultNode = document.createElement('sld:IsDefault')
    defaultNode.appendChild(document.createTextNode('1'))
    userStyleNode.appendChild(defaultNode)

    featureTypeStyleNode = userStyleNode.firstChildElement(
        'se:FeatureTypeStyle')
    featureTypeStyleNameNode = document.createElement('sld:Name')
    featureTypeStyleNameNode.appendChild(document.createTextNode('name'))
    featureTypeStyleNode.appendChild(featureTypeStyleNameNode)

    rules = featureTypeStyleNode.elementsByTagName('se:Rule')
    for x in range(rules.length()):
        rule = rules.at(x)
        rule.removeChild(rule.firstChildElement('se:Description'))

    # Check if custom icons are used in symbology and replace the text:
    # search if tag 'se:OnlineResource' is in the sld document
    listOfGraphics = rule.toElement().elementsByTagName('se:OnlineResource')
    if not listOfGraphics.isEmpty():
        for x in range(listOfGraphics.length()):
            graphicNode = listOfGraphics.at(x)
            currentIcon = graphicNode.attributes().namedItem(
                'xlink:href').nodeValue()
            iconUrl = qgisLayerItem.ressource.prepareIconForUpload(currentIcon)
            graphicNode.toElement().setAttribute('xlink:href', iconUrl)
            graphicNode.toElement().setAttribute(
                'xmlns:xlink', 'http://www.w3.org/1999/xlink')

    sld = document.toString()

    if qgisLayerItem.layer.labelsEnabled():
        labelSld = getLabelingAsSld(qgisLayerItem.layer)
        sld = sld.replace('</se:Rule>', labelSld + '</se:Rule>')

    sld = sld.replace('ogc:Filter xmlns:ogc="http://www.opengis.net/ogc"',
                      'ogc:Filter')

    # the following fixes weird problems with the sld compability with the
    # shogun webapp
    sld = sld.replace('<ogc:And>', '')
    sld = sld.replace('</ogc:And>', '')
    sld = sld.replace('<se:Name> ', '<se:Name>')
    sld = sld.replace(' </se:Name>', '</se:Name>')

    sld = sld.replace('StyledLayerDescriptor', 'sld:StyledLayerDescriptor')
    sld = sld.replace('UserStyle', 'sld:UserStyle')
    sld = sld.replace('se:', 'sld:')
    sld = sld.replace('SvgParameter', 'CssParameter')
    sld = sld.replace('\n', '')
    sld = sld.replace('\t', '')

    return sld