Skip to content

Commit

Permalink
Nouveau chapitre sur la symbologie, sous forme de mémo
Browse files Browse the repository at this point in the history
  • Loading branch information
Gustry committed Dec 3, 2024
1 parent 36b61d1 commit e92786b
Show file tree
Hide file tree
Showing 4 changed files with 123 additions and 6 deletions.
24 changes: 18 additions & 6 deletions docs/console.md
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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
Expand All @@ -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()
```
Expand Down
1 change: 1 addition & 0 deletions docs/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
103 changes: 103 additions & 0 deletions docs/symbologie.md
Original file line number Diff line number Diff line change
@@ -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)
```
1 change: 1 addition & 0 deletions mkdocs.yml
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down

0 comments on commit e92786b

Please sign in to comment.