Aller au contenu

PyQGIS

Ouvrir une boîte de dialogue

dlg = QMessageBox()
dlg.setText("Trail")
dlg.open()
dlg.close()

Ouvrir un éditeur Python

editor = QgsCodeEditorPython()
editor.show()

Charger un projet QGIS

from qgis.core import QgsProject
pjt = QgsProject.instance()
pjt.read('D:/python/bxl-culturel/bxl-culturel.qgz')

Charger une couche vectorielle

iface.addVectorLayer('D:/python/bxl-culturel/bruxelles_parcours_bd/bruxelles_parcours_bd.shp',
'Parcours bd - iface', 'ogr')

Manipuler les couches

layer = iface.activeLayer()
iface.setActiveLayer(layer)
len(layer) #count features
layer.name()
layer.source()
layer.geometryType()
layer.featureCount()
layer.fields()

for i in layer.fields():
    print(i)

layer.storageType()

Charger des données depuis une base de données

URI : Uniform Resource Identifier

uri = QgsDataSourceUri()
# attention vous devez renseigner le chemin absolu
uri.setDatabase('/chemin/absolu/vers/data/db_streetart.sqlite')

schema = ''
table = 'layer_streetart'
geom_column = 'geometry'

uri.setDataSource(schema, table, geom_column)

# affichage de l'uri (vu comme la source)
uri.uri() # returns 'dbname=\'/chemin/absolu/vers/data/db_streetart.sqlite\' table="layer_streetart" (geometry)'

vlayer = QgsVectorLayer(uri.uri(), 'Street art', 'spatialite')
QgsProject.instance().addMapLayer(vlayer)

Avec PostGIS

uri = QgsDataSourceUri()

# set host name, port, database name, username and password :
# uri.setConnection(host, port, db_name, username, password)
uri.setConnection("localhost", "5432", "postgres", "postgres", "1234")

# set database schema, table name, geometry column and optionally
# subset (WHERE clause)
uri.setDataSource("solar", "ground", "geom")

# get the generated URI
uri.uri() # returns 'dbname=\'postgres\' host=localhost port=5432 user=\'postgres\'
password=\'1234\' table="solar"."ground" (geom)'

# adding the layer using iface
iface.addVectorLayer(uri.uri(), "Nom de ma couche", "postgres")

Afficher toutes les couches

for l in iface.mapCanvas().layers():
    print(l)

# Afficher les couches dont l'ID contient "bruxelles"
dict_layers = pjt.mapLayers()
list_bxl=[]
for id_layer, layer in dict_layers.items():
    if 'bruxelles' in id_layer:
        list_bxl.append(layer)

print(list_bxl)

Afficher la valeur d'un champ pour une entité

layer = iface.activeLayer()
elem0 = layer.getFeature(0) # si venant de db utiliser la pk
print(elem0['nom_de_la_'])

for feature in layer.getFeatures():
    print(feature['nom_de_la_'])

Automatiser des traitements

processing.run # Lance seulement le traitement

processing.runAndLoadResults # Charge automatiquement le résultat dans QGIS

Exemple de traitement (Tampon)

result = processing.run(
    "native:buffer",
    {
        'INPUT': my_layer,
        'DISTANCE': 1000,
        'SEGMENTS': 5,
        'END_CAP_STYLE': 0,
        'JOIN_STYLE': 0,
        'MITER_LIMIT': 2,
        'DISSOLVE': False,
        'OUTPUT': 'TEMPORARY_OUTPUT'
    }
)

Exporter la couche de résultat

output_path="/tmp/output.gpkg"

# appel de la méthode de sauvegarde
QgsVectorLayerExporter.exportLayer(
    layer = result_layer,
    uri = output_path,
    providerKey = 'ogr',
    destCRS = QgsCoordinateReferenceSystem('EPSG:2154')
)

Exécution d'un script dans QGIS

exec(open('chemin_vers_le_script.py'.encode('utf-8')).read())
alt text alt text

Exemple de script complet

from qgis.core import QgsProject, QgsCoordinateReferenceSystem, QgsVectorLayerExporter
import processing

pjt = QgsProject.instance()
target_crs = QgsCoordinateReferenceSystem("EPSG:3812")

bus_layer = next((l for l in pjt.mapLayers().values() if 'bus_stops' in l.name()), None)
street_layer = next((l for l in pjt.mapLayers().values() if 'Street art' in l.name()), None)

if not bus_layer or not street_layer:
    raise ValueError("Couche 'bus_stops' ou 'Street art' introuvable.")

bus_layer_reprojected = processing.run("native:reprojectlayer", {
    'INPUT': bus_layer,
    'TARGET_CRS': target_crs,
    'OUTPUT': 'TEMPORARY_OUTPUT'
})['OUTPUT']

if street_layer.crs() != target_crs:
    street_layer_reprojected = processing.run("native:reprojectlayer", {
        'INPUT': street_layer,
        'TARGET_CRS': target_crs,
        'OUTPUT': 'TEMPORARY_OUTPUT'
    })['OUTPUT']
