コード例 #1
0
    def testSaveCanvasVariablesToProject(self):
        """
        Ensure that temporary canvas atlas variables are not written to project
        """
        c1 = QgsMapCanvas()
        c1.setObjectName('c1')
        c1.expressionContextScope().setVariable('atlas_featurenumber', 1111)
        c1.expressionContextScope().setVariable('atlas_pagename', 'bb')
        c1.expressionContextScope().setVariable('atlas_feature', QgsFeature(1))
        c1.expressionContextScope().setVariable('atlas_featureid', 22)
        c1.expressionContextScope().setVariable('atlas_geometry', QgsGeometry.fromWkt('Point( 1 2 )'))
        c1.expressionContextScope().setVariable('vara', 1111)
        c1.expressionContextScope().setVariable('varb', 'bb')

        doc = QDomDocument("testdoc")
        elem = doc.createElement("qgis")
        doc.appendChild(elem)
        c1.writeProject(doc)

        c2 = QgsMapCanvas()
        c2.setObjectName('c1')
        c2.readProject(doc)

        self.assertCountEqual(c2.expressionContextScope().variableNames(), ['vara', 'varb'])
        self.assertEqual(c2.expressionContextScope().variable('vara'), 1111)
        self.assertEqual(c2.expressionContextScope().variable('varb'), 'bb')
コード例 #2
0
ファイル: test_qgsmapcanvas.py プロジェクト: timlinux/QGIS
    def testSaveMultipleCanvasesToProject(self):
        # test saving/restoring canvas state to project with multiple canvases
        c1 = QgsMapCanvas()
        c1.setObjectName('c1')
        c1.setDestinationCrs(QgsCoordinateReferenceSystem('EPSG:3111'))
        c1.setRotation(45)
        c2 = QgsMapCanvas()
        c2.setObjectName('c2')
        c2.setDestinationCrs(QgsCoordinateReferenceSystem('EPSG:4326'))
        c2.setRotation(65)

        doc = QDomDocument("testdoc")
        elem = doc.createElement("qgis")
        doc.appendChild(elem)
        c1.writeProject(doc)
        c2.writeProject(doc)

        c3 = QgsMapCanvas()
        c3.setObjectName('c1')
        c4 = QgsMapCanvas()
        c4.setObjectName('c2')
        c3.readProject(doc)
        c4.readProject(doc)

        self.assertEqual(c3.mapSettings().destinationCrs().authid(), 'EPSG:3111')
        self.assertEqual(c3.rotation(), 45)
        self.assertEqual(c4.mapSettings().destinationCrs().authid(), 'EPSG:4326')
        self.assertEqual(c4.rotation(), 65)
コード例 #3
0
ファイル: test_qgsrasterlayer.py プロジェクト: m-kuhn/QGIS
 def layerToSld(self, layer, properties={}):
     dom = QDomDocument()
     root = dom.createElement("FakeRoot")
     dom.appendChild(root)
     errorMessage = ''
     layer.writeSld(root, dom, errorMessage, properties)
     return dom, root, errorMessage
コード例 #4
0
    def copy_layer_settings(self, source_layer, target_layer):
        # copy filter

        if target_layer.type() == QgsVectorLayer:
            target_layer.setSubsetString(source_layer.subsetString())

        # copy symbology
        error = ""
        doc = QDomDocument()
        node = doc.createElement("symbology")
        doc.appendChild(node)
        source_layer.writeSymbology(node, doc, error,  QgsReadWriteContext())

        if not error:
            target_layer.readSymbology(node, error,  QgsReadWriteContext())
        if error:
            QMessageBox.warning(None, "Could not copy symbology", error)

        # copy scale based visibility
        try:
            target_layer.setScaleBasedVisibility(source_layer.hasScaleBasedVisibility())
        except:
            # Fall back to the deprecated function
            target_layer.toggleScaleBasedVisibility(source_layer.hasScaleBasedVisibility())
        target_layer.setMinimumScale(source_layer.minimumScale())
        target_layer.setMaximumScale(source_layer.maximumScale())

        #copy CRS
        target_layer.setCrs(source_layer.crs(), False)
コード例 #5
0
 def layerToSld(self, mapLayer):
     dom = QDomDocument()
     root = dom.createElement("FakeRoot")
     dom.appendChild(root)
     error = None
     mapLayer.writeSld(root, dom, error, {})
     return dom, root
コード例 #6
0
ファイル: ReliefColorsWidget.py プロジェクト: kalxas/QGIS
    def on_btnSave_clicked(self):
        fileName, _ = QFileDialog.getSaveFileName(
            None, self.tr("Export Colors and elevations as XML"), QDir.homePath(), self.tr("XML files (*.xml *.XML)")
        )

        if fileName == "":
            return

        if not fileName.lower().endswith(".xml"):
            fileName += ".xml"

        doc = QDomDocument()
        colorsElem = doc.createElement("ReliefColors")
        doc.appendChild(colorsElem)

        colors = self.reliefColors()
        for c in colors:
            elem = doc.createElement("ReliefColor")
            elem.setAttribute("MinElevation", str(c.minElevation))
            elem.setAttribute("MaxElevation", str(c.maxElevation))
            elem.setAttribute("red", str(c.color.red()))
            elem.setAttribute("green", str(c.color.green()))
            elem.setAttribute("blue", str(c.color.blue()))
            colorsElem.appendChild(elem)

        with codecs.open(fileName, "w", encoding="utf-8") as f:
            f.write(doc.toString(2))
