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')
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)
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
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)
def layerToSld(self, mapLayer): dom = QDomDocument() root = dom.createElement("FakeRoot") dom.appendChild(root) error = None mapLayer.writeSld(root, dom, error, {}) return dom, root
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))
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'])
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))
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'})
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')
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())
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()
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()
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')
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())
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()
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)
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)
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()])
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
def symbolToSld(self, symbolLayer): dom = QDomDocument() root = dom.createElement("FakeRoot") dom.appendChild(root) symbolLayer.toSld(dom, root, {}) return dom, root
def rendererToSld(self, renderer, properties={}): dom = QDomDocument() root = dom.createElement("FakeRoot") dom.appendChild(root) renderer.toSld(dom, root, properties) return dom, root
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
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))
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