def layer_value(feature, layer, defaultconfig): layername = defaultconfig['layer'] expression = defaultconfig['expression'] field = defaultconfig['field'] searchlayer = QgsMapLayerRegistry.instance().mapLayersByName(layername)[0] if feature.geometry(): rect = feature.geometry().boundingBox() if layer.geometryType() == QGis.Point: point = feature.geometry().asPoint() rect = QgsRectangle(point.x(), point.y(), point.x() + 10, point.y() + 10) else: rect.scale(20) rect = canvas.mapRenderer().mapToLayerCoordinates(layer, rect) rq = QgsFeatureRequest().setFilterRect(rect)\ .setFlags(QgsFeatureRequest.ExactIntersect) features = searchlayer.getFeatures(rq) else: features = searchlayer.getFeatures() exp = QgsExpression(expression) exp.prepare(searchlayer.pendingFields()) for f in features: if exp.evaluate(f): return f[field] raise DefaultError('No features found')
def preview(request, layer_slug): """Home page for layers. :param request: The web request. :param layer_slug: The layer """ layer = get_object_or_404(Layer, slug=layer_slug) layer_path = os.path.join( settings.MEDIA_ROOT, 'layers', layer.slug, 'raw') map_layer = QgsVectorLayer(layer_path, layer.name, 'ogr') QgsMapLayerRegistry.instance().addMapLayer(map_layer) layer_uri = tempfile.NamedTemporaryFile( suffix='.png', prefix='inasafe-web-', dir='/tmp/').name # create image image = QImage(QSize(100, 100), QImage.Format_ARGB32_Premultiplied) # set image's background color color = QColor(255, 255, 255) image.fill(color.rgb()) # create painter p = QPainter() p.begin(image) p.setRenderHint(QPainter.Antialiasing) renderer = QgsMapRenderer() # set layer set layers = [map_layer.id()] # add ID of every layer renderer.setLayerSet(layers) # set extent rect = QgsRectangle(renderer.fullExtent()) rect.scale(1.1) renderer.setExtent(rect) # set output size renderer.setOutputSize(image.size(), image.logicalDpiX()) # do the rendering renderer.render(p) p.end() # clean up registry_list = qgis_layers() QgsMapLayerRegistry.instance().removeMapLayer(map_layer.id()) print registry_list # save image image.save(layer_uri, 'png') with open(layer_uri, 'rb') as f: response = HttpResponse(f.read(), content_type='png') os.remove(layer_uri) return response
def layer_value(feature, layer, defaultconfig): if not canvas: roam.utils.warning("No canvas set for using layer_values default function") return None layers = [] # layer name can also be a list of layers to search layername = defaultconfig['layer'] if isinstance(layername, basestring): layers.append(layername) else: layers = layername expression = defaultconfig['expression'] field = defaultconfig['field'] for searchlayer in layers: try: searchlayer = QgsMapLayerRegistry.instance().mapLayersByName(searchlayer)[0] except IndexError: RoamEvents.raisemessage("Missing layer", "Unable to find layer used in widget expression {}".format(searchlayer), level=1) roam.utils.warning("Unable to find expression layer {}".format(searchlayer)) return if feature.geometry(): rect = feature.geometry().boundingBox() if layer.geometryType() == QGis.Point: point = feature.geometry().asPoint() rect = QgsRectangle(point.x(), point.y(), point.x() + 10, point.y() + 10) rect.scale(20) rect = canvas.mapRenderer().mapToLayerCoordinates(layer, rect) rq = QgsFeatureRequest().setFilterRect(rect)\ .setFlags(QgsFeatureRequest.ExactIntersect) features = searchlayer.getFeatures(rq) else: features = searchlayer.getFeatures() exp = QgsExpression(expression) exp.prepare(searchlayer.pendingFields()) if exp.hasParserError(): error = exp.parserErrorString() roam.utils.warning(error) for f in features: value = exp.evaluate(f) if exp.hasEvalError(): error = exp.evalErrorString() roam.utils.warning(error) if value: return f[field] raise DefaultError('No features found')
def updatecanvasfromgps(self, position, gpsinfo): # Recenter map if we go outside of the 95% of the area if not self.lastgpsposition == position: self.lastposition = position rect = QgsRectangle(position, position) extentlimt = QgsRectangle(self.canvas.extent()) extentlimt.scale(0.95) if not extentlimt.contains(position): self.canvas.setExtent(rect) self.canvas.refresh() self.marker.show() self.marker.setCenter(position) self.gpslabel.setText("GPS: PDOP {} HDOP {} VDOP {}".format(gpsinfo.pdop, gpsinfo.hdop, gpsinfo.vdop))
def gps_update_canvas(self, position, gpsinfo): # Recenter map if we go outside of the 95% of the area if self.gpslogging.logging: self.gpsband.addPoint(position) self.gpsband.show() if roam.config.settings.get('gpscenter', True): if not self.lastgpsposition == position: self.lastposition = position rect = QgsRectangle(position, position) extentlimt = QgsRectangle(self.canvas.extent()) extentlimt.scale(0.95) if not extentlimt.contains(position): self.zoom_to_location(position) self.marker.show() self.marker.setCenter(position)
def testDimensions(self): rect = QgsRectangle(0.0, 0.0, 10.0, 10.0) myMessage = "Expected: %s\nGot: %s\n" % (10.0, rect.width()) assert rect.width() == 10.0, myMessage myMessage = "Expected: %s\nGot: %s\n" % (10.0, rect.height()) assert rect.height() == 10.0, myMessage myMessage = "Expected: %s\nGot: %s\n" % ("5.0, 5.0", rect.center().toString()) assert rect.center() == QgsPoint(5.0, 5.0), myMessage rect.scale(2.0) myMessage = "Expected: %s\nGot: %s\n" % (20.0, rect.width()) assert rect.width() == 20.0, myMessage myMessage = "Expected: %s\nGot: %s\n" % (20.0, rect.height()) assert rect.height() == 20.0, myMessage
def testDimensions(self): rect = QgsRectangle(0.0, 0.0, 10.0, 10.0) myMessage = ('Expected: %s\nGot: %s\n' % (10.0, rect.width())) assert rect.width() == 10.0, myMessage myMessage = ('Expected: %s\nGot: %s\n' % (10.0, rect.height())) assert rect.height() == 10.0, myMessage myMessage = ('Expected: %s\nGot: %s\n' % ("5.0, 5.0", rect.center().toString())) assert rect.center() == QgsPointXY(5.0, 5.0), myMessage rect.scale(2.0) myMessage = ('Expected: %s\nGot: %s\n' % (20.0, rect.width())) assert rect.width() == 20.0, myMessage myMessage = ('Expected: %s\nGot: %s\n' % (20.0, rect.height())) assert rect.height() == 20.0, myMessage
def locationChanged(self, lat, lng, yaw, angle): transform = self.coordinatetransform() point = transform.transform(float(lng), float(lat)) self.marker.setCenter(point) yaw = float(yaw) self.marker.setAngle(angle) self.marker.setYaw(yaw) self.marker.setTracking(self.viewer.tracking) if self.marker.tracking: rect = QgsRectangle(point, point) extentlimt = QgsRectangle(self.canvas.extent()) extentlimt.scale(0.95) if not extentlimt.contains(point): self.canvas.setExtent(rect) self.canvas.refresh() # Clear old features self.viewer.clear_features() self.load_layer_features(point)
def layer_value(feature, layer, defaultconfig): if not canvas: roam.utils.warning("No canvas set for using layer_values default function") return None layers = [] # layer name can also be a list of layers to search layername = defaultconfig['layer'] if isinstance(layername, basestring): layers.append(layername) else: layers = layername expression = defaultconfig['expression'] field = defaultconfig['field'] for searchlayer in layers: searchlayer = QgsMapLayerRegistry.instance().mapLayersByName(searchlayer)[0] if feature.geometry(): rect = feature.geometry().boundingBox() if layer.geometryType() == QGis.Point: point = feature.geometry().asPoint() rect = QgsRectangle(point.x(), point.y(), point.x() + 10, point.y() + 10) else: rect.scale(20) rect = canvas.mapRenderer().mapToLayerCoordinates(layer, rect) rq = QgsFeatureRequest().setFilterRect(rect)\ .setFlags(QgsFeatureRequest.ExactIntersect) features = searchlayer.getFeatures(rq) else: features = searchlayer.getFeatures() exp = QgsExpression(expression) exp.prepare(searchlayer.pendingFields()) for f in features: if exp.evaluate(f): return f[field] raise DefaultError('No features found')
def set_zoom(iface, extra_extent): """Sets the zoom level to include all layers (excluding tiles layer) with some extra extent Parameters ---------- iface: QGIS interface The QGIS iface module. extra_extent: float How much extra space around the layers eg. 1.1 is 10% extra """ zoom_extent = QgsRectangle() for layer in QgsProject.instance().mapLayers().values(): if 'xyz&url' not in layer.source(): zoom_extent.combineExtentWith(layer.extent()) if zoom_extent.center().x() != 0.0: wgsCRS = QgsCoordinateReferenceSystem(4326) QgsProject.instance().setCrs(wgsCRS) zoom_extent.scale(extra_extent) iface.mapCanvas().setExtent(zoom_extent) iface.mapCanvas().refresh() wgsCRS = QgsCoordinateReferenceSystem(3857) QgsProject.instance().setCrs(wgsCRS)
def gps_update_canvas(self, position, gpsinfo): """ Updates the map canvas based on the GPS position. By default if the GPS is outside the canvas extent the canvas will move to center on the GPS. Can be turned off in settings. :param postion: The current GPS position. :param gpsinfo: The extra GPS information """ # Recenter map if we go outside of the 95% of the area if self.gpslogging.logging: self.gpsband.addPoint(position) self.gpsband.show() if roam.config.settings.get('gpscenter', True): if not self.lastgpsposition == position: self.lastgpsposition = position rect = QgsRectangle(position, position) extentlimt = QgsRectangle(self.canvas.extent()) extentlimt.scale(0.95) if not extentlimt.contains(position): self.zoom_to_location(position) self.gpsMarker.show() self.gpsMarker.setCenter(position, gpsinfo)
def gps_update_canvas(self, position, gpsinfo): """ Updates the map canvas based on the GPS position. By default if the GPS is outside the canvas extent the canvas will move to center on the GPS. Can be turned off in settings. :param postion: The current GPS position. :param gpsinfo: The extra GPS information """ # Recenter map if we go outside of the 95% of the area if self.gpslogging.logging: self.gpsband.addPoint(position) self.gpsband.show() if roam.config.settings.get('gpscenter', True): if not self.lastgpsposition == position: self.lastposition = position rect = QgsRectangle(position, position) extentlimt = QgsRectangle(self.canvas.extent()) extentlimt.scale(0.95) if not extentlimt.contains(position): self.zoom_to_location(position) self.marker.show() self.marker.setCenter(position, gpsinfo)
def zoom_to_extent(self, evt): rect = QgsRectangle(self._geom_bbox_in_project_crs()) rect.scale(1.05) iface.mapCanvas().setExtent(rect) iface.mapCanvas().refresh()
def updateDisplay(self): ''' Add map(s) of all QF components to the canvas based on what's selected in self.lstTimes''' timestamps = [ pd.datetime.strptime(newItem.text(), '%Y-%m-%d %H:%M') for newItem in self.lstTimes.selectedItems() ] for t in timestamps: outs = pd.read_csv(self.model.getFileList()[t], header=0, index_col=0) outLayer = self.outputLayer # Make sure the output file is properly appended (this gets evaluated for non-extra-disaggregated datasets) # because I didn't set an output shapefile path properly if os.path.split(self.outputLayer)[0] == '': outLayer = os.path.join(self.model.downscaledPath, os.path.split(self.outputLayer)[1]) fileToPopulate = self.outputLayer new_layer = populateShapefileFromTemplate( outs, self.featureIdField, outLayer, int(self.outputEPSG), title=t.strftime(' %Y-%m-%d %H:%M UTC')) # Set ranges suited to all the different QF types range_minima = [0, 0.000001, 0.1, 1, 10, 100] range_maxima = [0.000001, 0.1, 1, 10, 100, 1000] colours = [ '#CECECE', '#FEE6CE', '#FDAE6B', '#F16913', '#D94801', '#7F2704' ] opacity = 1 for component in self.componentTranslation.values(): layerName = component + t.strftime(' %Y-%m-%d %H:%M UTC') if component == self.componentTranslation.values()[0]: colourRanges(new_layer, component, opacity, range_minima, range_maxima, colours) new_layer.setLayerName(layerName) layerId = new_layer.id() QgsMapLayerRegistry.instance().addMapLayer(new_layer) proportion = new_layer.extent().height( ) / new_layer.extent().width() else: # Have to clone. Can't seem to duplicate a map layer... layer = duplicateVectorLayer(new_layer) layer.setLayerName(layerName) colourRanges(layer, component, opacity, range_minima, range_maxima, colours) layerId = layer.id() QgsMapLayerRegistry.instance().addMapLayer(layer) proportion = layer.extent().height() / layer.extent( ).width() maxSize = 2000 # Max size of output image if proportion > 1: hSize = maxSize / proportion vSize = maxSize else: hSize = maxSize vSize = maxSize * proportion # create image in proportion with layer img = QImage(QSize(hSize, vSize), QImage.Format_ARGB32_Premultiplied) # set image's background color color = QColor(255, 255, 255) img.fill(color.rgb()) # create painter p = QPainter() p.begin(img) p.setRenderHint(QPainter.Antialiasing) render = QgsMapRenderer() # set layer set lst = [layerId] # add ID of every layer render.setLayerSet(lst) # set extent rect = QgsRectangle(render.fullExtent()) rect.scale(1.1) render.setExtent(rect) # set output size render.setOutputSize(img.size(), img.logicalDpiX()) # do the rendering render.render(p) p.end() # save image img.save( os.path.join( self.model.renderPath, component + t.strftime('_%Y-%m-%d_%H-%M_UTC.png')), "png")
def cvt_vtr(self): QSWATMOD_path_dict = self.dirs_and_paths() selectedVector = self.dlg.comboBox_vector_lyrs.currentText() layer = QgsProject.instance().mapLayersByName(str(selectedVector))[0] # Find .dis file and read number of rows, cols, x spacing, and y spacing (not allowed to change) for filename in glob.glob(str(QSWATMOD_path_dict['SMfolder']) + "/*.dis"): with open(filename, "r") as f: data = [] for line in f.readlines(): if not line.startswith("#"): data.append(line.replace('\n', '').split()) nrow = int(data[0][1]) ncol = int(data[0][2]) delr = float(data[2][1]) # is the cell width along rows (y spacing) delc = float( data[3][1]) # is the cell width along columns (x spacing). # get extent ext = layer.extent() xmin = ext.xMinimum() xmax = ext.xMaximum() ymin = ext.yMinimum() ymax = ext.yMaximum() extent = "{a},{b},{c},{d}".format(a=xmin, b=xmax, c=ymin, d=ymax) fdnames = [ field.name() for field in layer.dataProvider().fields() if not (field.name() == 'fid' or field.name() == 'id' or field.name() == 'xmin' or field.name() == 'xmax' or field.name() == 'ymin' or field.name() == 'ymax' or field.name() == 'grid_id' or field.name() == 'row' or field.name() == 'col' or field.name() == 'elev_mf') ] # Create swatmf_results tree inside root = QgsProject.instance().layerTreeRoot() if root.findGroup("swatmf_results"): swatmf_results = root.findGroup("swatmf_results") else: swatmf_results = root.insertGroup(0, "swatmf_results") if root.findGroup(selectedVector): rastergroup = root.findGroup(selectedVector) else: rastergroup = swatmf_results.insertGroup(0, selectedVector) per = 0 self.dlg.progressBar_cvt_vtr.setValue(0) for fdnam in fdnames: QCoreApplication.processEvents() nodata = float(self.dlg.lineEdit_nodata.text()) mincolor = self.dlg.mColorButton_min_rmap.color().name() maxcolor = self.dlg.mColorButton_max_rmap.color().name() name = fdnam name_ext = "{}.tif".format(name) output_dir = QSWATMOD_path_dict['SMshps'] # create folder for each layer output rasterpath = os.path.join(output_dir, selectedVector) if not os.path.exists(rasterpath): os.makedirs(rasterpath) output_raster = os.path.join(rasterpath, name_ext) params = { 'INPUT': layer, 'FIELD': fdnam, 'UNITS': 1, 'WIDTH': delc, 'HEIGHT': delr, 'EXTENT': extent, 'NODATA': nodata, 'DATA_TYPE': 5, #Float32 'OUTPUT': output_raster } processing.run("gdal:rasterize", params) rasterlayer = QgsRasterLayer(output_raster, '{0} ({1})'.format(fdnam, selectedVector)) QgsProject.instance().addMapLayer(rasterlayer, False) rastergroup.insertChildNode(0, QgsLayerTreeLayer(rasterlayer)) stats = rasterlayer.dataProvider().bandStatistics( 1, QgsRasterBandStats.All) rmin = stats.minimumValue rmax = stats.maximumValue fnc = QgsColorRampShader() lst = [ QgsColorRampShader.ColorRampItem(rmin, QColor(mincolor)), QgsColorRampShader.ColorRampItem(rmax, QColor(maxcolor)) ] fnc.setColorRampItemList(lst) fnc.setColorRampType(QgsColorRampShader.Interpolated) shader = QgsRasterShader() shader.setRasterShaderFunction(fnc) renderer = QgsSingleBandPseudoColorRenderer(rasterlayer.dataProvider(), 1, shader) rasterlayer.setRenderer(renderer) rasterlayer.triggerRepaint() # create image img = QImage(QSize(800, 800), QImage.Format_ARGB32_Premultiplied) # set background color # bcolor = QColor(255, 255, 255, 255) bcolor = QColor(255, 255, 255, 0) img.fill(bcolor.rgba()) # create painter p = QPainter() p.begin(img) p.setRenderHint(QPainter.Antialiasing) # create map settings ms = QgsMapSettings() ms.setBackgroundColor(bcolor) # set layers to render flayer = QgsProject.instance().mapLayersByName(rasterlayer.name()) ms.setLayers([flayer[0]]) # set extent rect = QgsRectangle(ms.fullExtent()) rect.scale(1.1) ms.setExtent(rect) # set ouptut size ms.setOutputSize(img.size()) # setup qgis map renderer render = QgsMapRendererCustomPainterJob(ms, p) render.start() render.waitForFinished() # get timestamp p.drawImage(QPoint(), img) pen = QPen(Qt.red) pen.setWidth(2) p.setPen(pen) font = QFont() font.setFamily('Times') # font.setBold(True) font.setPointSize(18) p.setFont(font) # p.setBackground(QColor('sea green')) doesn't work p.drawText(QRect(0, 0, 800, 800), Qt.AlignRight | Qt.AlignBottom, fdnam) p.end() # save the image img.save(os.path.join(rasterpath, '{:03d}_{}.jpg'.format(per, fdnam))) # Update progress bar per += 1 progress = round((per / len(fdnames)) * 100) self.dlg.progressBar_cvt_vtr.setValue(progress) QCoreApplication.processEvents() self.dlg.raise_() duration = self.dlg.doubleSpinBox_ani_r_time.value() # filepaths fp_in = os.path.join(rasterpath, '*.jpg') fp_out = os.path.join(rasterpath, '{}.gif'.format(selectedVector)) # https://pillow.readthedocs.io/en/stable/handbook/image-file-formats.html#gif fimg, *fimgs = [Image.open(f) for f in sorted(glob.glob(fp_in))] fimg.save(fp=fp_out, format='GIF', append_images=fimgs, save_all=True, duration=duration * 1000, loop=0, transparency=0) msgBox = QMessageBox() msgBox.setWindowIcon(QtGui.QIcon(':/QSWATMOD2/pics/sm_icon.png')) msgBox.setWindowTitle("Coverted!") msgBox.setText( "Fields from {} were converted successfully!".format(selectedVector)) msgBox.exec_() questionBox = QMessageBox() questionBox.setWindowIcon(QtGui.QIcon(':/QSWATMOD2/pics/sm_icon.png')) reply = QMessageBox.question(questionBox, 'Open?', 'Do you want to open the animated gif file?', QMessageBox.Yes, QMessageBox.No) if reply == QMessageBox.Yes: os.startfile(os.path.join(rasterpath, '{}.gif'.format(selectedVector)))
def _on_set_schematisation(self, something, filename=""): """Method is called when schematisation setting is changed in datasource model. Args: something: filename: Returns: None """ self.init_references_from_layer_tree() tracer = dict([(ref, ident) for ident, ref in self.tracer_mapping]) if filename == "": if self.model_layergroup is not None: self.model_layergroup.removeAllChildren() return split = os.path.split(filename) split_dir = os.path.split(split[0]) name = self.model_layergroup_basename + "/".join( (split_dir[-1], split[-1])) # adjust spatialite for correct visualization of layers threedi_db = ThreediDatabase({"db_path": filename}) threedi_db.create_views() threedi_db.fix_spatial_indices() if self.model_layergroup is None: # todo: see if we can set 'tracer' as custom property to identify # group later on root = QgsProject.instance().layerTreeRoot() self.model_layergroup = root.insertGroup(2, name) self._mark(self.model_layergroup, tracer["model_layergroup"]) else: self.model_layergroup.setName(name) if self.schematisation_layergroup is None: self.schematisation_layergroup = self.model_layergroup.insertGroup( 1, self.schematisation_group_name) self._mark(self.schematisation_layergroup, tracer["schematisation_layergroup"]) else: self.schematisation_layergroup.removeAllChildren() self.schematisation_layergroup.insertGroup( 0, self.schematisation_advanced_settings_group_name) # schematisation_inflow_group_name = 'inflow' # inflow_imp_surface_subgroup_name = 'impervious_surface' # inflow_surface_subgroup_name = 'surface' self.inflow_root = self.schematisation_layergroup.insertGroup( 1, self.schematisation_inflow_group_name) self.inflow_root.addGroup(self.inflow_imp_surface_subgroup_name) self.inflow_root.addGroup(self.inflow_surface_subgroup_name) self.schematisation_layergroup.insertGroup( 0, self.schematisation_grid_refinement_group_name) self.schematisation_layergroup.insertGroup( 0, self.schematisation_obstacle_group_name) self.schematisation_layergroup.insertGroup( 0, self.schematisation_additional_oned_group_name) self.schematisation_layergroup.insertGroup( 0, self.schematisation_oned_group_name) self.schematisation_layergroup.insertGroup( 0, self.schematisation_lateral_group_name) self.schematisation_layergroup.insertGroup( 0, self.schematisation_boundary_group_name) self.schematisation_layergroup.insertGroup( 0, self.schematisation_settings_group_name) # add_schematisation layers self._add_model_schematisation_layers(filename) # zoom to model extent: extent = QgsRectangle() extent.setMinimal() tree_layer = None for tree_layer in self.schematisation_layergroup.findLayers(): extent.combineExtentWith(tree_layer.layer().extent()) extent.scale(1.1) if not tree_layer: return transform = QgsCoordinateTransform(tree_layer.layer().crs(), QgsProject.instance().crs(), QgsProject.instance()) self.iface.mapCanvas().setExtent(transform.transform(extent)) return
def center_to_point(self, point): canvas = self.iface.mapCanvas() new_extent = QgsRectangle(canvas.extent()) new_extent.scale(1, point) canvas.setExtent(new_extent) canvas.refresh()
def moveCanvas(self, newCenter, oldExtent): newExtent = QgsRectangle(oldExtent) newExtent.scale(1, newCenter) self.canvas.setExtent(newExtent) self.canvas.refresh()
def doMask(self, item): mapcrs = self.plugin.canvas.mapSettings().destinationCrs() ogrFeature = item.data(Qt.UserRole) layerName = "OSM "+ogrFeature.GetFieldAsString('id') geom = QgsGeometry.fromWkt(ogrFeature.GetGeometryRef().ExportToWkt()) self.transform(geom) if (geom.type() == QgsWkbTypes.PolygonGeometry): try: try: from mask import aeag_mask except: from mask_plugin import aeag_mask aeag_mask.do(mapcrs, {geom}, "Mask "+layerName) except: geom = QgsGeometry.fromWkt(ogrFeature.GetGeometryRef().ExportToWkt()) self.transform(geom) toCrs = self.plugin.canvas.mapSettings().destinationCrs() larg = max(geom.boundingBox().width(), geom.boundingBox().height()) x = geom.boundingBox().center().x() y = geom.boundingBox().center().y() rect = QgsRectangle(x-larg, y-larg, x+larg, y+larg) # geom.boundingBox() rect.scale(4) mask = QgsGeometry.fromRect(rect) mask = mask.difference(geom) maskLayer = QgsVectorLayer("MultiPolygon", "Mask "+layerName, "memory") maskLayer.setCrs(toCrs) QgsProject.instance().addMapLayer(maskLayer) pr = maskLayer.dataProvider() fields = QgsFields() fields.append(QgsField("id", QVariant.String)) fields.append(QgsField("name", QVariant.String)) fet = QgsFeature() fet.initAttributes(2) fet.setGeometry(mask) fet.setFields(fields) fet.setAttribute("id", (ogrFeature.GetFieldAsString('id'))) fet.setAttribute("name", (ogrFeature.GetFieldAsString('name'))) pr.addAttributes(fields.toList()) maskLayer.startEditing() pr.addFeatures([fet]) maskLayer.commitChanges() maskLayer.updateExtents() # transparence, epaisseur renderer = maskLayer.renderer() s = renderer.symbol() s.setOpacity(0.90) s.setColor(QColor(255, 255, 255)) if isinstance(s, QgsLineSymbol): s.setWidth(0) layerTree = QgsProject.instance().layerTreeRoot().findLayer(maskLayer) if layerTree: self.plugin.iface.layerTreeView().layerTreeModel()\ .refreshLayerLegend(layerTree) # Refresh legend self.go(item)
def layer_value(feature, layer, defaultconfig): if not canvas: roam.utils.warning( "No canvas set for using layer_values default function") return None layers = [] # layer name can also be a list of layers to search layername = defaultconfig['layer'] if isinstance(layername, basestring): layers.append(layername) else: layers = layername expression = defaultconfig['expression'] field = defaultconfig['field'] for searchlayer in layers: try: searchlayer = QgsMapLayerRegistry.instance().mapLayersByName( searchlayer)[0] except IndexError: RoamEvents.raisemessage( "Missing layer", "Unable to find layer used in widget expression {}".format( searchlayer), level=1) roam.utils.warning( "Unable to find expression layer {}".format(searchlayer)) return if feature.geometry(): rect = feature.geometry().boundingBox() if layer.geometryType() == QGis.Point: point = feature.geometry().asPoint() rect = QgsRectangle(point.x(), point.y(), point.x() + 10, point.y() + 10) rect.scale(20) rect = canvas.mapRenderer().mapToLayerCoordinates(layer, rect) rq = QgsFeatureRequest().setFilterRect(rect) \ .setFlags(QgsFeatureRequest.ExactIntersect) features = searchlayer.getFeatures(rq) else: features = searchlayer.getFeatures() expression = expression.replace("$roamgeometry", "@roamgeometry") exp = QgsExpression(expression) exp.prepare(searchlayer.pendingFields()) if exp.hasParserError(): error = exp.parserErrorString() roam.utils.warning(error) context = QgsExpressionContext() scope = QgsExpressionContextScope() context.appendScope(scope) scope.setVariable("roamgeometry", feature.geometry()) for f in features: context.setFeature(f) value = exp.evaluate(context) if exp.hasEvalError(): error = exp.evalErrorString() roam.utils.warning(error) if value: return f[field] raise DefaultError('No features found')
def run(self): project_id = self.settings.value("project/id") epsg = self.settings.value("project/epsg") locale = QSettings().value('locale/userLocale')[0:2] if not project_id: self.message_bar.pushCritical( "Error", _translate("VeriSO_EE_Geb_LokTest", "project_id not set", None)) return QApplication.setOverrideCursor(Qt.WaitCursor) try: group = _translate("VeriSO_EE_Geb_LokTest", "Gebaeudeadressen - Lokalisationstest", None) group += " (" + str(project_id) + ")" # TODO: Check "tid" vs. t_ili_tid... in queries. Do not import # i_ili_tid? # define layer names here lokalisation = _translate("VeriSO_EE_Geb_LokTest", "Lokalisation Lokalisationstest", None) strassenstueck_geometrie = _translate( "VeriSO_EE_Geb_LokTest", "Strassenstueck (geometrie) " "Lokalisationstest", None) strassenstueck_anfangspunkt = _translate( "VeriSO_EE_Geb_LokTest", "Strassenstueck (" "anfangspunkt) " "Lokalisationstest", None) benanntesgebiet = _translate("VeriSO_EE_Geb_LokTest", "Benanntes Gebiet Lokalisationstest", None) gebaeudeeingang = _translate("VeriSO_EE_Geb_LokTest", "Gebaeudeeingang Lokalisationstest", None) shortestline = _translate("VeriSO_EE_Geb_LokTest", "Kuerzeste Linie Lokalisationstest", None) hausnummerpos = _translate("VeriSO_EE_Geb_LokTest", "HausnummerPos Lokalisationstest", None) lokalisationsname = _translate("VeriSO_EE_Geb_LokTest", "LokalisationsName", None) vlayer_lokalisation = self.get_vector_layer_by_name(lokalisation) if not vlayer_lokalisation: layer = { "type": "postgres", "title": lokalisation, "featuretype": "gebaeudeadressen_lokalisation", "key": "ogc_fid", "sql": "ogc_fid = -1", "readonly": True, "group": group } vlayer_lokalisation = self.layer_loader.load(layer) vlayer_strassenstueck_geometrie = self.get_vector_layer_by_name( strassenstueck_geometrie) if not vlayer_strassenstueck_geometrie: layer = { "type": "postgres", "title": "Strassenstueck (geometrie) Lokalisationstest", "featuretype": "gebaeudeadressen_strassenstueck", "geom": "geometrie", "key": "ogc_fid", "sql": "strassenstueck_von = -1", "readonly": True, "group": group, "style": "global_qml/gebaeudeadressen/strassenachsen_rot" ".qml" } vlayer_strassenstueck_geometrie = self.layer_loader.load(layer) vlayer_strassenstueck_anfangspunkt = self.get_vector_layer_by_name( strassenstueck_anfangspunkt) if not vlayer_strassenstueck_anfangspunkt: layer = { "type": "postgres", "title": "Strassenstueck (anfangspunkt) Lokalisationstest", "featuretype": "gebaeudeadressen_strassenstueck", "geom": "anfangspunkt", "key": "ogc_fid", "sql": "strassenstueck_von = -1", "readonly": True, "group": group, "style": "global_qml/gebaeudeadressen/anfangspunkt_rot.qml" } vlayer_strassenstueck_anfangspunkt = self.layer_loader.load( layer) vlayer_benanntesgebiet = self.get_vector_layer_by_name( benanntesgebiet) if not vlayer_benanntesgebiet: layer = { "type": "postgres", "title": "Benanntes Gebiet Lokalisationstest", "featuretype": "gebaeudeadressen_benanntesgebiet", "geom": "flaeche", "key": "ogc_fid", "sql": "benanntesgebiet_von = -1", "readonly": True, "group": group, "style": "global_qml/gebaeudeadressen/benanntesgebiet_rot" ".qml" } vlayer_benanntesgebiet = self.layer_loader.load(layer) vlayer_gebaeudeeingang = self.get_vector_layer_by_name( gebaeudeeingang) if not vlayer_gebaeudeeingang: layer = { "type": "postgres", "title": "Gebaeudeeingang Lokalisationstest", "featuretype": "gebaeudeadressen_gebaeudeeingang", "geom": "lage", "key": "ogc_fid", "sql": "gebaeudeeingang_von = -1", "readonly": True, "group": group, "style": "global_qml/gebaeudeadressen/gebaeudeeingang_rot" ".qml" } vlayer_gebaeudeeingang = self.layer_loader.load(layer) vlayer_shortestline = self.get_vector_layer_by_name(shortestline) if not vlayer_shortestline: layer = { "type": "postgres", "title": "Kuerzeste Linie Lokalisationstest", "featuretype": "t_shortestline_hausnummerpos", "geom": "the_geom", "key": "ogc_fid", "sql": "lok_tid = -1", "readonly": True, "group": group, "style": "global_qml/gebaeudeadressen/shortestline_linie_rot.qml" } vlayer_shortestline = self.layer_loader.load(layer) vlayer_hausnummerpos = self.get_vector_layer_by_name(hausnummerpos) if not vlayer_hausnummerpos: layer = { "type": "postgres", "title": "HausnummerPos Lokalisationstest", "featuretype": "v_gebaeudeadressen_hausnummerpos", "geom": "pos", "key": "ogc_fid", "sql": "lok_tid = -1", "readonly": True, "group": group, "style": "global_qml/gebaeudeadressen/hausnummerpos_rot.qml" } vlayer_hausnummerpos = self.layer_loader.load(layer) vlayer_lokalisationsname = self.get_vector_layer_by_name( lokalisationsname) if not vlayer_lokalisationsname: self.message_bar.pushMessage( "Error", _translate("VeriSO_EE_Geb_LokTest", "Layer _LokalisationsName_ not found.", None), level=QgsMessageBar.CRITICAL, duration=0) QApplication.restoreOverrideCursor() return iterator = vlayer_lokalisationsname.getFeatures() ids = [] for feature in iterator: ids.append(feature.id()) if vlayer_lokalisationsname.selectedFeatureCount() < 1: self.message_bar.pushCritical( "Error", _translate("VeriSO_EE_Geb_LokTest", "No _LokalisationsName_ selected.", None)) QApplication.restoreOverrideCursor() return if vlayer_lokalisationsname.selectedFeatureCount() > 1: self.message_bar.pushCritical( "Error", _translate( "VeriSO_EE_Geb_LokTest", "Please select only one (1) _LokalisationsName_.", None)) QApplication.restoreOverrideCursor() return feat = QgsFeature() id = vlayer_lokalisationsname.selectedFeaturesIds()[0] feat = vlayer_lokalisationsname.selectedFeatures()[0] idx = ids.index(id) benannte_idx = vlayer_lokalisationsname.fieldNameIndex("benannte") text_idx = vlayer_lokalisationsname.fieldNameIndex("atext") if benannte_idx == -1 or text_idx == -1: self.message_bar.pushCritical( "Error", _translate("VeriSO_EE_Geb_LokTest", "Field _benannte_ or _text_ not found.", None)) QApplication.restoreOverrideCursor() return benannte = feat.attributes()[benannte_idx] lokalisationsname = feat.attributes()[text_idx] vlayer_strassenstueck_geometrie.setSubsetString( "(strassenstueck_von = " + str(benannte) + ")") vlayer_strassenstueck_anfangspunkt.setSubsetString( "(strassenstueck_von = " + str(benannte) + ")") vlayer_benanntesgebiet.setSubsetString("(benanntesgebiet_von = " + str(benannte) + ")") vlayer_gebaeudeeingang.setSubsetString("(gebaeudeeingang_von = " + str(benannte) + ")") vlayer_lokalisation.setSubsetString("(ogc_fid = " + str(benannte) + ")") vlayer_shortestline.setSubsetString("(lok_tid = " + str(benannte) + ")") vlayer_hausnummerpos.setSubsetString("(lok_tid = " + str(benannte) + ")") if vlayer_strassenstueck_geometrie.featureCount() > 0: x_min = vlayer_strassenstueck_geometrie.extent().xMinimum() y_min = vlayer_strassenstueck_geometrie.extent().yMinimum() x_max = vlayer_strassenstueck_geometrie.extent().xMaximum() y_max = vlayer_strassenstueck_geometrie.extent().yMaximum() if vlayer_benanntesgebiet.featureCount() > 0: x_min = vlayer_benanntesgebiet.extent().xMinimum() y_min = vlayer_benanntesgebiet.extent().yMinimum() x_max = vlayer_benanntesgebiet.extent().xMaximum() y_max = vlayer_benanntesgebiet.extent().yMaximum() try: if vlayer_gebaeudeeingang.featureCount() > 0: if vlayer_gebaeudeeingang.extent().xMinimum() < x_min: x_min = vlayer_gebaeudeeingang.extent().xMinimum() if vlayer_gebaeudeeingang.extent().yMinimum() < y_min: y_min = vlayer_gebaeudeeingang.extent().yMinimum() if vlayer_gebaeudeeingang.extent().xMaximum() > x_max: x_max = vlayer_gebaeudeeingang.extent().xMaximum() if vlayer_gebaeudeeingang.extent().yMaximum() > y_max: y_max = vlayer_gebaeudeeingang.extent().yMaximum() rect = QgsRectangle(x_min, y_min, x_max, y_max) rect.scale(1.3) except UnboundLocalError: vlayer_gemeindegrenze = self.getVectorLayerByName( "Gemeindegrenze") if vlayer_gemeindegrenze is None: rect = self.canvas.fullExtent() else: rect = vlayer_gemeindegrenze.extent() self.iface.mapCanvas().setExtent(rect) self.iface.mapCanvas().refresh() iterator = vlayer_lokalisation.getFeatures() # only one feature is selected for feature in iterator: prinzip_idx = vlayer_lokalisation.fieldNameIndex( "nummerierungsprinzip_txt") attributeprovisorisch_idx = vlayer_lokalisation.fieldNameIndex( "attributeprovisorisch_txt") offiziell_idx = vlayer_lokalisation.fieldNameIndex( "istoffiziellebezeichnung_txt") status_idx = vlayer_lokalisation.fieldNameIndex("status_txt") inaenderung_idx = vlayer_lokalisation.fieldNameIndex( "inaenderung_txt") art_idx = vlayer_lokalisation.fieldNameIndex("art_txt") something_missing = (prinzip_idx == -1 or attributeprovisorisch_idx == -1 or offiziell_idx == -1 or status_idx == -1 or inaenderung_idx == -1 or art_idx == -1) if something_missing: self.message_bar.pushMessage("Error", _translate( "VeriSO_EE_Geb_LokTest", "Field not found.", None), level=QgsMessageBar.CRITICAL, duration=0) QApplication.restoreOverrideCursor() return prinzip = feature.attributes()[prinzip_idx] attributeprovisorisch = feature.attributes( )[attributeprovisorisch_idx] offiziell = feature.attributes()[offiziell_idx] status = feature.attributes()[status_idx] inaenderung = feature.attributes()[inaenderung_idx] art = feature.attributes()[art_idx] map_extent = self.canvas.extent() x = map_extent.xMinimum() y = map_extent.yMaximum() text_item_found = False items = list(self.iface.mapCanvas().scene().items()) for i in range(len(items)): try: name = items[i].data(0) if str(name) == "LokalisationsInfo": text_item = items[i] text_item_found = True except Exception: pass if not text_item_found: text_item = QgsTextAnnotationItem(self.canvas) text_item.setData(0, "LokalisationsInfo") # noinspection PyUnboundLocalVariable text_item.setMapPosition( QgsPoint(x + 10 * self.canvas.mapUnitsPerPixel(), y - 10 * self.canvas.mapUnitsPerPixel())) text_item.setMapPositionFixed(False) text_item.setFrameBorderWidth(0.0) text_item.setFrameColor(QColor(250, 250, 250, 255)) text_item.setFrameBackgroundColor(QColor(250, 250, 250, 123)) text_item.setFrameSize(QSizeF(250, 150)) text_document = QTextDocument() text_document.setHtml( "<table style='font-size:12px;'><tr><td>Lok.Name: </td><td>" + lokalisationsname + "</td></tr><tr><td>TID: </td><td>" + str(benannte) + "</td></tr> <tr><td>Num.prinzip: " "</td><td>" + str(prinzip) + "</td></tr> <tr><td>Attr. prov.: </td><td>" + str(attributeprovisorisch) + "</td></tr> <tr><td>ist " "offiziell: </td><td>" + str(offiziell) + "</td></tr> <tr><td>Status: " "</td><td>" + str(status) + "</td></tr> <tr><td>in Aenderung: " "</td><td>" + str(inaenderung) + "</td></tr> <tr><td>Art: " "</td><td>" + str(art) + "</td></tr> </table>") text_item.setDocument(text_document) # This is a workaround: first ever position is not correct. text_item.setMapPosition( QgsPoint(x + 10 * self.canvas.mapUnitsPerPixel(), y - 10 * self.canvas.mapUnitsPerPixel())) text_item.update() self.iface.mapCanvas().refresh() try: vlayer_lokalisationsname.setSelectedFeatures([ids[idx + 1]]) except IndexError: self.message_bar.pushInfo( "Information", _translate("VeriSO_EE_Geb_LokTest", "End of table.", None)) except Exception as e: QApplication.restoreOverrideCursor() exc_type, exc_value, exc_traceback = sys.exc_info() self.message_bar.pushMessage( "Error", str(traceback.format_exc(exc_traceback)), level=QgsMessageBar.CRITICAL, duration=0) QApplication.restoreOverrideCursor() QApplication.restoreOverrideCursor()
def doMask(self, item): mapcrs = self.plugin.canvas.mapSettings().destinationCrs() ogrFeature = item.data(Qt.UserRole) layerName = "OSM "+ogrFeature.GetFieldAsString('id') geom = QgsGeometry.fromWkt(ogrFeature.GetGeometryRef().ExportToWkt()) if (geom.type() == QgsWkbTypes.PolygonGeometry): try: try: from mask import aeag_mask except: from mask_plugin import aeag_mask aeag_mask.do(mapcrs, {geom}, "Mask "+layerName) except: geom = QgsGeometry.fromWkt(ogrFeature.GetGeometryRef().ExportToWkt()) toCrs = self.plugin.canvas.mapSettings().destinationCrs() l = max(geom.boundingBox().width(), geom.boundingBox().height()) x = geom.boundingBox().center().x() y = geom.boundingBox().center().y() rect = QgsRectangle(x-l, y-l, x+l, y+l) # geom.boundingBox() rect.scale(4) mask = QgsGeometry.fromRect(rect) mask = mask.difference(geom) maskLayer = QgsVectorLayer("MultiPolygon", "Mask "+layerName, "memory") maskLayer.setCrs(toCrs) QgsProject.instance().addMapLayer(maskLayer) pr = maskLayer.dataProvider() fields = QgsFields() fields.append(QgsField("id", QVariant.String)) fields.append(QgsField("name", QVariant.String)) fet = QgsFeature() fet.initAttributes(2) fet.setGeometry(mask) fet.setFields(fields) fet.setAttribute("id", (ogrFeature.GetFieldAsString('id'))) fet.setAttribute("name", (ogrFeature.GetFieldAsString('name'))) pr.addAttributes(fields.toList()) maskLayer.startEditing() pr.addFeatures([fet]) maskLayer.commitChanges() maskLayer.updateExtents() # transparence, epaisseur renderer = maskLayer.renderer() s = renderer.symbol() s.setOpacity(0.90) s.setColor(QColor(255, 255, 255)) if isinstance(s, QgsLineSymbol): s.setWidth(0) layerTree = QgsProject.instance().layerTreeRoot().findLayer(maskLayer) if layerTree: self.plugin.iface.layerTreeView().layerTreeModel()\ .refreshLayerLegend(layerTree) # Refresh legend self.go(item)