コード例 #7
0
ファイル: test_qgslayoutmanager.py プロジェクト: mhugo/QGIS
    def testReadWriteXml(self):
        """
        Test reading and writing layout manager state to XML
        """
        project = QgsProject()
        manager = QgsLayoutManager(project)

        # add a bunch of layouts
        layout = QgsPrintLayout(project)
        layout.setName('test layout')
        layout2 = QgsPrintLayout(project)
        layout2.setName('test layout2')
        layout3 = QgsPrintLayout(project)
        layout3.setName('test layout3')

        manager.addLayout(layout)
        manager.addLayout(layout2)
        manager.addLayout(layout3)

        # save to xml
        doc = QDomDocument("testdoc")
        elem = manager.writeXml(doc)
        doc.appendChild(elem)

        # restore from xml
        project2 = QgsProject()
        manager2 = QgsLayoutManager(project2)
        self.assertTrue(manager2.readXml(elem, doc))

        self.assertEqual(len(manager2.layouts()), 3)
        names = [c.name() for c in manager2.layouts()]
        self.assertCountEqual(names, ['test layout', 'test layout2', 'test layout3'])
コード例 #8
0
ファイル: ReliefColorsWidget.py プロジェクト: cayetanobv/QGIS
    def on_btnSave_clicked(self):
        fileName, _ = QFileDialog.getSaveFileName(None,
                                                  self.tr('Export Colors and elevations as XML'),
                                                  QDir.homePath(),
                                                  self.tr('XML files (*.xml *.XML)'))

        if fileName == '':
            return

        if not fileName.lower().endswith('.xml'):
            fileName += '.xml'

        doc = QDomDocument()
        colorsElem = doc.createElement('ReliefColors')
        doc.appendChild(colorsElem)

        colors = self.reliefColors()
        for c in colors:
            elem = doc.createElement('ReliefColor')
            elem.setAttribute('MinElevation', str(c.minElevation))
            elem.setAttribute('MaxElevation', str(c.maxElevation))
            elem.setAttribute('red', str(c.color.red()))
            elem.setAttribute('green', str(c.color.green()))
            elem.setAttribute('blue', str(c.color.blue()))
            colorsElem.appendChild(elem)

        with codecs.open(fileName, 'w', encoding='utf-8') as f:
            f.write(doc.toString(2))
コード例 #9
0
ファイル: test_qgslayoutmanager.py プロジェクト: exlimit/QGIS
    def testReadWriteXml(self):
        """
        Test reading and writing layout manager state to XML
        """
        project = QgsProject()
        manager = QgsLayoutManager(project)

        # add a bunch of compositions
        composition = QgsComposition(project)
        composition.setName('test composition')
        composition2 = QgsComposition(project)
        composition2.setName('test composition2')
        composition3 = QgsComposition(project)
        composition3.setName('test composition3')

        manager.addComposition(composition)
        manager.addComposition(composition2)
        manager.addComposition(composition3)

        # save to xml
        doc = QDomDocument("testdoc")
        elem = manager.writeXml(doc)
        doc.appendChild(elem)

        # restore from xml
        project2 = QgsProject()
        manager2 = QgsLayoutManager(project2)
        self.assertTrue(manager2.readXml(elem, doc))

        self.assertEqual(len(manager2.compositions()), 3)
        names = [c.name() for c in manager2.compositions()]
        self.assertEqual(set(names), {'test composition', 'test composition2', 'test composition3'})
コード例 #10
0
ファイル: test_qgscomposition.py プロジェクト: nirvn/QGIS
    def testSaveRestore(self):
        # test that properties are restored correctly from XML
        composition = QgsComposition(QgsProject.instance())
        composition.setName('test composition')

        doc = QDomDocument("testdoc")
        elem = doc.createElement("qgis")
        doc.appendChild(elem)
        elem = doc.createElement("composer")
        self.assertTrue(composition.writeXml(elem, doc))

        composition2 = QgsComposition(QgsProject.instance())
        self.assertTrue(composition2.readXml(elem, doc))

        self.assertEqual(composition.name(), 'test composition')
コード例 #11
0
    def testSimpleMarkerSymbolLayer(self):
        symbol = QgsSimpleMarkerSymbolLayer(
            'star', QColor(255, 0, 0), QColor(0, 255, 0), 10)
        symbol.setAngle(50)
        dom = QDomDocument()
        root = dom.createElement("FakeRoot")
        dom.appendChild(root)
        symbol.toSld(dom, root, {})
        # print "This is the dom: " + dom.toString()

        # Check the rotation element is a literal, not a
        rotation = root.elementsByTagName('se:Rotation').item(0)
        literal = rotation.firstChild()
        self.assertEquals("ogc:Literal", literal.nodeName())
        self.assertEquals('50', literal.firstChild().nodeValue())
コード例 #12
0
ファイル: layer.py プロジェクト: opengisch/QFieldSync
    def _change_data_source(self, new_data_source):
        """
        Changes the datasource string of the layer
        """
        context = QgsReadWriteContext()
        document = QDomDocument("style")
        map_layers_element = document.createElement("maplayers")
        map_layer_element = document.createElement("maplayer")
        self.layer.writeLayerXml(map_layer_element, document, context)

        # modify DOM element with new layer reference
        map_layer_element.firstChildElement("datasource").firstChild().setNodeValue(new_data_source)
        map_layers_element.appendChild(map_layer_element)
        document.appendChild(map_layers_element)

        # reload layer definition
        self.layer.readLayerXml(map_layer_element, context)
        self.layer.reload()
