def saveSymbolLayerSprite(symbolLayer): sl = symbolLayer.clone() if isinstance(sl, QgsSVGFillSymbolLayer): patternWidth = sl.patternWidth() color = sl.svgFillColor() outlineColor = sl.svgOutlineColor() sl = QgsSvgMarkerSymbolLayer(sl.svgFilePath()) sl.setFillColor(color) sl.setOutlineColor(outlineColor) sl.setSize(patternWidth) sl.setOutputUnit(QgsSymbol.Pixel) sl2x = sl.clone() try: sl2x.setSize(sl2x.size() * 2) except AttributeError: return None, None newSymbol = QgsMarkerSymbol() newSymbol.appendSymbolLayer(sl) newSymbol.deleteSymbolLayer(0) newSymbol2x = QgsMarkerSymbol() newSymbol2x.appendSymbolLayer(sl2x) newSymbol2x.deleteSymbolLayer(0) img = newSymbol.asImage(QSize(sl.size(), sl.size())) img2x = newSymbol2x.asImage(QSize(sl2x.size(), sl2x.size())) return img, img2x
def getDefaultSymbol(size): symbol = QgsMarkerSymbol() for i in range(symbol.symbolLayerCount()): symbol.takeSymbolLayer(0) symbolLayer = QgsSvgMarkerSymbolLayer( os.path.join(os.path.dirname(__file__), 'svg', 'question.svg')) symbolLayer.setSizeUnit(3) symbolLayer.setSize(size) symbol.insertSymbolLayer(0, symbolLayer) return symbol
def getSymbolLayer(folder, svg, size): svg = svg + '.svg' root = os.path.join(os.path.dirname(__file__), 'svg', folder) filepath = None for base, dirs, files in os.walk(root): matching = fnmatch.filter(files, svg) if matching: filepath = os.path.join(base, matching[0]) break if filepath is not None: symbolLayer = QgsSvgMarkerSymbolLayer(filepath) symbolLayer.setSizeUnit(3) symbolLayer.setSize(size) return symbolLayer else: return None
def showRequestResult(self, items, append, last, message): # print("showRequestResult") if items is None or len(items) == 0: QApplication.restoreOverrideCursor() self.__show_status_label(StatusMessageType.LOAD_FINISHED) self.getDataButton.setEnabled(True) if message is None or len(message) == 0: message = "По указанным параметрам ничего не найдено" self._show_message(self, "Загузка завершена", message) return color = QColor(237, 28, 36, 200) pjt = QgsProject.instance() layersList = pjt.mapLayersByName(self.resultsLayerName) if not append: if layersList is not None and len(layersList) > 0: pjt.removeMapLayer(layersList[0]) # print("remove results") layersList.clear() if not append or layersList is None or len(layersList) == 0: # print("create layer") layer = QgsVectorLayer("Point?crs=EPSG:4326" "&field=coordinatesWKT:string(255)&field=shootingDateTime:string(255)" "&field=temperature:double(7)&field=pixelSizeInDirection:double(5)" "&field=pixelSizeAcross:double(5)&field=thermalPower:double(5)" "&field=baseResourceId:string(255)&field=id:string(255)&field=updated:string(255)" "&field=satellite:string(10)", self.resultsLayerName, "memory") else: layer = layersList[0] symbol = QgsSymbol.defaultSymbol(layer.geometryType()) svg_marker = QgsSvgMarkerSymbolLayer(":/plugins/thermal_anomaly/fire.svg") svg_marker.setSize(6.0) symbol.changeSymbolLayer(0, svg_marker) layer.renderer().setSymbol(symbol) layer.startEditing() print("all items=", len(items)) poly = QgsGeometry.fromWkt(self.polygon) for point in items: symbols = layer.renderer().symbols(QgsRenderContext()) # todo which context ? symbols[0].setColor(color) feature = QgsFeature() coord = QgsGeometry.fromWkt(point["coordinatesWKT"]) feature.setGeometry(coord) feature.setAttributes([point["coordinatesWKT"], point["shootingDateTime"], point["temperature"], point["pixelSizeInDirection"], point["pixelSizeAcross"], point["thermalPower"], point["baseResourceId"], point["id"], point["updated"], point["satellite"]]) layer.dataProvider().addFeatures([feature]) # if not poly.contains(coord): # print("point out of poly: id =", point["id"], "coord =", point["coordinatesWKT"]) layer.commitChanges() if not append: pjt.addMapLayer(layer, False) if pjt.layerTreeRoot().findGroup(self.tr(self.groupName)) is None: pjt.layerTreeRoot().insertChildNode(0, QgsLayerTreeGroup(self.tr(self.groupName))) group = pjt.layerTreeRoot().findGroup(self.tr(self.groupName)) group.insertLayer(0, layer) self.iface.layerTreeView().refreshLayerSymbology(layer.id()) self.iface.mapCanvas().refresh() if last: QApplication.restoreOverrideCursor() self.__show_status_label(StatusMessageType.LOAD_FINISHED) self.getDataButton.setEnabled(True) else: self.__show_status_label(StatusMessageType.LOAD_STARTED, message)
def generateIsochrones(point, profile, costingOptions, intervals, colors, basename, overwrite=True): response = valhalla.isochrones(point, profile, costingOptions, intervals, colors) features = getFeaturesFromResponse(response) if costingOptions.get("shortest"): suffix = "km" else: suffix = "min" for interval, feature in zip(intervals[::-1], features): # FIXME: we should use the 'contour' property in the feature to be sure of the contour line that we are # drawing, but due to a bug in qgis json parser, this property appears to be always set to '0' layername = "{} {} - {}".format(interval, suffix, basename) try: # FIXME: we do not consider if there are several layers with the same name here existinglayer = QgsProject.instance().mapLayersByName(layername)[0] if overwrite: QgsProject.instance().removeMapLayer(existinglayer.id()) else: raise OverwriteError( tr("layer {layername} already exists and overwrite is {overwrite}" ).format(layername=layername, overwrite=overwrite)) except IndexError: LOG.debug("this layer was not found: {}".format(layername)) layer = QgsVectorLayer( "Polygon?crs=epsg:4326&field=centerx:double&field=centery:double&field=interval:double", layername, "memory", ) pr = layer.dataProvider() qgsfeature = QgsFeature() qgsfeature.setAttributes([point.x(), point.y(), interval]) qgsfeature.setGeometry(feature.geometry()) pr.addFeatures([qgsfeature]) layer.updateExtents() QgsProject.instance().addMapLayer(layer) outlineColor = QColor(0, 0, 0) # Set opacity to 40% or 66 in hex (65% transparency) fillColor = QColor("#66" + feature["color"][1:]) renderer = QgsSingleSymbolRenderer.defaultRenderer( QgsWkbTypes.PolygonGeometry) symbol = renderer.symbol() symbol.setColor(fillColor) symbol.symbolLayer(0).setStrokeColor(outlineColor) layer.setRenderer(renderer) # Add center of reachability center_point_layer_name = tr("Center of {basename}").format( basename=basename) try: existinglayer = QgsProject.instance().mapLayersByName( center_point_layer_name)[0] if overwrite: QgsProject.instance().removeMapLayer(existinglayer.id()) else: raise OverwriteError( tr("layer {layername} already exists and overwrite is {overwrite}" ).format(layername=center_point_layer_name, overwrite=overwrite)) except IndexError: LOG.debug( "this layer was not found: {}".format(center_point_layer_name)) center_point = QgsVectorLayer( "Point?crs=epsg:4326", center_point_layer_name, "memory", ) pr = center_point.dataProvider() qgsfeature = QgsFeature() qgsfeature.setGeometry(QgsGeometry.fromPointXY(point)) pr.addFeatures([qgsfeature]) # symbology path = ":/kadas/icons/pin_red" symbol = QgsSvgMarkerSymbolLayer(path) symbol.setSize(10) symbol.setVerticalAnchorPoint(QgsMarkerSymbolLayer.Bottom) center_point.renderer().symbol().changeSymbolLayer(0, symbol) QgsProject.instance().addMapLayer(center_point)
def append_CharacterMarkerSymbolLayerAsSvg(symbol, layer, context: Context): # pylint: disable=too-many-locals """ Appends a CharacterMarkerSymbolLayer to a symbol, rendering the font character to an SVG file. """ font_family = layer.font character = chr(layer.unicode) color = symbol_color_to_qcolor(layer.color) angle = convert_angle(layer.angle) font = QFont(font_family) font.setPointSizeF(layer.size) # Using the rect of a painter path gives better results then using font metrics path = QPainterPath() path.setFillRule(Qt.WindingFill) path.addText(0, 0, font, character) rect = path.boundingRect() font_bounding_rect = QFontMetricsF(font).boundingRect(character) # adjust size -- marker size in esri is the font size, svg marker size in qgis is the svg rect size scale = rect.width() / font_bounding_rect.width() gen = QSvgGenerator() svg_path = symbol_name_to_filename(context.symbol_name, context.picture_folder, 'svg') gen.setFileName(svg_path) gen.setViewBox(rect) painter = QPainter(gen) painter.setFont(font) # todo -- size! if context.parameterise_svg: painter.setBrush(QBrush(QColor(255, 0, 0))) else: painter.setBrush(QBrush(color)) painter.setPen(Qt.NoPen) painter.drawPath(path) painter.end() if context.parameterise_svg: with open(svg_path, 'r') as f: t = f.read() t = t.replace('#ff0000', 'param(fill)') t = t.replace('fill-opacity="1" ', 'fill-opacity="param(fill-opacity)"') t = t.replace( 'stroke="none"', 'stroke="param(outline)" stroke-opacity="param(outline-opacity) 1" stroke-width="param(outline-width) 0"' ) with open(svg_path, 'w') as f: f.write(t) svg_path = context.convert_path(svg_path) out = QgsSvgMarkerSymbolLayer(svg_path) out.setSizeUnit(context.units) out.setSize(context.convert_size(scale * rect.width())) out.setAngle(angle) out.setFillColor(color) out.setStrokeWidth(0) out.setEnabled(layer.enabled) out.setLocked(layer.locked) out.setOffset( adjust_offset_for_rotation( QPointF(context.convert_size(layer.x_offset), -context.convert_size(layer.y_offset)), layer.angle)) out.setOffsetUnit(context.units) symbol.appendSymbolLayer(out)