2 votos

Leer el estilo Sld en pyQGIS

Estoy tratando de establecer el estilo de una capa usando pyQGIS. Mi idea principal era establecer el estilo desde una cadena, pero lamentablemente sólo puedo hacerlo desde un archivo. Este código funciona de maravilla:

        filename= QDir.tempPath() + "/style.sld"
        f = open(filename,'w')

        if os.path.exists(filename):

            f.write(style)
            f.close()
            ret=layer.loadSldStyle(filename)

            if ret:
                self.log(logging.DEBUG, "Style loaded")
            else:
                self.log(logging.DEBUG, "Style not loaded: " + errorMsg)

            os.remove(filename)

Como puede ver, estoy escribiendo el style en un archivo temporal, cargando el estilo y luego eliminándolo. Lo que me gustaría hacer en su lugar es pasar la cadena directamente al readSld que se envuelve en loadSldStyle :

        d = QDomDocument()
        ret=d.setContent(style)

        if ret:
            self.log(logging.DEBUG, "Document created")
        else:
            self.log(logging.DEBUG, "Document not created")

        self.log(logging.DEBUG, "content: " + d.toString())

        myRoot=d.firstChildElement
         ("StyledLayerDescriptor")

        if myRoot is None:
            self.log(logging.ERROR,  u"Could not get "
                "root element")
            return

        namedLayerElem=myRoot.firstChildElement
         ("namedLayerElem")

        if namedLayerElem is None:
            self.log(logging.ERROR,  u"Could not find "
                "NamedLayer")
            return

        errorMsg = str("")
        ret=layer.readSld(namedLayerElem,errorMsg)

Tenga en cuenta que esto es muy similar al código C++ para el método loadSldStyle en el QgsMapLayer implementación de la clase

El QDomDocument contiene el estilo correcto, y el myRoot y namedLayerElem los nodos se crean correctamente. No obstante, readSld devuelve false, y lo peor de todo es que la cadena de error está vacía, así que no tengo ni idea de lo que está pasando. ¿Algún consejo sobre cuál puede ser el problema? Sé que esta función ha sido portado a sip.

1voto

Adam Puntos 476

La función readSld tiene la firma

virtual bool    readSld (const QDomNode &node, QString &errorMessage)

Así que no veo por qué su código no debería funcionar, tal vez usted podría tratar de pasar la raíz?

layer.readSld(myRoot)

i-Ciencias.com

I-Ciencias es una comunidad de estudiantes y amantes de la ciencia en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X