├── README.md ├── 013_get-raster-data-gdal.py ├── 008_access-vector-layer-attributes.py ├── 006_load-layers.py ├── 024_error-messages.py ├── 009_select-features.py ├── 018_save-selected-features.py ├── 021_clip.py ├── 012_delete-features.py ├── 005_raster-stats.py ├── 010_get-geometry.py ├── 011_add-point-feature.py ├── 004_query-raster-values.py ├── 023_coordinate-transform.py ├── 003_add-remove-vector-fields.py ├── 014_create-raster.py ├── 019_buffer.py ├── 017_create-new-shapefile.py ├── 001_load-symbolize-rasters.py ├── 029_raster-calculator.py ├── 025_slope.py ├── 026_spatial-joins.py ├── 022_dissolve.py ├── 028_field-calculations.py ├── 020_distance-between-geometries.py ├── 015_render-map-layer.py ├── 007_get-info-from-interface-layers.py ├── 002_load-symbolize-vectors.py └── 016_render-map-layout.py /README.md: -------------------------------------------------------------------------------- 1 | # pyqgis-tutorials 2 | 3 | Code for PyQGIS tutorials from the OpenSourceOptions YouTube video series. You can access explanations and video in the OpenSourceOptions blog posts. https://opensourceoptions.com/blog/category/python/pyqgis/ 4 | -------------------------------------------------------------------------------- /013_get-raster-data-gdal.py: -------------------------------------------------------------------------------- 1 | from osgeo import gdal 2 | layers = QgsProject.instance().mapLayersByName('dem') 3 | layer = layers[0] 4 | ds = gdal.Open(layer.dataProvider().dataSourceUri()) 5 | dem_arr = ds.GetRasterBand(1).ReadAsArray() 6 | print(dem_arr[0][0]) -------------------------------------------------------------------------------- /008_access-vector-layer-attributes.py: -------------------------------------------------------------------------------- 1 | fn = "C:/temp/outputs/stream_order.shp" 2 | layer = QgsVectorLayer(fn, '', 'ogr') 3 | 4 | fc = layer.featureCount() 5 | 6 | for i in range(0, fc): 7 | feat = layer.getFeature(i) 8 | print(feat['ARCID'], feat['GRID_CODE'], feat[1]) -------------------------------------------------------------------------------- /006_load-layers.py: -------------------------------------------------------------------------------- 1 | fn = "C:/temp/outputs/stream_order.shp" 2 | 3 | vlayer = QgsVectorLayer(fn, '', 'ogr') 4 | for field in vlayer.fields(): 5 | print(field.name()) 6 | 7 | fn2 = 'C:/temp/smr/trimmer_peak/dem/dem.tif' 8 | rlayer = QgsRasterLayer(fn, '') 9 | print(rlayer.bandCount()) 10 | -------------------------------------------------------------------------------- /024_error-messages.py: -------------------------------------------------------------------------------- 1 | fn = "C:/temp/doesntexist.tif" 2 | 3 | if os.path.exists(fn): 4 | iface.messageBar().pushMessage("Success", \ 5 | "The file exists and will be loaded", level=3) 6 | iface.addRasterLayer(fn) 7 | else: 8 | iface.messageBar().pushMessage("Error", "The file does not exist",\ 9 | level=2) -------------------------------------------------------------------------------- /009_select-features.py: -------------------------------------------------------------------------------- 1 | fn = "C:/temp/outputs/stream_order.shp" 2 | 3 | layer = iface.addVectorLayer(fn, '', 'ogr') 4 | selectid = [1, 3, 6, 8, 11] 5 | layer.select(selectid) 6 | #layer.selectByExpression('"GRID_CODE"=4') 7 | #layer.selectAll() 8 | 9 | selection = layer.selectedFeatures() 10 | 11 | for feat in selection: 12 | print(feat['GRID_CODE']) -------------------------------------------------------------------------------- /018_save-selected-features.py: -------------------------------------------------------------------------------- 1 | layers = QgsProject.instance().mapLayersByName('stream_order') 2 | layer = layers[0] 3 | layer.selectByExpression('"GRID_CODE"=4') 4 | 5 | fn = 'C:/temp/outputs/select_gc4.shp' 6 | writer = QgsVectorFileWriter.writeAsVectorFormat(layer, fn, 'utf-8', \ 7 | driverName='ESRI Shapefile', onlySelected=True) 8 | 9 | selected_layer = iface.addVectorLayer(fn, '', 'ogr') 10 | 11 | del(writer) 12 | -------------------------------------------------------------------------------- /021_clip.py: -------------------------------------------------------------------------------- 1 | import processing 2 | 3 | #set input and output file names 4 | polyPath = "C:/temp/buffer_clip.shp" 5 | linePath = "C:/temp/streams_clip.shp" 6 | clipPath = "C:/temp/clipped.shp" 7 | 8 | #run the clip tool 9 | processing.run("native:clip", {'INPUT':linePath,\ 10 | 'OVERLAY':polyPath,\ 11 | 'OUTPUT':clipPath}) 12 | 13 | #add output to the qgis interface 14 | iface.addVectorLayer(clipPath, '', 'ogr') 15 | -------------------------------------------------------------------------------- /012_delete-features.py: -------------------------------------------------------------------------------- 1 | layers = QgsProject.instance().mapLayersByName('stream_order - Copy') 2 | layer = layers[0] 3 | caps = layer.dataProvider().capabilities() 4 | feats = layer.getFeatures() 5 | dfeats = [] 6 | 7 | if caps & QgsVectorDataProvider.DeleteFeatures: 8 | for feat in feats: 9 | if feat['GRID_CODE'] == 3: 10 | dfeats.append(feat.id()) 11 | res = layer.dataProvider().deleteFeatures(dfeats) 12 | layer.triggerRepaint() -------------------------------------------------------------------------------- /005_raster-stats.py: -------------------------------------------------------------------------------- 1 | #raster filename 2 | fn = 'C:/temp/smr/trimmer_peak/dem/dem.tif' 3 | 4 | #add raster t0 qgis interface 5 | layer = iface.addRasterLayer(fn, '') 6 | 7 | #get statistics for raster band 1 8 | stats = layer.dataProvider().bandStatistics(1, QgsRasterBandStats.All) 9 | 10 | #print band statistics 11 | print(stats.minimumValue) 12 | print(stats.minimumValue) 13 | print(stats.mean) 14 | print(stats.range) 15 | print(stats.stdDev) 16 | print(stats.sum) 17 | print(stats.sumOfSquares) -------------------------------------------------------------------------------- /010_get-geometry.py: -------------------------------------------------------------------------------- 1 | fn = "C:/temp/outputs/stream_order.shp" 2 | layer = QgsVectorLayer(fn, '', 'ogr') 3 | feats = layer.getFeatures() 4 | 5 | for feat in feats: 6 | geom = feat.geometry() 7 | geomSingleType = QgsWkbTypes.isSingleType(geom.wkbType()) 8 | if geom.type() == QgsWkbTypes.LineGeometry: 9 | if geomSingleType: 10 | x = geom.asPolyline() 11 | print("line:", x) 12 | else: 13 | x = geom.asMultiPolyline() 14 | print("multiline:", x) -------------------------------------------------------------------------------- /011_add-point-feature.py: -------------------------------------------------------------------------------- 1 | layers = QgsProject.instance().mapLayersByName('beaver_ponds') 2 | layer = QgsVectorLayer(layers[0].dataProvider().dataSourceUri(), '', 'ogr') 3 | caps = layer.dataProvider().capabilities() 4 | 5 | if caps & QgsVectorDataProvider.AddFeatures: 6 | feat = QgsFeature(layer.fields()) 7 | feat.setAttributes([0, 'added programatically']) 8 | feat.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(453257, 4631706))) 9 | res, outFeats = layer.dataProvider().addFeatures([feat]) 10 | 11 | -------------------------------------------------------------------------------- /004_query-raster-values.py: -------------------------------------------------------------------------------- 1 | #file information 2 | fn = 'C:/temp/smr/trimmer_peak/dem/dem.tif' 3 | fi = QFileInfo(fn) 4 | fname = fi.baseName() 5 | 6 | #add raster t0 qgis interface 7 | layer = iface.addRasterLayer(fn, fname) 8 | 9 | #query value with sample 10 | val, res = layer.dataProvider().sample(QgsPointXY(246572, 4306418), 1) 11 | print(val, res) 12 | 13 | #query value with identify() 14 | ident = layer.dataProvider().identify(QgsPointXY(246572, 4306418), 15 | QgsRaster.IdentifyFormatValue) 16 | print(ident.isValid()) 17 | print(ident.results()) -------------------------------------------------------------------------------- /023_coordinate-transform.py: -------------------------------------------------------------------------------- 1 | # coordinate transformation 2 | 3 | crs = QgsCoordinateReferenceSystem(4326) # WGS 84 4 | crsNew = QgsCoordinateReferenceSystem(26912) # NAD83 / UTM Zone 12 N 5 | tform = QgsCoordinateTransform(crs, crsNew, QgsProject.instance()) 6 | 7 | x, y = -112.0, 35.0 # point in northern Arizona 8 | 9 | # transform to UTM zone 12 N 10 | ptUTM = tform.transform(QgsPointXY(x, y)) 11 | print("Transformed UTM:", ptUTM) 12 | 13 | # reverse transformation 14 | ptWGS = tform.transform(ptUTM, QgsCoordinateTransform.ReverseTransform) 15 | print("Undone:", ptWGS) 16 | -------------------------------------------------------------------------------- /003_add-remove-vector-fields.py: -------------------------------------------------------------------------------- 1 | fn = "C:/temp/outputs/stream_order - Copy.shp" 2 | 3 | layer = iface.addVectorLayer(fn, '', 'ogr') 4 | 5 | features = layer.getFeatures() 6 | 7 | caps = layer.dataProvider().capabilities() 8 | 9 | #if caps & QgsVectorDataProvider.AddAttributes: 10 | # res = layer.dataProvider().addAttributes([QgsField('OrderCat', QVariant.String), 11 | # QgsField('LenCat', QVariant.String)]) 12 | # layer.updateFields() 13 | 14 | if caps & QgsVectorDataProvider.DeleteAttributes: 15 | res = layer.dataProvider().deleteAttributes([7,8]) 16 | layer.updateFields() 17 | 18 | -------------------------------------------------------------------------------- /014_create-raster.py: -------------------------------------------------------------------------------- 1 | from osgeo import gdal, osr 2 | import numpy as np 3 | 4 | fn = 'C:/temp/new_raster.tif' 5 | 6 | rasterband = np.zeros((10,10)) 7 | 8 | driver = gdal.GetDriverByName('GTiff') 9 | ds = driver.Create(fn, xsize=10, ysize=10, bands=1, eType=gdal.GDT_Float32) 10 | ds.GetRasterBand(1).WriteArray(rasterband) 11 | 12 | geot = [500000, 10, 0, 4600000, 0, -10] 13 | ds.SetGeoTransform(geot) 14 | srs = osr.SpatialReference() 15 | srs.SetUTM(12,1) 16 | srs.SetWellKnownGeogCS('NAD83') 17 | ds.SetProjection(srs.ExportToWkt()) 18 | ds = None 19 | 20 | rlayer = iface.addRasterLayer(fn) 21 | print('done') -------------------------------------------------------------------------------- /019_buffer.py: -------------------------------------------------------------------------------- 1 | layerName = 'input_layer_name' 2 | outFile = 'path/to/buffer.shp' 3 | bufDist = 50 4 | layers = QgsProject.instance().mapLayersByName(layerName) 5 | layer = layers[0] 6 | fields = layer.fields() 7 | feats = layer.getFeatures() 8 | 9 | writer = QgsVectorFileWriter(outFile, 'UTF-8', fields, \ 10 | QgsWkbTypes.Polygon, layer.sourceCrs(), 'ESRI Shapefile') 11 | 12 | for feat in feats: 13 | geom = feat.geometry() 14 | buffer = geom.buffer(bufDist, 5) 15 | feat.setGeometry(buffer) 16 | writer.addFeature(feat) 17 | print('done') 18 | iface.addVectorLayer(outFile, '', 'ogr') 19 | del(writer) 20 | 21 | 22 | -------------------------------------------------------------------------------- /017_create-new-shapefile.py: -------------------------------------------------------------------------------- 1 | import qgis 2 | 3 | # create fields 4 | layerFields = QgsFields() 5 | layerFields.append(QgsField('ID', QVariant.Int)) 6 | layerFields.append(QgsField('Value', QVariant.Double)) 7 | layerFields.append(QgsField('Name', QVariant.String)) 8 | 9 | fn = 'C:/temp/newpoints.shp' 10 | writer = QgsVectorFileWriter(fn, 'UTF-8', layerFields,\ 11 | QgsWkbTypes.Point,\ 12 | QgsCoordinateReferenceSystem('EPSG:26912'),\ 13 | 'ESRI Shapefile') 14 | 15 | feat = QgsFeature() 16 | feat.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(455618, 4632221))) 17 | feat.setAttributes([1, 1.1, 'one']) 18 | writer.addFeature(feat) 19 | 20 | layer = iface.addVectorLayer(fn, '', 'ogr') 21 | 22 | del(writer) -------------------------------------------------------------------------------- /001_load-symbolize-rasters.py: -------------------------------------------------------------------------------- 1 | fn = 'C:/temp/smr/trimmer_peak/dem/dem.tif' 2 | 3 | fi = QFileInfo(fn) 4 | fname = fi.baseName() 5 | 6 | rlayer = iface.addRasterLayer(fn, fname) 7 | 8 | stats = rlayer.dataProvider().bandStatistics(1, QgsRasterBandStats.All) 9 | min = stats.minimumValue 10 | max = stats.maximumValue 11 | 12 | fnc = QgsColorRampShader() 13 | fnc.setColorRampType(QgsColorRampShader.Interpolated) 14 | 15 | lst = [QgsColorRampShader.ColorRampItem(min, QColor(0, 255, 0)), \ 16 | QgsColorRampShader.ColorRampItem(max, QColor(255, 255, 0))] 17 | 18 | fnc.setColorRampItemList(lst) 19 | 20 | shader = QgsRasterShader() 21 | shader.setRasterShaderFunction(fnc) 22 | 23 | renderer = QgsSingleBandPseudoColorRenderer(rlayer.dataProvider(), 1, shader) 24 | rlayer.setRenderer(renderer) -------------------------------------------------------------------------------- /029_raster-calculator.py: -------------------------------------------------------------------------------- 1 | lyr1 = QgsRasterLayer('C:/temp/elevation/ned10m.tif') 2 | output = 'C:/temp/rascalc.tif' 3 | entries = [] 4 | 5 | ras = QgsRasterCalculatorEntry() 6 | ras.ref = 'ras@1' 7 | ras.raster = lyr1 8 | ras.bandNumber = 1 9 | entries.append(ras) 10 | 11 | calc = QgsRasterCalculator('ras@1 + 1.0', output, 'GTiff', \ 12 | lyr1.extent(), lyr1.width(), lyr1.height(), entries) 13 | calc.processCalculation() 14 | 15 | lyr2 = QgsRasterLayer(output) 16 | output2 = 'c:/temp/rascalc2.tif' 17 | 18 | ras = QgsRasterCalculatorEntry() 19 | ras.ref = 'ras@2' 20 | ras.raster = lyr2 21 | ras.bandNumber = 1 22 | entries.append(ras) 23 | 24 | calc = QgsRasterCalculator('ras@1 + ras@2', output2, 'GTiff', \ 25 | lyr1.extent(), lyr1.width(), lyr1.height(), entries) 26 | calc.processCalculation() -------------------------------------------------------------------------------- /025_slope.py: -------------------------------------------------------------------------------- 1 | fn = "C:/temp/elevation/ned10m.tif" 2 | out_qgis = "C:/temp/slope_qgis.tif" 3 | out_gdal = "C:/temp/slope_gdal.tif" 4 | 5 | def slope_qgis(in_fn, out_fn='TEMPORARY_OUTPUT', zfact=1.0, add_iface=True): 6 | processing.run("qgis:slope", \ 7 | {'INPUT':fn,\ 8 | 'Z_FACTOR':zfact,\ 9 | 'OUTPUT':out_fn}) 10 | if add_iface: 11 | iface.addRasterLayer(out_fn) 12 | 13 | def slope_gdal(in_fn, out_fn='TEMPORARY_OUTPUT', percent=True): 14 | processing.run("gdal:slope", \ 15 | {'INPUT':fn,\ 16 | 'BAND':1,\ 17 | 'SCALE':1,\ 18 | 'AS_PERCENT':percent,\ 19 | 'COMPUTE_EDGES':True,\ 20 | 'ZEVENBERGEN':False,\ 21 | 'OPTIONS':'',\ 22 | 'OUTPUT':out_fn}) 23 | iface.addRasterLayer(out_fn) 24 | 25 | slope_qgis(fn, out_qgis) 26 | slope_gdal(fn, out_gdal) -------------------------------------------------------------------------------- /026_spatial-joins.py: -------------------------------------------------------------------------------- 1 | fnpts = 'C:/temp/newpoints.shp' 2 | fnstr = 'C:/temp/outputs/stream_order.shp' 3 | fnws = 'C:/temp/outputs/watershed_boundary.shp' 4 | fnout = 'C:/temp/locationjoin.shp' 5 | 6 | # join by location\ 7 | processing.run("qgis:joinattributesbylocation",\ 8 | {'INPUT':fnpts,\ 9 | 'JOIN':fnws,\ 10 | 'PREDICATE':[0],\ 11 | 'JOIN_FIELDS':[],\ 12 | 'METHOD':0,\ 13 | 'DISCARD_NONMATCHING':False,\ 14 | 'PREFIX':'',\ 15 | 'OUTPUT':fnout}) 16 | 17 | iface.addVectorLayer(fnout, '', 'ogr') 18 | 19 | # join by nearest 20 | #processing.run("native:joinbynearest",\ 21 | #{'INPUT':fnpts,\ 22 | #'INPUT_2':fnstr,\ 23 | #'FIELDS_TO_COPY':['lengthm'],\ 24 | #'DISCARD_NONMATCHING':True,\ 25 | #'PREFIX':'joined_',\ 26 | #'NEIGHBORS':1,\ 27 | #'MAX_DISTANCE':73.0,\ 28 | #'OUTPUT':fnout}) 29 | # 30 | #iface.addVectorLayer(fnout, '', 'ogr') -------------------------------------------------------------------------------- /022_dissolve.py: -------------------------------------------------------------------------------- 1 | import processing 2 | 3 | #input and output file names 4 | infn = "C:/temp/buffer.shp" 5 | infn2 = "C:/temp/outputs/stream_order.shp" 6 | outfn = "C:/temp/buffer_dissolved_all.shp" 7 | outfn2 = "C:/temp/buffer_dissolved_strord.shp" 8 | outfn3 = "C:/temp/buffer_dissolved.shp" 9 | 10 | #basic dissolve: dissolve all features into a single feature 11 | processing.run("native:dissolve", {'INPUT':infn, 'OUTPUT':outfn}) 12 | 13 | #dissolve features based on values in an attribute table field 14 | processing.run("native:dissolve", {'INPUT':infn, \ 15 | FIELD':['GRID_CODE'], 'OUTPUT':outfn2}) 16 | 17 | #dissolve buffer output into a single feature 18 | processing.run("native:buffer", {'INPUT':infn2, 'DISTANCE':20, \ 19 | 'DISSOLVE':True, 'OUTPUT':outfn3}) 20 | 21 | #add layer to the QGIS interface 22 | iface.addVectorLayer(outfn3, '', 'ogr') 23 | 24 | -------------------------------------------------------------------------------- /028_field-calculations.py: -------------------------------------------------------------------------------- 1 | fn = 'C:/temp/outputs/stream_order - Copy.shp' 2 | 3 | layer = QgsVectorLayer(fn, '', 'ogr') 4 | pv = layer.dataProvider() 5 | pv.addAttributes([QgsField('len_test_m', QVariant.Double), \ 6 | QgsField('calc', QVariant.Double)]) 7 | 8 | layer.updateFields() 9 | 10 | expression1 = QgsExpression('$length') 11 | expression2 = QgsExpression('"lengthm"/"len_test_m"') 12 | 13 | context = QgsExpressionContext() 14 | context.appendScopes(\ 15 | QgsExpressionContextUtils.globalProjectLayerScopes(layer)) 16 | 17 | with edit(layer): 18 | for f in layer.getFeatures(): 19 | context.setFeature(f) 20 | f['len_test_m'] = expression1.evaluate(context) 21 | layer.updateFeature(f) 22 | 23 | with edit(layer): 24 | for f in layer.getFeatures(): 25 | context.setFeature(f) 26 | f['calc'] = expression2.evaluate(context) 27 | layer.updateFeature(f) 28 | 29 | -------------------------------------------------------------------------------- /020_distance-between-geometries.py: -------------------------------------------------------------------------------- 1 | sLayerName = "newpoints" 2 | tLayerName = "stream_order" 3 | 4 | sLayers = QgsProject.instance().mapLayersByName(sLayerName) 5 | sLayer = sLayers[0] 6 | 7 | # Distance between two features in the same layer 8 | #sFeat = sLayer.getFeature(0) 9 | #tFeat = sLayer.getFeature(1) 10 | #sGeom = sFeat.geometry() 11 | #tGeom = tFeat.geometry() 12 | #dist_m = sGeom.distance(tGeom) 13 | #print(dist_m) 14 | 15 | # Distance between all features from two different layers 16 | tLayers = QgsProject.instance().mapLayersByName(tLayerName) 17 | tLayer = tLayers[0] 18 | 19 | sFeats = sLayer.getFeatures() 20 | 21 | print(sLayer.featureCount()) 22 | for sfeat in sFeats: 23 | sgeom = sfeat.geometry() 24 | tFeats = tLayer.getFeatures() 25 | for tfeat in tFeats: 26 | tgeom = tfeat.geometry() 27 | dist_pl = sgeom.distance(tgeom) 28 | print(sfeat.id(), tfeat.id(), dist_pl) 29 | print(sfeat.id(), 'done') 30 | -------------------------------------------------------------------------------- /015_render-map-layer.py: -------------------------------------------------------------------------------- 1 | # create image 2 | img = QImage(QSize(800, 800), QImage.Format_ARGB32_Premultiplied) 3 | 4 | # set background color 5 | color = QColor(255, 255, 255, 255) 6 | img.fill(color.rgba()) 7 | 8 | # create painter 9 | p = QPainter() 10 | p.begin(img) 11 | p.setRenderHint(QPainter.Antialiasing) 12 | 13 | # create map settings 14 | ms = QgsMapSettings() 15 | ms.setBackgroundColor(color) 16 | 17 | # set layers to render 18 | layer = QgsProject.instance().mapLayersByName('stream_order') 19 | ms.setLayers([layer[0]]) 20 | 21 | # set extent 22 | rect = QgsRectangle(ms.fullExtent()) 23 | rect.scale(1.1) 24 | ms.setExtent(rect) 25 | 26 | # set ouptut size 27 | ms.setOutputSize(img.size()) 28 | 29 | # setup qgis map renderer 30 | render = QgsMapRendererCustomPainterJob(ms, p) 31 | render.start() 32 | render.waitForFinished() 33 | p.end() 34 | 35 | # save the image 36 | img.save('C:/temp/test_render.png') 37 | 38 | print('image saved') 39 | 40 | 41 | 42 | 43 | 44 | -------------------------------------------------------------------------------- /007_get-info-from-interface-layers.py: -------------------------------------------------------------------------------- 1 | #get layers with the name 'dem' 2 | layers = QgsProject.instance().mapLayersByName('dem') 3 | 4 | #print the number of layers with name 'dem' 5 | print(len(layers)) 6 | 7 | #for each layer, print the name, file name, band count, height(cells), and width(cells) 8 | for layer in layers: 9 | print(layer.name()) 10 | print(layer.dataProvider().dataSourceUri()) 11 | print(layer.bandCount(), layer.height(), layer.width()) 12 | 13 | #get vector layers with the name 'stream_order' 14 | vlayers = QgsProject.instance().mapLayersByName('stream_order') 15 | 16 | #print the number of layers with name 'stream_order' 17 | print(len(vlayers)) 18 | 19 | #for each layer print the layer name and the file name 20 | for layer in vlayers: 21 | print(layer.name()) 22 | print(layer.dataProvider().dataSourceUri()) 23 | 24 | #add the layer into the interface using the file name of the layer already in the interface 25 | testlayer = iface.addVectorLayer(vlayers[0].dataProvider().dataSourceUri(), '', 'ogr') -------------------------------------------------------------------------------- /002_load-symbolize-vectors.py: -------------------------------------------------------------------------------- 1 | from qgis.PyQt import QtGui 2 | 3 | fn = "C:/temp/outputs/stream_order.shp" 4 | 5 | ##simple vector symbology 6 | #layer = iface.addVectorLayer(fn, '', 'ogr') 7 | # 8 | #symbol = QgsLineSymbol.createSimple({'line_style': 'dash', 'color': 'red'}) 9 | #layer.renderer().setSymbol(symbol) 10 | #layer.triggerRepaint() 11 | 12 | #graduated symbology 13 | layer = QgsVectorLayer(fn, 'name', 'ogr') 14 | 15 | tf = 'GRID_CODE' 16 | rangeList = [] 17 | opacity = 1 18 | 19 | # create symbology for first range 20 | minVal = 0.0 21 | maxVal = 2.0 22 | 23 | lab = 'Group 1' 24 | 25 | color1 = QtGui.QColor('#ffee00') 26 | 27 | symbol = QgsSymbol.defaultSymbol(layer.geometryType()) 28 | symbol.setColor(color1) 29 | symbol.setOpacity(opacity) 30 | 31 | range1 = QgsRendererRange(minVal, maxVal, symbol, lab) 32 | rangeList.append(range1) 33 | 34 | # set up second symbol 35 | minVal = 2.1 36 | maxVal = 4.0 37 | 38 | lab = 'Group 2' 39 | 40 | color2 = QtGui.QColor('#00eeff') 41 | 42 | symbol = QgsSymbol.defaultSymbol(layer.geometryType()) 43 | symbol.setColor(color2) 44 | symbol.setOpacity(opacity) 45 | 46 | range2 = QgsRendererRange(minVal, maxVal, symbol, lab) 47 | rangeList.append(range2) 48 | 49 | # apply ranges to layer 50 | groupRenderer = QgsGraduatedSymbolRenderer('', rangeList) 51 | groupRenderer.setMode(QgsGraduatedSymbolRenderer.EqualInterval) 52 | groupRenderer.setClassAttribute(tf) 53 | 54 | layer.setRenderer(groupRenderer) 55 | 56 | QgsProject.instance().addMapLayer(layer) 57 | 58 | -------------------------------------------------------------------------------- /016_render-map-layout.py: -------------------------------------------------------------------------------- 1 | from qgis.PyQt import QtGui 2 | 3 | layers = QgsProject.instance().mapLayersByName('stream_order') 4 | layer = layers[0] 5 | 6 | project = QgsProject.instance() 7 | manager = project.layoutManager() 8 | layoutName = 'Layout1' 9 | layouts_list = manager.printLayouts() 10 | # remove any duplicate layouts 11 | for layout in layouts_list: 12 | if layout.name() == layoutName: 13 | manager.removeLayout(layout) 14 | layout = QgsPrintLayout(project) 15 | layout.initializeDefaults() 16 | layout.setName(layoutName) 17 | manager.addLayout(layout) 18 | 19 | # create map item in the layout 20 | map = QgsLayoutItemMap(layout) 21 | map.setRect(20, 20, 20, 20) 22 | 23 | # set the map extent 24 | ms = QgsMapSettings() 25 | ms.setLayers([layer]) # set layers to be mapped 26 | rect = QgsRectangle(ms.fullExtent()) 27 | rect.scale(1.0) 28 | ms.setExtent(rect) 29 | map.setExtent(rect) 30 | map.setBackgroundColor(QColor(255, 255, 255, 0)) 31 | layout.addLayoutItem(map) 32 | 33 | map.attemptMove(QgsLayoutPoint(5, 20, QgsUnitTypes.LayoutMillimeters)) 34 | map.attemptResize(QgsLayoutSize(180, 180, QgsUnitTypes.LayoutMillimeters)) 35 | 36 | legend = QgsLayoutItemLegend(layout) 37 | legend.setTitle("Legend") 38 | layerTree = QgsLayerTree() 39 | layerTree.addLayer(layer) 40 | legend.model().setRootGroup(layerTree) 41 | layout.addLayoutItem(legend) 42 | legend.attemptMove(QgsLayoutPoint(230, 15, QgsUnitTypes.LayoutMillimeters)) 43 | 44 | scalebar = QgsLayoutItemScaleBar(layout) 45 | scalebar.setStyle('Line Ticks Up') 46 | scalebar.setUnits(QgsUnitTypes.DistanceKilometers) 47 | scalebar.setNumberOfSegments(4) 48 | scalebar.setNumberOfSegmentsLeft(0) 49 | scalebar.setUnitsPerSegment(0.5) 50 | scalebar.setLinkedMap(map) 51 | scalebar.setUnitLabel('km') 52 | scalebar.setFont(QFont('Arial', 14)) 53 | scalebar.update() 54 | layout.addLayoutItem(scalebar) 55 | scalebar.attemptMove(QgsLayoutPoint(220, 190, QgsUnitTypes.LayoutMillimeters)) 56 | 57 | title = QgsLayoutItemLabel(layout) 58 | title.setText("My Title") 59 | title.setFont(QFont('Arial', 24)) 60 | title.adjustSizeToText() 61 | layout.addLayoutItem(title) 62 | title.attemptMove(QgsLayoutPoint(10, 5, QgsUnitTypes.LayoutMillimeters)) 63 | 64 | layout = manager.layoutByName(layoutName) 65 | exporter = QgsLayoutExporter(layout) 66 | 67 | fn = 'C:/temp/layout_export.pdf' 68 | #exporter.exportToImage(fn, QgsLayoutExporter.ImageExportSettings()) 69 | exporter.exportToPdf(fn, QgsLayoutExporter.PdfExportSettings()) 70 | 71 | --------------------------------------------------------------------------------