else:
    street_layer_reprojected = street_layer

buffer_layer = processing.run("native:buffer", {
    'INPUT': bus_layer_reprojected,
    'DISTANCE': 100,
    'OUTPUT': 'TEMPORARY_OUTPUT'
})['OUTPUT']

extracted_layer = processing.run("native:extractbylocation", {
    "INPUT": street_layer_reprojected,
    "PREDICATE": [0],  # 0 = intersecte
    "INTERSECT": buffer_layer,
    "OUTPUT": 'TEMPORARY_OUTPUT'
})['OUTPUT']

output_path = "D:/python/tmp/fresques_proches_bus.gpkg"
QgsVectorLayerExporter.exportLayer(
    layer=extracted_layer,
    uri=output_path,
    providerKey='ogr',
    destCRS=target_crs
)

extracted_layer.setName("Fresques proches bus")
pjt.addMapLayer(extracted_layer)

print(f"🎉 Succès ! {extracted_layer.featureCount()} fresques trouvées à moins de 1000m d'un arrêt de bus.")

Scripts pour la Boîte à outils de traitements (Processing Toolbox)

"""
***************************************************************************
*                                                                         *
*   This program is free software; you can redistribute it and/or modify  *
*   it under the terms of the GNU General Public License as published by  *
*   the Free Software Foundation; either version 2 of the License, or     *
*   (at your option) any later version.                                   *
*                                                                         *
***************************************************************************
"""

from typing import Any, Optional

from qgis.core import (
    QgsFeatureSink,
    QgsProcessing,
    QgsProcessingAlgorithm,
    QgsProcessingContext,
    QgsProcessingException,
    QgsProcessingFeedback,
    QgsProcessingParameterFeatureSink,
    QgsProcessingParameterFeatureSource,
    QgsProcessingParameterVectorLayer,
    QgsProject,
    QgsVectorLayer
)
from qgis import processing


class ExampleProcessingAlgorithmJune2026(QgsProcessingAlgorithm):

    OUTPUT = 'OUTPUT'

    def name(self) -> str:
        return "example_june2026"

    def displayName(self) -> str:
        return "Exemple June 2026"

    def group(self) -> str:
        return "Example scripts"

    def groupId(self) -> str:
        return "examplescripts"

    def shortHelpString(self) -> str:
        return "Example algorithm short description"

    def initAlgorithm(self, config: Optional[dict[str, Any]] = None):
        """
        Here we define the inputs and output of the algorithm, along
        with some other properties.
        """
        self.addParameter(QgsProcessingParameterVectorLayer('bus_stop', 'BUS_STOP', defaultValue=None))
        self.addParameter(QgsProcessingParameterVectorLayer('street_art', 'STREET_ART', defaultValue=None))

    def processAlgorithm(
        self,
        parameters: dict[str, Any],
        context: QgsProcessingContext,
        feedback: QgsProcessingFeedback,
    ) -> dict[str, Any]:

        CRS_METRIQUE = 'EPSG:3812'      # Lambert 2008 (Belgique), en mètres
        DISTANCE = 100
        # SORTIE = r"D:\a3_python\pyqgis\tmp\fresques_proches_bus.gpkg"

        bus_id = parameters['bus_stop']
        street_art_id=parameters['street_art']

        pjt = QgsProject.instance()
        bus = pjt.mapLayers()[bus_id]
        street_art = pjt.mapLayers()[street_art_id]

        # Reprojeter bus vers 3812
        if bus.crs().authid() != CRS_METRIQUE:
            bus = processing.run(
                "native:reprojectlayer", 
                {
                'INPUT': bus, 
                'TARGET_CRS': CRS_METRIQUE, 
                'OUTPUT': 'TEMPORARY_OUTPUT',
            })['OUTPUT']

        # Reprojeter street vers 3812 si besoin (il est en 2154 → sera reprojeté)
        if street_art.crs().authid() != CRS_METRIQUE:
            street_art = processing.run("native:reprojectlayer", {
                'INPUT': street_art, 
                'TARGET_CRS': CRS_METRIQUE, 
                'OUTPUT': 'TEMPORARY_OUTPUT',
            })['OUTPUT']

        # Buffer 100 m autour des arrêts
        buffer_bus = processing.run("native:buffer", {
            'INPUT': bus,
            'DISTANCE': 100, 
            'JOIN_STYLE': 0,
            'MITER_LIMIT': 2,
            'DISSOLVE': True, 
            'OUTPUT': 'TEMPORARY_OUTPUT',
        })['OUTPUT']

        # Extraire les fresques qui intersectent le buffer + sauvegarde GPKG
        result = processing.run("native:extractbylocation", {
            'INPUT': street_art, 
            'PREDICATE': [0], 
            'INTERSECT': buffer_bus, 
            'OUTPUT': 'TEMPORARY_OUTPUT', 
        })['OUTPUT']

        result.setName("Street art près des arrêts de bus")        
        pjt.addMapLayer(result)

        return dict()

    def createInstance(self):
        return self.__class__()