def style_curves(self): registry = QgsSymbolLayerV2Registry.instance() cross = registry.symbolLayerMetadata("SimpleMarker").createSymbolLayer( { 'name': 'cross2', 'color': '0,0,0', 'color_border': '0,0,0', 'offset': '0,0', 'size': '1.5', 'angle': '0' }) symbol = QgsSymbolV2.defaultSymbol(self.layer.geometryType()) symbol.deleteSymbolLayer(0) symbol.appendSymbolLayer(cross) self._set_symbol_size(symbol) renderer = QgsSingleSymbolRendererV2(symbol) effect = QgsOuterGlowEffect() effect.setSpread(0.5) effect.setTransparency(0) effect.setColor(QColor(255, 255, 255)) effect.setBlurLevel(1) renderer.paintEffect().appendEffect(effect) renderer.paintEffect().setEnabled(True) self.layer.setRendererV2(renderer) self.layer.setLayerTransparency(30) # percent self.layer.triggerRepaint() self.iface.legendInterface().refreshLayerSymbology(self.layer) self.iface.mapCanvas().refresh()
def simple_polygon_without_brush(layer, width='0.26', color=QColor('black')): """Simple style to apply a border line only to a polygon layer. :param layer: The layer to style. :type layer: QgsVectorLayer :param color: Color to use for the line. Default to black. :type color: QColor :param width: Width to use for the line. Default to '0.26'. :type width: str """ registry = QgsSymbolLayerV2Registry.instance() line_metadata = registry.symbolLayerMetadata("SimpleLine") symbol = QgsSymbolV2.defaultSymbol(layer.geometryType()) # Line layer line_layer = line_metadata.createSymbolLayer( { 'width': width, 'color': color.name(), 'offset': '0', 'penstyle': 'solid', 'use_custom_dash': '0', 'joinstyle': 'bevel', 'capstyle': 'square' }) # Replace the default layer with our custom line symbol.deleteSymbolLayer(0) symbol.appendSymbolLayer(line_layer) renderer = QgsSingleSymbolRendererV2(symbol) layer.setRendererV2(renderer)
def simple_polygon_without_brush(layer, width='0.26', color=QColor('black')): """Simple style to apply a border line only to a polygon layer. :param layer: The layer to style. :type layer: QgsVectorLayer :param color: Color to use for the line. Default to black. :type color: QColor :param width: Width to use for the line. Default to '0.26'. :type width: str """ registry = QgsSymbolLayerV2Registry.instance() line_metadata = registry.symbolLayerMetadata("SimpleLine") symbol = QgsSymbolV2.defaultSymbol(layer.geometryType()) # Line layer line_layer = line_metadata.createSymbolLayer({ 'width': width, 'color': color.name(), 'offset': '0', 'penstyle': 'solid', 'use_custom_dash': '0', 'joinstyle': 'bevel', 'capstyle': 'square' }) # Replace the default layer with our custom line symbol.deleteSymbolLayer(0) symbol.appendSymbolLayer(line_layer) renderer = QgsSingleSymbolRendererV2(symbol) layer.setRendererV2(renderer)
def create(dom_document): """ Create an instance of the 'SpatialFieldsConfiguration' object from a DOM document. Returns None if the dom_document is invalid. """ from stdm.ui.composer import SpatialFieldMapping dataSourceElem = dom_document.documentElement().firstChildElement( "DataSource") if dataSourceElem == None: return None spatialFieldsConfigElement = dataSourceElem.firstChildElement( "SpatialFields") spFieldsConfig = SpatialFieldsConfiguration() #Get spatial field mappings spatialFieldMappingList = spatialFieldsConfigElement.elementsByTagName( "SpatialField") numItems = spatialFieldMappingList.length() for i in range(numItems): spatialFieldMappingElement = spatialFieldMappingList.item( i).toElement() labelField = spatialFieldMappingElement.attribute("labelField") spatialField = spatialFieldMappingElement.attribute("name") itemId = spatialFieldMappingElement.attribute("itemid") srid = int(spatialFieldMappingElement.attribute("srid")) geomType = spatialFieldMappingElement.attribute("geomType") zoom = float(spatialFieldMappingElement.attribute("zoom")) zoom_type = spatialFieldMappingElement.attribute( 'zoomType', 'RELATIVE') #Create spatial field mapping spFieldMapping = SpatialFieldMapping(spatialField, labelField) spFieldMapping.setItemId(itemId) spFieldMapping.setSRID(srid) spFieldMapping.setGeometryType(geomType) spFieldMapping.setZoomLevel(zoom) spFieldMapping.zoom_type = zoom_type symbolElement = spatialFieldMappingElement.firstChildElement( "Symbol") if not symbolElement is None: layerType = symbolElement.attribute("layerType") layerProps = QgsSymbolLayerV2Utils.parseProperties( symbolElement) symbolLayer = QgsSymbolLayerV2Registry.instance( ).createSymbolLayer(layerType, layerProps) spFieldMapping.setSymbolLayer(symbolLayer) spFieldsConfig.addSpatialFieldMapping(spFieldMapping) return spFieldsConfig
def create(dom_document): """ Create an instance of the 'SpatialFieldsConfiguration' object from a DOM document. Returns None if the dom_document is invalid. """ from stdm.ui.composer import SpatialFieldMapping dataSourceElem = dom_document.documentElement().firstChildElement("DataSource") if dataSourceElem == None: return None spatialFieldsConfigElement = dataSourceElem.firstChildElement("SpatialFields") spFieldsConfig = SpatialFieldsConfiguration() #Get spatial field mappings spatialFieldMappingList = spatialFieldsConfigElement.elementsByTagName("SpatialField") numItems = spatialFieldMappingList.length() for i in range(numItems): spatialFieldMappingElement = spatialFieldMappingList.item(i).toElement() labelField = spatialFieldMappingElement.attribute("labelField") spatialField = spatialFieldMappingElement.attribute("name") itemId = spatialFieldMappingElement.attribute("itemid") srid = int(spatialFieldMappingElement.attribute("srid")) geomType = spatialFieldMappingElement.attribute("geomType") zoom = float(spatialFieldMappingElement.attribute("zoom")) zoom_type = spatialFieldMappingElement.attribute('zoomType', 'RELATIVE') #Create spatial field mapping spFieldMapping = SpatialFieldMapping(spatialField,labelField) spFieldMapping.setItemId(itemId) spFieldMapping.setSRID(srid) spFieldMapping.setGeometryType(geomType) spFieldMapping.setZoomLevel(zoom) spFieldMapping.zoom_type = zoom_type symbolElement = spatialFieldMappingElement.firstChildElement("Symbol") if not symbolElement is None: layerType = symbolElement.attribute("layerType") layerProps = QgsSymbolLayerV2Utils.parseProperties(symbolElement) symbolLayer = QgsSymbolLayerV2Registry.instance().createSymbolLayer(layerType,layerProps) spFieldMapping.setSymbolLayer(symbolLayer) spFieldsConfig.addSpatialFieldMapping(spFieldMapping) return spFieldsConfig
def setVectorStyle(theQgisVectorLayer, theStyle): """Set QGIS vector style based on InaSAFE style dictionary. For **opaque** a value of **0** can be used. For **fully transparent**, a value of **100** can be used. The function should take care to scale the transparency level to between 0 and 100. Args: * theQgisVectorLayer: QgsMapLayer * theStyle: dict - Dictionary of the form as in the example below Returns: None - Sets and saves style for theQgisVectorLayer Raises: None Example: {'target_field': 'DMGLEVEL', 'style_classes': [{'transparency': 1, 'max': 1.5, 'colour': '#fecc5c', 'min': 0.5, 'label': 'Low damage', 'size' : 1}, {'transparency': 55, 'max': 2.5, 'colour': '#fd8d3c', 'min': 1.5, 'label': 'Medium damage', 'size' : 1}, {'transparency': 80, 'max': 3.5, 'colour': '#f31a1c', 'min': 2.5, 'label': 'High damage', 'size' : 1}]} .. note:: The transparency and size keys are optional. Size applies to points only. """ myTargetField = theStyle['target_field'] myClasses = theStyle['style_classes'] myGeometryType = theQgisVectorLayer.geometryType() myRangeList = [] for myClass in myClasses: # Transparency 100: transparent # Transparency 0: opaque mySize = 2 # mm if 'size' in myClass: mySize = myClass['size'] myTransparencyPercent = 0 if 'transparency' in myClass: myTransparencyPercent = myClass['transparency'] if 'min' not in myClass: raise StyleError('Style info should provide a "min" entry') if 'max' not in myClass: raise StyleError('Style info should provide a "max" entry') try: myMin = float(myClass['min']) except TypeError: raise StyleError('Class break lower bound should be a number.' 'I got %s' % myClass['min']) try: myMax = float(myClass['max']) except TypeError: raise StyleError('Class break upper bound should be a number.' 'I got %s' % myClass['max']) myColour = myClass['colour'] myLabel = myClass['label'] myColour = QtGui.QColor(myColour) mySymbol = QgsSymbolV2.defaultSymbol(myGeometryType) myColourString = "%s, %s, %s" % ( myColour.red(), myColour.green(), myColour.blue()) # Work around for the fact that QgsSimpleMarkerSymbolLayerV2 # python bindings are missing from the QGIS api. # .. see:: http://hub.qgis.org/issues/4848 # We need to create a custom symbol layer as # the border colour of a symbol can not be set otherwise myRegistry = QgsSymbolLayerV2Registry.instance() if myGeometryType == QGis.Point: myMetadata = myRegistry.symbolLayerMetadata('SimpleMarker') # note that you can get a list of available layer properties # that you can set by doing e.g. # QgsSimpleMarkerSymbolLayerV2.properties() mySymbolLayer = myMetadata.createSymbolLayer({'color_border': myColourString}) mySymbolLayer.setSize(mySize) mySymbol.changeSymbolLayer(0, mySymbolLayer) elif myGeometryType == QGis.Polygon: myMetadata = myRegistry.symbolLayerMetadata('SimpleFill') mySymbolLayer = myMetadata.createSymbolLayer({'color_border': myColourString}) mySymbol.changeSymbolLayer(0, mySymbolLayer) else: # for lines we do nothing special as the property setting # below should give us what we require. pass mySymbol.setColor(myColour) # .. todo:: Check that vectors use alpha as % otherwise scale TS # Convert transparency % to opacity # alpha = 0: transparent # alpha = 1: opaque alpha = 1 - myTransparencyPercent / 100.0 mySymbol.setAlpha(alpha) myRange = QgsRendererRangeV2(myMin, myMax, mySymbol, myLabel) myRangeList.append(myRange) myRenderer = QgsGraduatedSymbolRendererV2('', myRangeList) myRenderer.setMode(QgsGraduatedSymbolRendererV2.EqualInterval) myRenderer.setClassAttribute(myTargetField) theQgisVectorLayer.setRendererV2(myRenderer) theQgisVectorLayer.saveDefaultStyle()
def setVectorStyle(theQgisVectorLayer, style): """Set QGIS vector style based on InaSAFE style dictionary Input theQgisVectorLayer: Qgis layer style: Dictionary of the form as in the example below {'target_field': 'DMGLEVEL', 'style_classes': [{'opacity': 1, 'max': 1.5, 'colour': '#fecc5c', 'min': 0.5, 'label': 'Low damage', 'size' : 1}, {'opacity': 1, 'max': 2.5, 'colour': '#fd8d3c', 'min': 1.5, 'label': 'Medium damage', 'size' : 1}, {'opacity': 1, 'max': 3.5, 'colour': '#f31a1c', 'min': 2.5, 'label': 'High damage', 'size' : 1}]} .. note:: The transparency and size keys are optional. Size applies to points only. Output Sets and saves style for theQgisVectorLayer """ myTargetField = style["target_field"] myClasses = style["style_classes"] myGeometryType = theQgisVectorLayer.geometryType() myRangeList = [] for myClass in myClasses: # Transparency 100: transparent # Transparency 0: opaque mySize = 2 # mm if "size" in myClass: mySize = myClass["size"] myTransparencyPercent = 0 if "transparency" in myClass: myTransparencyPercent = myClass["transparency"] myMax = myClass["max"] myMin = myClass["min"] myColour = myClass["colour"] myLabel = myClass["label"] myColour = QtGui.QColor(myColour) mySymbol = QgsSymbolV2.defaultSymbol(myGeometryType) myColourString = "%s, %s, %s" % (myColour.red(), myColour.green(), myColour.blue()) # Work around for the fact that QgsSimpleMarkerSymbolLayerV2 # python bindings are missing from the QGIS api. # .. see:: http://hub.qgis.org/issues/4848 # We need to create a custom symbol layer as # the border colour of a symbol can not be set otherwise myRegistry = QgsSymbolLayerV2Registry.instance() if myGeometryType == QGis.Point: myMetadata = myRegistry.symbolLayerMetadata("SimpleMarker") # note that you can get a list of available layer properties # that you can set by doing e.g. # QgsSimpleMarkerSymbolLayerV2.properties() mySymbolLayer = myMetadata.createSymbolLayer({"color_border": myColourString}) mySymbolLayer.setSize(mySize) mySymbol.changeSymbolLayer(0, mySymbolLayer) elif myGeometryType == QGis.Polygon: myMetadata = myRegistry.symbolLayerMetadata("SimpleFill") mySymbolLayer = myMetadata.createSymbolLayer({"color_border": myColourString}) mySymbol.changeSymbolLayer(0, mySymbolLayer) else: # for lines we do nothing special as the property setting # below should give us what we require. pass mySymbol.setColor(myColour) # .. todo:: Check that vectors use alpha as % otherwise scale TS # Convert transparency % to opacity # alpha = 0: transparent # alpha = 1: opaque alpha = 1 - myTransparencyPercent / 100 mySymbol.setAlpha(alpha) myRange = QgsRendererRangeV2(myMin, myMax, mySymbol, myLabel) myRangeList.append(myRange) myRenderer = QgsGraduatedSymbolRendererV2("", myRangeList) myRenderer.setMode(QgsGraduatedSymbolRendererV2.EqualInterval) myRenderer.setClassAttribute(myTargetField) theQgisVectorLayer.setRendererV2(myRenderer) theQgisVectorLayer.saveDefaultStyle()
def setVectorStyle(theQgisVectorLayer, theStyle): """Set QGIS vector style based on InaSAFE style dictionary. For **opaque** a value of **0** can be used. For **fully transparent**, a value of **100** can be used. The function should take care to scale the transparency level to between 0 and 100. Args: * theQgisVectorLayer: QgsMapLayer * theStyle: dict - Dictionary of the form as in the example below Returns: None - Sets and saves style for theQgisVectorLayer Raises: None Example: {'target_field': 'DMGLEVEL', 'style_classes': [{'transparency': 1, 'max': 1.5, 'colour': '#fecc5c', 'min': 0.5, 'label': 'Low damage', 'size' : 1}, {'transparency': 55, 'max': 2.5, 'colour': '#fd8d3c', 'min': 1.5, 'label': 'Medium damage', 'size' : 1}, {'transparency': 80, 'max': 3.5, 'colour': '#f31a1c', 'min': 2.5, 'label': 'High damage', 'size' : 1}]} .. note:: The transparency and size keys are optional. Size applies to points only. """ myTargetField = theStyle['target_field'] myClasses = theStyle['style_classes'] myGeometryType = theQgisVectorLayer.geometryType() myRangeList = [] for myClass in myClasses: # Transparency 100: transparent # Transparency 0: opaque mySize = 2 # mm if 'size' in myClass: mySize = myClass['size'] myTransparencyPercent = 0 if 'transparency' in myClass: myTransparencyPercent = myClass['transparency'] if 'min' not in myClass: raise StyleError('Style info should provide a "min" entry') if 'max' not in myClass: raise StyleError('Style info should provide a "max" entry') try: myMin = float(myClass['min']) except TypeError: raise StyleError('Class break lower bound should be a number.' 'I got %s' % myClass['min']) try: myMax = float(myClass['max']) except TypeError: raise StyleError('Class break upper bound should be a number.' 'I got %s' % myClass['max']) myColour = myClass['colour'] myLabel = myClass['label'] myColour = QtGui.QColor(myColour) mySymbol = QgsSymbolV2.defaultSymbol(myGeometryType) myColourString = "%s, %s, %s" % (myColour.red(), myColour.green(), myColour.blue()) # Work around for the fact that QgsSimpleMarkerSymbolLayerV2 # python bindings are missing from the QGIS api. # .. see:: http://hub.qgis.org/issues/4848 # We need to create a custom symbol layer as # the border colour of a symbol can not be set otherwise myRegistry = QgsSymbolLayerV2Registry.instance() if myGeometryType == QGis.Point: myMetadata = myRegistry.symbolLayerMetadata('SimpleMarker') # note that you can get a list of available layer properties # that you can set by doing e.g. # QgsSimpleMarkerSymbolLayerV2.properties() mySymbolLayer = myMetadata.createSymbolLayer( {'color_border': myColourString}) mySymbolLayer.setSize(mySize) mySymbol.changeSymbolLayer(0, mySymbolLayer) elif myGeometryType == QGis.Polygon: myMetadata = myRegistry.symbolLayerMetadata('SimpleFill') mySymbolLayer = myMetadata.createSymbolLayer( {'color_border': myColourString}) mySymbol.changeSymbolLayer(0, mySymbolLayer) else: # for lines we do nothing special as the property setting # below should give us what we require. pass mySymbol.setColor(myColour) # .. todo:: Check that vectors use alpha as % otherwise scale TS # Convert transparency % to opacity # alpha = 0: transparent # alpha = 1: opaque alpha = 1 - myTransparencyPercent / 100.0 mySymbol.setAlpha(alpha) myRange = QgsRendererRangeV2(myMin, myMax, mySymbol, myLabel) myRangeList.append(myRange) myRenderer = QgsGraduatedSymbolRendererV2('', myRangeList) myRenderer.setMode(QgsGraduatedSymbolRendererV2.EqualInterval) myRenderer.setClassAttribute(myTargetField) theQgisVectorLayer.setRendererV2(myRenderer) theQgisVectorLayer.saveDefaultStyle()
def set_vector_categorized_style(vector_layer, style): """Set categorized QGIS vector style based on InaSAFE style dictionary. For **opaque** a value of **0** can be used. For **fully transparent**, a value of **100** can be used. The calling function should take care to scale the transparency level to between 0 and 100. :param vector_layer: A QGIS vector layer that will be styled. :type vector_layer: QgsVectorLayer :param style: Dictionary of the form as in the example below. :type style: dict :returns: None - Sets and saves style for vector_layer Example:: {'target_field': 'DMGLEVEL', 'style_classes': [{'transparency': 1, 'value': 1, 'colour': '#fecc5c', 'label': 'Low damage', 'size' : 1}, {'transparency': 55, 'value': 2, 'colour': '#fd8d3c', 'label': 'Medium damage', 'size' : 1}, {'transparency': 80, 'value': 3, 'colour': '#f31a1c', 'label': 'High damage', 'size' : 1}]} .. note:: The transparency and size keys are optional. Size applies to points only. .. note:: We should change 'value' in style classes to something more meaningful e.g. discriminant value """ myTargetField = style['target_field'] myClasses = style['style_classes'] myGeometryType = vector_layer.geometryType() myCategoryList = [] for myClass in myClasses: # Transparency 100: transparent # Transparency 0: opaque mySize = 2 # mm if 'size' in myClass: mySize = myClass['size'] myTransparencyPercent = 0 if 'transparency' in myClass: myTransparencyPercent = myClass['transparency'] if 'value' not in myClass: raise StyleError('Style info should provide a "value" entry') try: myValue = float(myClass['value']) except TypeError: raise StyleError( 'Value should be a number. I got %s' % myClass['value']) myColour = myClass['colour'] myLabel = myClass['label'] myColour = QtGui.QColor(myColour) # noinspection PyArgumentList mySymbol = QgsSymbolV2.defaultSymbol(myGeometryType) myColourString = "%s, %s, %s" % ( myColour.red(), myColour.green(), myColour.blue()) # Work around for the fact that QgsSimpleMarkerSymbolLayerV2 # python bindings are missing from the QGIS api. # .. see:: http://hub.qgis.org/issues/4848 # We need to create a custom symbol layer as # the border colour of a symbol can not be set otherwise # noinspection PyArgumentList myRegistry = QgsSymbolLayerV2Registry.instance() if myGeometryType == QGis.Point: myMetadata = myRegistry.symbolLayerMetadata('SimpleMarker') # note that you can get a list of available layer properties # that you can set by doing e.g. # QgsSimpleMarkerSymbolLayerV2.properties() mySymbolLayer = myMetadata.createSymbolLayer({ 'color_border': myColourString}) mySymbolLayer.setSize(mySize) mySymbol.changeSymbolLayer(0, mySymbolLayer) elif myGeometryType == QGis.Polygon: myMetadata = myRegistry.symbolLayerMetadata('SimpleFill') mySymbolLayer = myMetadata.createSymbolLayer({ 'color_border': myColourString}) mySymbol.changeSymbolLayer(0, mySymbolLayer) else: # for lines we do nothing special as the property setting # below should give us what we require. pass mySymbol.setColor(myColour) # .. todo:: Check that vectors use alpha as % otherwise scale TS # Convert transparency % to opacity # alpha = 0: transparent # alpha = 1: opaque alpha = 1 - myTransparencyPercent / 100.0 mySymbol.setAlpha(alpha) myCategory = QgsRendererCategoryV2(myValue, mySymbol, myLabel) myCategoryList.append(myCategory) myRenderer = QgsCategorizedSymbolRendererV2('', myCategoryList) myRenderer.setClassAttribute(myTargetField) vector_layer.setRendererV2(myRenderer) vector_layer.saveDefaultStyle()