コード例 #13
0
ファイル: dlg_sql_layer_window.py プロジェクト: GeoCat/QGIS
    def updateSqlLayer(self):
        with OverrideCursor(Qt.WaitCursor):
            layer = self._getSqlLayer(self.filter)
            if layer is None:
                return

            # self.layer.dataProvider().setDataSourceUri(layer.dataProvider().dataSourceUri())
            # self.layer.dataProvider().reloadData()
            XMLDocument = QDomDocument("style")
            XMLMapLayers = XMLDocument.createElement("maplayers")
            XMLMapLayer = XMLDocument.createElement("maplayer")
            self.layer.writeLayerXML(XMLMapLayer, XMLDocument)
            XMLMapLayer.firstChildElement("datasource").firstChild().setNodeValue(layer.source())
            XMLMapLayers.appendChild(XMLMapLayer)
            XMLDocument.appendChild(XMLMapLayers)
            self.layer.readLayerXML(XMLMapLayer)
            self.layer.reload()
            self.iface.actionDraw().trigger()
            self.iface.mapCanvas().refresh()
コード例 #14
0
ファイル: test_qgsmapcanvas.py プロジェクト: dmarteau/QGIS
    def testSaveMultipleCanvasesToProject(self):
        # test saving/restoring canvas state to project with multiple canvases
        c1 = QgsMapCanvas()
        c1.setObjectName('c1')
        c1.setDestinationCrs(QgsCoordinateReferenceSystem('EPSG:3111'))
        c1.setRotation(45)
        c1.expressionContextScope().setVariable('vara', 1111)
        c1.expressionContextScope().setVariable('varb', 'bb')
        c2 = QgsMapCanvas()
        c2.setObjectName('c2')
        c2.setDestinationCrs(QgsCoordinateReferenceSystem('EPSG:4326'))
        c2.setRotation(65)
        c2.expressionContextScope().setVariable('vara', 2222)
        c2.expressionContextScope().setVariable('varc', 'cc')

        doc = QDomDocument("testdoc")
        elem = doc.createElement("qgis")
        doc.appendChild(elem)
        c1.writeProject(doc)
        c2.writeProject(doc)

        c3 = QgsMapCanvas()
        c3.setObjectName('c1')
        c4 = QgsMapCanvas()
        c4.setObjectName('c2')
        c3.readProject(doc)
        c4.readProject(doc)

        self.assertEqual(c3.mapSettings().destinationCrs().authid(), 'EPSG:3111')
        self.assertEqual(c3.rotation(), 45)
        self.assertEqual(set(c3.expressionContextScope().variableNames()), {'vara', 'varb'})
        self.assertEqual(c3.expressionContextScope().variable('vara'), 1111)
        self.assertEqual(c3.expressionContextScope().variable('varb'), 'bb')
        self.assertEqual(c4.mapSettings().destinationCrs().authid(), 'EPSG:4326')
        self.assertEqual(c4.rotation(), 65)
        self.assertEqual(set(c4.expressionContextScope().variableNames()), {'vara', 'varc'})
        self.assertEqual(c4.expressionContextScope().variable('vara'), 2222)
        self.assertEqual(c4.expressionContextScope().variable('varc'), 'cc')
コード例 #15
0
ファイル: test_qgsrasterlayer.py プロジェクト: Huicat/QGIS
    def testClone(self):
        myPath = os.path.join(unitTestDataPath('raster'),
                              'band1_float32_noct_epsg4326.tif')
        myFileInfo = QFileInfo(myPath)
        myBaseName = myFileInfo.baseName()
        layer = QgsRasterLayer(myPath, myBaseName)

        renderer = layer.renderer().clone()
        renderer.setOpacity(33.3)
        layer.setRenderer(renderer)

        # clone layer
        clone = layer.clone()

        # generate xml from layer
        layer_doc = QDomDocument("doc")
        layer_elem = layer_doc.createElement("maplayer")
        layer.writeLayerXml(layer_elem, layer_doc, QgsReadWriteContext())

        # generate xml from clone
        clone_doc = QDomDocument("doc")
        clone_elem = clone_doc.createElement("maplayer")
        clone.writeLayerXml(clone_elem, clone_doc, QgsReadWriteContext())

        # replace id within xml of clone
        clone_id_elem = clone_elem.firstChildElement("id")
        clone_id_elem_patch = clone_doc.createElement("id")
        clone_id_elem_patch_value = clone_doc.createTextNode(layer.id())
        clone_id_elem_patch.appendChild(clone_id_elem_patch_value)
        clone_elem.replaceChild(clone_id_elem_patch, clone_id_elem)

        # update doc
        clone_doc.appendChild(clone_elem)
        layer_doc.appendChild(layer_elem)

        # compare xml documents
        self.assertEqual(layer_doc.toString(), clone_doc.toString())
コード例 #16
0
ファイル: test_qgsrasterlayer.py プロジェクト: m-kuhn/QGIS
    def testClone(self):
        myPath = os.path.join(unitTestDataPath('raster'),
                              'band1_float32_noct_epsg4326.tif')
        myFileInfo = QFileInfo(myPath)
        myBaseName = myFileInfo.baseName()
        layer = QgsRasterLayer(myPath, myBaseName)

        renderer = layer.renderer().clone()
        renderer.setOpacity(33.3)
        layer.setRenderer(renderer)

        # clone layer
        clone = layer.clone()

        # generate xml from layer
        layer_doc = QDomDocument("doc")
        layer_elem = layer_doc.createElement("maplayer")
        layer.writeLayerXml(layer_elem, layer_doc, QgsReadWriteContext())

        # generate xml from clone
        clone_doc = QDomDocument("doc")
        clone_elem = clone_doc.createElement("maplayer")
        clone.writeLayerXml(clone_elem, clone_doc, QgsReadWriteContext())

        # replace id within xml of clone
        clone_id_elem = clone_elem.firstChildElement("id")
        clone_id_elem_patch = clone_doc.createElement("id")
        clone_id_elem_patch_value = clone_doc.createTextNode(layer.id())
        clone_id_elem_patch.appendChild(clone_id_elem_patch_value)
        clone_elem.replaceChild(clone_id_elem_patch, clone_id_elem)

        # update doc
        clone_doc.appendChild(clone_elem)
        layer_doc.appendChild(layer_elem)

        # compare xml documents
        self.assertEqual(layer_doc.toString(), clone_doc.toString())
