Page 22 sur 25
Création d'entités (geopackage)
Nous allons passer par la création de couches temporaires, que nous stockerons ensuite dans un seul et unique fichier geopackage, qui contiendra aussi notre légende.
Il y a plusieurs façons de créer des geopackage avec PyGIS, mais on privilégiera ici l'usage du process QGIS dédié, ce qui raccourcira notre code et nous évitera certaines subtilités de l'API QGIS.
from qgis.core import (QgsVectorLayer, QgsField, QgsFields, QgsFeature, QgsGeometry, QgsPointXY, QgsVectorFileWriter, QgsCoordinateReferenceSystem, QgsCoordinateTransformContext) from qgis.PyQt.QtCore import QVariant # Fichier, couches et variables cheminGeopackage = r'C:\\Users\\georg\\Downloads\\mon_geopackage.gpkg' pointSites = 'Sites' ligneTrajets = 'Trajets' monEpsg = 'EPSG:4326' # Projet project = QgsProject.instance() project.removeAllMapLayers() project.clear() iface.mapCanvas().refresh() # Définir le système de coordonnées crs = QgsCoordinateReferenceSystem(monEpsg) # STRUCTURE COUCHE DE POINTS fields_points = QgsFields() fields_points.append(QgsField('ville', QVariant.String)) fields_points.append(QgsField('cp', QVariant.String)) fields_points.append(QgsField('site', QVariant.String)) fields_points.append(QgsField('nbr_etudiant', QVariant.Int)) # Créer la couche de points en mémoire couchePointsTemporaire = QgsVectorLayer('Point?crs=' + monEpsg, pointSites, 'memory') providerPoints = couchePointsTemporaire.dataProvider() providerPoints.addAttributes(fields_points) couchePointsTemporaire.updateFields() # Ajouter quelques entités dans la couche de points f = QgsFeature() f.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(2.0751661, 49.0397097))) f.setAttributes(['Cergy-Pontoise', 95800, 'Les Chênes 1', 5624]) providerPoints.addFeatures([f]) f = QgsFeature() f.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(2.0741189, 49.0388195))) f.setAttributes(['Cergy-Pontoise', 95800, 'Les Chênes 2', 1528]) providerPoints.addFeatures([f]) f = QgsFeature() f.setGeometry(QgsGeometry.fromPointXY(QgsPointXY(2.0750590, 49.0387535))) f.setAttributes(['Cergy-Pontoise', 95800, 'Maison des étudiants', 0]) providerPoints.addFeatures([f]) # Afficher la couche temporaire des points couchePointsTemporaire.updateExtents() project.addMapLayer(couchePointsTemporaire) symbolPoint = QgsMarkerSymbol.createSimple({'name': 'Triangle', 'color': 'green', 'outline_color': 'black', 'size': '8'}) couchePointsTemporaire.renderer().setSymbol(symbolPoint) couchePointsTemporaire.triggerRepaint() # STRUCTURE COUCHE DE LIGNES fields_lignes = QgsFields() fields_lignes.append(QgsField('type', QVariant.String)) fields_lignes.append(QgsField('depart', QVariant.String)) fields_lignes.append(QgsField('destination', QVariant.String)) # Créer la couche de lignes en mémoire coucheLignesTemporaire = QgsVectorLayer('LineString?crs=' + monEpsg, ligneTrajets, 'memory') providerLignes = coucheLignesTemporaire.dataProvider() providerLignes.addAttributes(fields_lignes) coucheLignesTemporaire.updateFields() # Ajouter une ligne p1 = QgsPointXY(2.0751702, 49.0396174) # Les Chênes 1 p2 = QgsPointXY(2.0745442, 49.0393126) p3 = QgsPointXY(2.0747950, 49.0388849) p4 = QgsPointXY(2.0742083, 49.0388079) # Les Chênes 2 ligne_geom = QgsGeometry.fromPolylineXY([p1, p2, p3, p4]) feat = QgsFeature() feat.setGeometry(ligne_geom) feat.setAttributes(['Trajet à pied', 'Les Chênes 1', 'Les Chênes 2']) coucheLignesTemporaire.startEditing() coucheLignesTemporaire.addFeature(feat) coucheLignesTemporaire.commitChanges() coucheLignesTemporaire.triggerRepaint() # Ajouter une ligne p1 = QgsPointXY(2.0742083, 49.0388079) # Les Chênes 2 p2 = QgsPointXY(2.0749883, 49.0388718) # Maison des étudiants ligne_geom = QgsGeometry.fromPolylineXY([p1, p2]) feat = QgsFeature() feat.setGeometry(ligne_geom) feat.setAttributes(['Trajet à pied', 'Les Chênes 2', 'Maison des étudiants']) coucheLignesTemporaire.startEditing() coucheLignesTemporaire.addFeature(feat) coucheLignesTemporaire.commitChanges() coucheLignesTemporaire.triggerRepaint() # Ajouter une ligne p1 = QgsPointXY(2.0751702, 49.0396174) # Les Chênes 1 p2 = QgsPointXY(2.0755668, 49.0390390) p3 = QgsPointXY(2.0751407, 49.0388964) # Maison des étudiants ligne_geom = QgsGeometry.fromPolylineXY([p1, p2, p3]) feat = QgsFeature() feat.setGeometry(ligne_geom) feat.setAttributes(['Trajet à pied', 'Les Chênes 1', 'Maison des étudiants']) coucheLignesTemporaire.startEditing() coucheLignesTemporaire.addFeature(feat) coucheLignesTemporaire.commitChanges() coucheLignesTemporaire.triggerRepaint() # Afficher la couche temporaire des lignes coucheLignesTemporaire.updateExtents() project.addMapLayer(coucheLignesTemporaire) symbolLigne = QgsLineSymbol.createSimple({'line_style': 'dash', 'line_width': '0.5', 'color': 'black'}) coucheLignesTemporaire.renderer().setSymbol(symbolLigne) coucheLignesTemporaire.triggerRepaint() # Export des couches dans un GeoPackage en conservant les styles processing.run( "native:package", { 'LAYERS':[pointSites,ligneTrajets], 'OUTPUT':cheminGeopackage, 'OVERWRITE':True, 'SAVE_STYLES':True, 'SAVE_METADATA':True, 'SELECTED_FEATURES_ONLY':False, 'EXPORT_RELATED_LAYERS':False} )
On peut ensuite ouvrir les couches du geopackage, avec leur légende initiale, comme ça :
# Ouvrir les couches depuis le GeoPackage mes_points_geopackage = QgsVectorLayer(cheminGeopackage + '|layername=' + pointSites, pointSites, 'ogr') project.addMapLayer(mes_points_geopackage) mes_lignes_geopackage = QgsVectorLayer(cheminGeopackage + '|layername=' + ligneTrajets, ligneTrajets, 'ogr') project.addMapLayer(mes_lignes_geopackage)