diff --git a/docs/console.md b/docs/console.md index 4461acb..f368cfb 100644 --- a/docs/console.md +++ b/docs/console.md @@ -282,10 +282,15 @@ QgsMapLayer <-- QgsVectorLayer QgsMapLayer <-- QgsRasterLayer ``` -L'objet `QgsVectorLayer` hérite de `QgsMapLayer` qui est une classe commune avec `QgsMapLayer`. +L'objet `QgsVectorLayer` hérite de `QgsMapLayer` qui est une classe commune avec `QgsRasterLayer`. [API QgsMapLayer C++](https://qgis.org/api/classQgsMapLayer.html), [API QgsMapLayer Python](https://qgis.org/pyqgis/3.34/core/QgsMapLayer.html) +!!! tip + On peut désormais regarder la documentation CPP de QGIS et Qt pour voir l'ensemble des membres, + **y compris les membres hérités**. + [QgsVectorLayer CPP](https://api.qgis.org/api/classQgsVectorLayer.html) ou [QComboBox](https://doc.qt.io/qt-6/qcombobox.html) + Regardons la fonction `isinstance` qui permet de tester si un objet est une instance d'une classe : ```python @@ -299,6 +304,13 @@ True * Objectif, ne pas afficher la couche commune pour une échelle plus petite que le `1:2 000 000`. +```python +communes.setMinimumScale(2000000) +communes.setMaximumScale(500000) +communes.setScaleBasedVisibility(True) +# communes.triggerRepaint() +``` + !!! important Un raccourci à savoir, dans la console : ```python @@ -317,17 +329,17 @@ dossier = 'BDT_3-3_SHP_LAMB93_D0ZZ-EDYYYY-MM-DD' thematique = 'ADMINISTRATIF' couche = 'COMMUNE' -racine = QgsProject.instance().homePath() -fichier_shape = join(racine, dossier, thematique, '{}.shp'.format(couche)) -layer = QgsVectorLayer(fichier_shape, couche, 'ogr') -result = QgsProject.instance().addMapLayer(layer) +project = QgsProject.instance() +racine = Path(project.absoluteFilePath()).parent +chemin = racine.joinpath(dossier, thematique) +fichier_shape = chemin.joinpath(f'{couche}.shp') print(layer.featureCount()) print(layer.crs().authid()) print('Est en mètre : {}'.format(layer.crs().mapUnits() == QgsUnitTypes.DistanceMeters)) print(layer.name()) layer.setScaleBasedVisibility(True) -layer.setMaximumScale(1) +layer.setMaximumScale(500000) layer.setMinimumScale(2000000) layer.triggerRepaint() ``` diff --git a/docs/index.md b/docs/index.md index c54410e..b70b3fd 100644 --- a/docs/index.md +++ b/docs/index.md @@ -52,6 +52,7 @@ Si nécessaire, il peut être utile d'avoir en plus : * Sujets PyQGIS thématiques * [Migration majeure au sein d'un code Python](migration-majeure.md) * [Interroger une base PostGIS](postgis.md) + * [Symbologie](symbologie.md) * Outils annexes * [Déploiement d'une extension](extension-deploiement.md) * [IDE Python & Git](ide-git.md) diff --git a/docs/symbologie.md b/docs/symbologie.md new file mode 100644 index 0000000..bae5f01 --- /dev/null +++ b/docs/symbologie.md @@ -0,0 +1,103 @@ +# Symbologie + +Étant donné que la symbologie pouvant être complexe dans QGIS Bureautique, avec les différents types de symbologie, +les différents niveaux de symbole, les ensembles de règles avec des filtres etc, il n'est pas forcément simple de +s'y retrouver dans l'API PyQGIS également. + +## Utilisation d'un QML au lieu de PyQGIS + +On peut se passer de PyQGIS pour fournir une symbologie à l'aide d'un fichier **QML**, si on ne souhaite pas faire ça en +Python entièrement. + +Regarder les méthodes `loadNamedStyle` de la classe `QgsMapLayer`. + +```python +from pathlib import Path + +layer = iface.activeLayer() + +qml = Path("path_to_qml") +if qml.exists(): + layer.loadNamedStyle(str(qml)) + iface.legendInterface().refreshLayerSymbology(layer) +``` + +## Classes utiles en PyQGIS + +Voir les graphiques d'héritage sur : + +* [QgsFeatureRenderer](https://api.qgis.org/api/classQgsFeatureRenderer.html) pour le moteur de rendu. +* [QgsSymbol](https://api.qgis.org/api/classQgsSymbol.html) pour un symbole, selon le type de géométrie. + +## Afficher les infos de la symbologie + +* Affichage sous forme textuelle + +```python +layer = iface.activeLayer() +renderer = layer.renderer() +print(renderer.dump()) +``` + +> SINGLE: FILL SYMBOL (1 layers) color 125,139,143,255 + +* Affichage du "dictionnaire" contenant l'ensemble des informations pour un niveau de symbole : + +```python +layer = iface.activeLayer() +renderer = layer.renderer() +print(renderer.symbol().symbolLayers()[0].properties()) +``` + +> {'border_width_map_unit_scale': '3x:0,0,0,0,0,0', 'color': '125,139,143,255', 'joinstyle': 'bevel', 'offset': '0,0', 'offset_map_unit_scale': '3x:0,0,0,0,0,0', 'offset_unit': 'MM', 'outline_color': '35,35,35,255', 'outline_style': 'solid', 'outline_width': '0.26', 'outline_width_unit': 'MM', 'style': 'solid'} + +## Affecter une symbologie à une couche + +**Il peut être très pratique de partir d'une symbologie existante, faite via l'interface graphique, puis de l'exporter pour voir les propriétés.** + +### Un symbole ponctuel unique simple + +```python +from qgis.core import QgsMarkerSymbol, QgsSingleSymbolRenderer + +symbol = QgsMarkerSymbol.createSimple( + { + "name": "circle", + "color": "yellow", + "size": 3, + } +) +renderer = QgsSingleSymbolRenderer(symbol) +layer = iface.activeLayer() +layer.setRenderer(renderer) +# layer.triggerRepaint() # If necessary +``` + +### Un symbole linéaire unique sous forme de flèche + +```python +from qgis.core import QgsApplication, QgsSymbol, Qgis, QgsSingleSymbolRenderer +from qgis.PyQt.QtGui import QColor + +# Quelques propriétés d'une flèche si besoin de surcharger. Utiliser le code PyQGIS pour récupérer la liste des propriétés. +ARROW = { + 'arrow_start_width': '1', + 'arrow_start_width_unit': 'MM', + 'arrow_start_width_unit_scale': '3x:0,0,0,0,0,0', + 'arrow_type': '0', +} + +registry = QgsApplication.symbolLayerRegistry() +line_metadata = registry.symbolLayerMetadata('ArrowLine') +line_layer = line_metadata.createSymbolLayer(ARROW) +line_layer.setColor(QColor('#33a02c')) + +symbol = QgsSymbol.defaultSymbol(Qgis.GeometryType.LineGeometry) +symbol.deleteSymbolLayer(0) +symbol.appendSymbolLayer(line_layer) + + +renderer = QgsSingleSymbolRenderer(symbol) +layer = iface.activeLayer() +layer.setRenderer(renderer) +``` diff --git a/mkdocs.yml b/mkdocs.yml index 5a9d9ad..5d70d6b 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -34,6 +34,7 @@ nav: - Sujets PyQGIS thématiques: - Migration majeur: migration-majeure.md - PostGIS: postgis.md + - Symbologie: symbologie.md - Outils annexes: - Déploiement d'une extension: extension-deploiement.md - IDE & Git: ide-git.md