コード例 #17
0
    def setDataSource(self, layer, newSourceUri):
        """
        Method to apply a new datasource to a vector Layer
        """
        newDS, newUri = self.splitSource(newSourceUri)
        newDatasourceType = newDS or layer.dataProvider().name()

        # read layer definition
        XMLDocument = QDomDocument("style")
        XMLMapLayers = QDomElement()
        XMLMapLayers = XMLDocument.createElement("maplayers")
        XMLMapLayer = QDomElement()
        XMLMapLayer = XMLDocument.createElement("maplayer")
        layer.writeLayerXML(XMLMapLayer, XMLDocument)

        # apply layer definition
        XMLMapLayer.firstChildElement("datasource").firstChild().setNodeValue(newUri)
        XMLMapLayer.firstChildElement("provider").firstChild().setNodeValue(newDatasourceType)
        XMLMapLayers.appendChild(XMLMapLayer)
        XMLDocument.appendChild(XMLMapLayers)
        layer.readLayerXML(XMLMapLayer)
        layer.reload()
        self.iface.actionDraw().trigger()
        self.iface.mapCanvas().refresh()
コード例 #18
0
ファイル: widgets_tree.py プロジェクト: lbartoletti/QGIS
class UiInspector:

    def __init__(self):
        self.ui_dir = os.path.abspath(os.path.join(os.path.dirname(__file__), '../src/ui/*.ui'))
        self.printMsg("Loading UI files " + self.ui_dir)
        # list of widget classes we want to follow
        self.follow = [
            QWidget, QDialog,
            QCheckBox, QComboBox, QDial, QPushButton, QLabel, QLCDNumber, QLineEdit, QRadioButton, QScrollBar, QSlider, QSpinBox, QTextEdit,
            QDateEdit, QTimeEdit, QDateTimeEdit, QListView, QProgressBar, QTableView, QTabWidget, QTextBrowser, QDialogButtonBox,
            QScrollArea, QGroupBox, QStackedWidget,
        ]

    def printMsg(self, msg):
        sys.stderr.write(msg + "\n")

    def widgetXml(self, element, widget, level=0, label=None):
        #print tostring ( element )
        #self.printMsg ( "class: " + str( type ( widget ) ) )
        #self.printMsg ( "objectName: " + widget.objectName() )
        #self.printMsg ( "windowTitle: " + widget.windowTitle() )

        if not widget.objectName():
            return

        lab = label
        if hasattr(widget, 'text'):
            lab = widget.text()
        if widget.windowTitle():
            label = widget.windowTitle()
        if not lab:
            lab = ''

        subElement = self.doc.createElement('widget')
        subElement.setAttribute('class', widget.__class__.__name__)
        subElement.setAttribute('objectName', widget.objectName())
        subElement.setAttribute('label', lab)
        element.appendChild(subElement)

        #print str ( widget.children () )
        # tab widget label is stored in QTabWidget->QTabBarPrivate->tabList->QTab ..
        if type(widget) in [QTabWidget]:
            children = list({'widget': widget.widget(i), 'label': widget.tabText(i)} for i in range(0, widget.count()))
        else:
            children = list({'widget': c, 'label': None} for c in widget.children())
        for child in children:
            w = child['widget']
            if w.isWidgetType() and (type(w) in self.follow):
                self.widgetXml(subElement, w, level + 1, child['label'])

    def xml(self):
        self.doc = QDomDocument()
        element = self.doc.createElement("qgiswidgets")
        self.doc.appendChild(element)
        for p in glob.glob(self.ui_dir):
            self.printMsg("Loading " + p)
            # qgsrasterlayerpropertiesbase.ui is giving: No module named qwt_plot
            try:
                widget = loadUi(p)
                #print dir ( ui )
                self.widgetXml(element, widget)
            except Exception, e:
                #except IOError, e:
                self.printMsg(str(e))

        return self.doc.toString(2)
コード例 #19
0
ファイル: widgets_tree.py プロジェクト: rossia/QGIS
class UiInspector:
    def __init__(self):
        self.ui_dir = os.path.abspath(
            os.path.join(os.path.dirname(__file__), '../src/ui/*.ui'))
        self.printMsg("Loading UI files " + self.ui_dir)
        # list of widget classes we want to follow
        self.follow = [
            QWidget,
            QDialog,
            QCheckBox,
            QComboBox,
            QDial,
            QPushButton,
            QLabel,
            QLCDNumber,
            QLineEdit,
            QRadioButton,
            QScrollBar,
            QSlider,
            QSpinBox,
            QTextEdit,
            QDateEdit,
            QTimeEdit,
            QDateTimeEdit,
            QListView,
            QProgressBar,
            QTableView,
            QTabWidget,
            QTextBrowser,
            QDialogButtonBox,
            QScrollArea,
            QGroupBox,
            QStackedWidget,
        ]

    def printMsg(self, msg):
        sys.stderr.write(msg + "\n")

    def widgetXml(self, element, widget, level=0, label=None):
        #print tostring ( element )
        #self.printMsg ( "class: " + str( type ( widget ) ) )
        #self.printMsg ( "objectName: " + widget.objectName() )
        #self.printMsg ( "windowTitle: " + widget.windowTitle() )

        if not widget.objectName():
            return

        lab = label
        if hasattr(widget, 'text'):
            lab = widget.text()
        if widget.windowTitle():
            label = widget.windowTitle()
        if not lab:
            lab = ''

        subElement = self.doc.createElement('widget')
        subElement.setAttribute('class', widget.__class__.__name__)
        subElement.setAttribute('objectName', widget.objectName())
        subElement.setAttribute('label', lab)
        element.appendChild(subElement)

        #print str ( widget.children () )
        # tab widget label is stored in QTabWidget->QTabBarPrivate->tabList->QTab ..
        if type(widget) in [QTabWidget]:
            children = list({
                'widget': widget.widget(i),
                'label': widget.tabText(i)
            } for i in range(0, widget.count()))
        else:
            children = list({
                'widget': c,
                'label': None
            } for c in widget.children())
        for child in children:
            w = child['widget']
            if w.isWidgetType() and (type(w) in self.follow):
                self.widgetXml(subElement, w, level + 1, child['label'])

    def xml(self):
        self.doc = QDomDocument()
        element = self.doc.createElement("qgiswidgets")
        self.doc.appendChild(element)
        for p in glob.glob(self.ui_dir):
            self.printMsg("Loading " + p)
            # qgsrasterlayerpropertiesbase.ui is giving: No module named qwt_plot
            try:
                widget = loadUi(p)
                #print dir ( ui )
                self.widgetXml(element, widget)
            except Exception, e:
                #except IOError, e:
                self.printMsg(str(e))

        return self.doc.toString(2)
コード例 #20
0
if 'srid' in config_data:
    for layer in QgsProject.instance().mapLayers().values():
        if layer.hasGeometryType():
            layer.setCrs(QgsCoordinateReferenceSystem(int(
                config_data['srid'])))
            source = layer.source().replace('21781', str(
                (config_data['srid'])))
            document = QDomDocument("style")
            map_layers_element = document.createElement("maplayers")
            map_layer_element = document.createElement("maplayer")
            layer.writeLayerXml(map_layer_element, document)
            # modify DOM element with new layer reference
            map_layer_element.firstChildElement(
                "datasource").firstChild().setNodeValue(source)
            map_layers_element.appendChild(map_layer_element)
            document.appendChild(map_layers_element)
            # reload layer definition
            layer.readLayerXml(map_layer_element)
            layer.reload()

# translation
for layer in QgsProject.instance().mapLayers().values():
    if layer.id() in tr_data['layers']:
        print('Translating layer: {0}'.format(layer.name()))
        layer.setName(tr_data['layers'][layer.id()]['name'])
        # tabs
        if 'tabs' in tr_data['layers'][layer.id()]:
            for tab in layer.editFormConfig().tabs():
                if tab.name() in tr_data['layers'][layer.id()]['tabs']:
                    tab.setName(
                        tr_data['layers'][layer.id()]['tabs'][tab.name()])
コード例 #21
0
def getStyleAsSld(layer, styleName):
    if layer.type() == layer.VectorLayer:
        document = QDomDocument()
        header = document.createProcessingInstruction("xml", "version=\"1.0\"")
        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:xlink", "http://www.w3.org/1999/xlink" )
        # root.setAttribute(
        #     "xmlns:xsi", "http://www.w3.org/2001/XMLSchema-instance" )
        document.appendChild(root)

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

        nameNode = document.createElement("sld:Name")
        featureTypeStyleElem = document.createElement("sld:FeatureTypeStyle")
        namedLayerNode.appendChild(nameNode)
        nameNode.appendChild(document.createTextNode(styleName))
        userNode = document.createElement("sld:UserStyle")
        namedLayerNode.appendChild(userNode)

        nameElem = document.createElement("sld:Name")
        nameElem.appendChild(document.createTextNode(styleName))
        userNode.appendChild(nameElem)
        titleElem = document.createElement("sld:Title")
        titleElem.appendChild(document.createTextNode(styleName))
        userNode.appendChild(titleElem)

        rule = layer.renderer().rootRule()
        props = {}  # QgsStringMap() can be see as a python dictionary
        rule_to_sld(rule, document, featureTypeStyleElem, props)
        userNode.appendChild(featureTypeStyleElem)

        return str(document.toString(4))
    elif layer.type() == layer.RasterLayer:
        renderer = layer.renderer()
        if isinstance(renderer, QgsSingleBandGrayRenderer):
            symbolizerCode = "<Opacity>%d</Opacity>" % renderer.opacity()
            symbolizerCode += (
                "<ChannelSelection><GrayChannel><SourceChannelName>" +
                str(renderer.grayBand()) +
                "</SourceChannelName></GrayChannel></ChannelSelection>")
            sld = RASTER_SLD_TEMPLATE.replace("SYMBOLIZER_CODE",
                                              symbolizerCode).replace(
                                                  "STYLE_NAME", layer.name())
            return sld
        elif isinstance(renderer, QgsSingleBandPseudoColorRenderer):
            symbolizerCode = "<ColorMap>"
            # band = renderer.usesBands()[0]
            items = \
                renderer.shader().rasterShaderFunction().colorRampItemList()
            for item in items:
                color = item.color
                rgb = '#%02x%02x%02x' % (color.red(), color.green(),
                                         color.blue())
                symbolizerCode += ('<ColorMapEntry color="' + rgb +
                                   '" quantity="' + str(item.value) + '" />')
            symbolizerCode += "</ColorMap>"
            sld = RASTER_SLD_TEMPLATE.replace("SYMBOLIZER_CODE",
                                              symbolizerCode).replace(
                                                  "STYLE_NAME", layer.name())
            return sld
        else:
            # we use some default styles in case we have an
            # unsupported renderer
            sldpath = os.path.join(os.path.dirname(__file__), "..",
                                   "resources")
            if layer.bandCount() == 1:
                sldfile = os.path.join(sldpath, "grayscale.sld")
            else:
                sldfile = os.path.join(sldpath, "rgb.sld")
            with open(sldfile, 'r', newline='') as f:
                sld = f.read()
            return sld
    else:
        return None
コード例 #22
0
 def symbolToSld(self, symbolLayer):
     dom = QDomDocument()
     root = dom.createElement("FakeRoot")
     dom.appendChild(root)
     symbolLayer.toSld(dom, root, {})
     return dom, root
コード例 #23
0
 def rendererToSld(self, renderer, properties={}):
     dom = QDomDocument()
     root = dom.createElement("FakeRoot")
     dom.appendChild(root)
     renderer.toSld(dom, root, properties)
     return dom, root
コード例 #24
0
 def symbolToSld(self, symbolLayer):
     dom = QDomDocument()
     root = dom.createElement("FakeRoot")
     dom.appendChild(root)
     symbolLayer.toSld(dom, root, {})
     return dom, root
コード例 #25
0
 def rendererToSld(self, renderer, properties={}):
     dom = QDomDocument()
     root = dom.createElement("FakeRoot")
     dom.appendChild(root)
     renderer.toSld(dom, root, properties)
     return dom, root
コード例 #26
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, '')

    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()

    # in qgis3 layer.writeSld() also incluedes labeling in the output sld,
    # whereas in qgis2 we have to do this manually by using this module's function
    # getLabelingAsSld
    ## TODO: The automatic sld labeling from QGIS 3 produces an extra rule for
    # every labeling style, thus leading to a less beautiful viewe in the
    # shogun2-webapp styler - is this a problem?

    if qgisLayerItem.layer.labelsEnabled() and PYTHON_VERSION < 3:
        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
コード例 #27
0
    def test_read_write_project(self):
        """
        Test reading and writing to project document
        """
        # fake project document
        doc = QDomDocument("test")
        doc.appendChild(doc.createElement('qgis'))
        original = PlotSettings('test',
                                properties={
                                    'marker_width': 2,
                                    'marker_size': 5
                                },
                                layout={
                                    'title': 'my plot',
                                    'legend_orientation': 'v'
                                })
        original.data_defined_properties.setProperty(
            PlotSettings.PROPERTY_FILTER,
            QgsProperty.fromExpression('"ap">50'))
        original.data_defined_properties.setProperty(
            PlotSettings.PROPERTY_MARKER_SIZE,
            QgsProperty.fromExpression('5+6'))
        original.data_defined_properties.setProperty(
            PlotSettings.PROPERTY_COLOR, QgsProperty.fromExpression("'red'"))
        original.data_defined_properties.setProperty(
            PlotSettings.PROPERTY_STROKE_WIDTH,
            QgsProperty.fromExpression('12/2'))
        original.data_defined_properties.setProperty(
            PlotSettings.PROPERTY_TITLE,
            QgsProperty.fromExpression("concat('my', '_title')"))
        original.data_defined_properties.setProperty(
            PlotSettings.PROPERTY_LEGEND_TITLE,
            QgsProperty.fromExpression("concat('my', '_legend')"))
        original.data_defined_properties.setProperty(
            PlotSettings.PROPERTY_X_TITLE,
            QgsProperty.fromExpression("concat('my', '_x_axis')"))
        original.data_defined_properties.setProperty(
            PlotSettings.PROPERTY_Y_TITLE,
            QgsProperty.fromExpression("concat('my', '_y_axis')"))
        original.data_defined_properties.setProperty(
            PlotSettings.PROPERTY_Z_TITLE,
            QgsProperty.fromExpression("concat('my', '_z_axis')"))
        original.data_defined_properties.setProperty(
            PlotSettings.PROPERTY_X_MIN, QgsProperty.fromExpression("-1*10"))
        original.data_defined_properties.setProperty(
            PlotSettings.PROPERTY_X_MAX, QgsProperty.fromExpression("+1*10"))
        original.data_defined_properties.setProperty(
            PlotSettings.PROPERTY_Y_MIN, QgsProperty.fromExpression("-1*10"))
        original.data_defined_properties.setProperty(
            PlotSettings.PROPERTY_Y_MAX, QgsProperty.fromExpression("+1*10"))

        original.write_to_project(doc)

        res = PlotSettings('gg')
        res.read_from_project(doc)
        self.assertEqual(res.plot_type, original.plot_type)
        self.assertEqual(res.properties, original.properties)
        self.assertEqual(res.layout, original.layout)
        self.assertEqual(
            res.data_defined_properties.property(PlotSettings.PROPERTY_FILTER),
            original.data_defined_properties.property(
                PlotSettings.PROPERTY_FILTER))
        self.assertEqual(
            res.data_defined_properties.property(
                PlotSettings.PROPERTY_MARKER_SIZE),
            original.data_defined_properties.property(
                PlotSettings.PROPERTY_MARKER_SIZE))
        self.assertEqual(
            res.data_defined_properties.property(PlotSettings.PROPERTY_COLOR),
            original.data_defined_properties.property(
                PlotSettings.PROPERTY_COLOR))
        self.assertEqual(
            res.data_defined_properties.property(
                PlotSettings.PROPERTY_STROKE_WIDTH),
            original.data_defined_properties.property(
                PlotSettings.PROPERTY_STROKE_WIDTH))
        self.assertEqual(
            res.data_defined_properties.property(PlotSettings.PROPERTY_TITLE),
            original.data_defined_properties.property(
                PlotSettings.PROPERTY_TITLE))
        self.assertEqual(
            res.data_defined_properties.property(
                PlotSettings.PROPERTY_LEGEND_TITLE),
            original.data_defined_properties.property(
                PlotSettings.PROPERTY_LEGEND_TITLE))
        self.assertEqual(
            res.data_defined_properties.property(
                PlotSettings.PROPERTY_X_TITLE),
            original.data_defined_properties.property(
                PlotSettings.PROPERTY_X_TITLE))
        self.assertEqual(
            res.data_defined_properties.property(
                PlotSettings.PROPERTY_Y_TITLE),
            original.data_defined_properties.property(
                PlotSettings.PROPERTY_Y_TITLE))
        self.assertEqual(
            res.data_defined_properties.property(
                PlotSettings.PROPERTY_Z_TITLE),
            original.data_defined_properties.property(
                PlotSettings.PROPERTY_Z_TITLE))
        self.assertEqual(
            res.data_defined_properties.property(PlotSettings.PROPERTY_X_MIN),
            original.data_defined_properties.property(
                PlotSettings.PROPERTY_X_MIN))
        self.assertEqual(
            res.data_defined_properties.property(PlotSettings.PROPERTY_X_MAX),
            original.data_defined_properties.property(
                PlotSettings.PROPERTY_X_MAX))
        self.assertEqual(
            res.data_defined_properties.property(PlotSettings.PROPERTY_Y_MIN),
            original.data_defined_properties.property(
                PlotSettings.PROPERTY_Y_MIN))
        self.assertEqual(
            res.data_defined_properties.property(PlotSettings.PROPERTY_Y_MAX),
            original.data_defined_properties.property(
                PlotSettings.PROPERTY_Y_MAX))
コード例 #28
0
    def adjust(self):
        """ Export data to GNU Gama xml, adjust the network and read result

            :returns: result list of adjusment from GNU Gama
        """
        # fix = 0 free network
        fix = 0
        adj = 0
        for p, s in self.points:
            if s == 'FIX':
                fix += 1
            else:
                adj += 1
        if adj == 0 or len(self.observations) == 0:
            # no unknowns or observations
            return None

        doc = QDomDocument()
        doc.appendChild(
            doc.createComment(
                'Gama XML created by SurveyingCalculation plugin for QGIS'))
        gama_local = doc.createElement('gama-local')
        gama_local.setAttribute('version', '2.0')
        doc.appendChild(gama_local)
        network = doc.createElement('network')
        network.setAttribute('axes-xy', 'ne')
        network.setAttribute('angles', 'left-handed')
        gama_local.appendChild(network)
        description = doc.createElement('description')
        if self.dimension == 1:
            description.appendChild(doc.createTextNode('GNU Gama 1D network'))
        elif self.dimension == 2:
            description.appendChild(doc.createTextNode('GNU Gama 2D network'))
        elif self.dimension == 3:
            description.appendChild(doc.createTextNode('GNU Gama 3D network'))
        network.appendChild(description)
        parameters = doc.createElement('parameters')
        parameters.setAttribute('sigma-apr', '1')
        parameters.setAttribute('conf-pr', str(self.probability))
        parameters.setAttribute('tol-abs', '1000')
        parameters.setAttribute('sigma-act', 'aposteriori')
        parameters.setAttribute('update-constrained-coordinates', 'yes')
        network.appendChild(parameters)
        points_observations = doc.createElement('points-observations')
        points_observations.setAttribute(
            'distance-stdev',
            str(self.stdev_dist) + ' ' + str(self.stdev_dist1))
        points_observations.setAttribute('direction-stdev',
                                         str(self.stdev_angle))
        points_observations.setAttribute('angle-stdev',
                                         str(math.sqrt(self.stdev_angle * 2)))
        points_observations.setAttribute('zenith-angle-stdev',
                                         str(self.stdev_angle))
        network.appendChild(points_observations)
        for p, s in self.points:
            if self.dimension == 1:
                tmp = doc.createElement('point')
                tmp.setAttribute('id', p.id)
                if p.z is not None:
                    tmp.setAttribute('z', str(p.z))
                if s == 'FIX':
                    tmp.setAttribute('fix', 'z')
                else:
                    if fix == 0:
                        tmp.setAttribute('adj', 'Z')
                    else:
                        tmp.setAttribute('adj', 'z')
                points_observations.appendChild(tmp)
            elif self.dimension == 2:
                tmp = doc.createElement('point')
                tmp.setAttribute('id', p.id)
                if p.e is not None and p.n is not None:
                    tmp.setAttribute('y', str(p.e))
                    tmp.setAttribute('x', str(p.n))
                if s == 'FIX':
                    tmp.setAttribute('fix', 'xy')
                else:
                    if fix == 0:
                        # free network
                        tmp.setAttribute('adj', 'XY')
                    else:
                        tmp.setAttribute('adj', 'xy')
                points_observations.appendChild(tmp)
            elif self.dimension == 3:
                tmp = doc.createElement('point')
                tmp.setAttribute('id', p.id)
                if p.e is not None and p.n is not None:
                    tmp.setAttribute('y', str(p.e))
                    tmp.setAttribute('x', str(p.n))
                if p.z is not None:
                    tmp.setAttribute('z', str(p.z))
                if s == 'FIX':
                    tmp.setAttribute('fix', 'xyz')
                else:
                    if fix == 0:
                        tmp.setAttribute('adj', 'XYZ')
                    else:
                        tmp.setAttribute('adj', 'xyz')
                points_observations.appendChild(tmp)
        if self.dimension == 1:
            hd = doc.createElement('height-differences')
            points_observations.appendChild(hd)
        for o in self.observations:
            if o.station == 'station':
                # station record
                st_id = o.point_id
                if o.th is None:
                    ih = 0
                else:
                    ih = o.th
                if self.dimension in [2, 3]:
                    sta = doc.createElement('obs')
                    sta.setAttribute('from', o.point_id)
                    points_observations.appendChild(sta)
            else:
                # observation
                if self.dimension == 2:
                    # horizontal network
                    if o.hz is not None:
                        tmp = doc.createElement('direction')
                        tmp.setAttribute('to', o.point_id)
                        tmp.setAttribute('val', str(o.hz.get_angle('GON')))
                        sta.appendChild(tmp)
                    if o.d is not None:
                        # horizontal distance
                        hd = o.horiz_dist()
                        if hd is not None:
                            tmp = doc.createElement('distance')
                            tmp.setAttribute('to', o.point_id)
                            tmp.setAttribute('val', str(hd))
                            sta.appendChild(tmp)
                elif self.dimension == 1:
                    # elevations only 1d
                    if o.th is None:
                        th = 0
                    else:
                        th = o.th
                    if o.d is not None and o.v is not None:
                        tmp = doc.createElement('dh')
                        tmp.setAttribute('from', st_id)
                        tmp.setAttribute('to', o.point_id)
                        # TODO hibaterjedes
                        tmp.setAttribute('stdev', '1')
                        sz = math.sin(o.v.get_angle())
                        w = self.stdev_dist + self.stdev_dist1 * o.d.d / 1000
                        ro_cc = 200 * 100 * 100 / math.pi
                        if o.d.mode == 'SD':
                            cz = math.cos(o.v.get_angle())
                            tmp.setAttribute('val', str(o.d.d * cz + ih - th))
                            tmp.setAttribute(
                                'stdev',
                                str(
                                    math.sqrt(cz**2 * w**2 +
                                              (o.d.d * 1000)**2 * sz**2 *
                                              (self.stdev_angle / RO_CC)**2)))
                        else:
                            tz = math.tan(o.v.get_angle())
                            tmp.setAttribute(
                                'val',
                                str(o.d.d / math.tan(o.v.get_angle()) + ih -
                                    th))
                            tmp.setAttribute(
                                'stdev',
                                str(
                                    math.sqrt((1 / tz)**2 * w**2 +
                                              (o.d.d * 1000)**2 *
                                              (o.d.d * 1000)**2 *
                                              (1 / sz**2)**2 *
                                              (self.stdev_angle / RO_CC)**2)))
                        hd.appendChild(tmp)
                elif self.dimension == 3:
                    # 3d
                    if o.th is None:
                        th = 0
                    else:
                        th = o.th
                    if o.hz is not None:
                        tmp = doc.createElement('direction')
                        tmp.setAttribute('to', o.point_id)
                        tmp.setAttribute('val', str(o.hz.get_angle('GON')))
                        sta.appendChild(tmp)
                    if o.d is not None:
                        if o.d.mode == 'SD':
                            tmp = doc.createElement('s-distance')
                            tmp.setAttribute('val', str(o.d.d))
                            tmp.setAttribute('from_dh', str(ih))
                            tmp.setAttribute('to_dh', str(th))
                        else:
                            tmp = doc.createElement('distance')
                            tmp.setAttribute('val', str(o.d.d))
                        tmp.setAttribute('to', o.point_id)
                        sta.appendChild(tmp)
                    if o.v is not None:
                        tmp = doc.createElement('z-angle')
                        tmp.setAttribute('to', o.point_id)
                        tmp.setAttribute('val', str(o.v.get_angle('GON')))
                        tmp.setAttribute('from_dh', str(ih))
                        tmp.setAttribute('to_dh', str(th))
                        sta.appendChild(tmp)
                else:
                    # unknown dimension
                    return None
        # generate temp file name
        tmpf = QTemporaryFile(QDir.temp().absoluteFilePath('w'))
        tmpf.open(QIODevice.WriteOnly)
        tmpf.close()
        tmp_name = tmpf.fileName()
        f = QFile(tmp_name + '.xml')
        if f.open(QIODevice.WriteOnly):
            f.write(doc.toByteArray())
            f.close()

        # run gama-local
        if self.gama_prog is None:
            return None
        status = QProcess.execute(self.gama_prog, [
            tmp_name + '.xml', '--angles', '360', '--text', tmp_name + '.txt',
            '--xml', tmp_name + 'out.xml'
        ])
        if status != 0:
            return None

        xmlParser = QXmlSimpleReader()
        xmlFile = QFile(tmp_name + 'out.xml')
        xmlInputSource = QXmlInputSource(xmlFile)
        doc.setContent(xmlInputSource, xmlParser)

        f_txt = QFile(tmp_name + '.txt')
        f_txt.open(QIODevice.ReadOnly)
        res = f_txt.readAll().data()
        f_txt.close()

        # store coordinates
        adj_nodes = doc.elementsByTagName('adjusted')
        if adj_nodes.count() < 1:
            return res
        adj_node = adj_nodes.at(0)
        for i in range(len(adj_node.childNodes())):
            pp = adj_node.childNodes().at(i)
            if pp.nodeName() == 'point':
                for ii in range(len(pp.childNodes())):
                    ppp = pp.childNodes().at(ii)
                    if ppp.nodeName() == 'id':
                        p = Point(ppp.firstChild().nodeValue())
                    elif ppp.nodeName() == 'Y' or ppp.nodeName() == 'y':
                        p.e = float(ppp.firstChild().nodeValue())
                    elif ppp.nodeName() == 'X' or ppp.nodeName() == 'x':
                        p.n = float(ppp.firstChild().nodeValue())
                    elif ppp.nodeName() == 'Z' or ppp.nodeName() == 'z':
                        p.z = float(ppp.firstChild().nodeValue())
                ScPoint(p).store_coord(self.dimension)
        # remove input xml and output xml
        tmpf.remove()
        f_txt.remove()
        f.remove()
        xmlFile.remove()

        return res