Index de l'article

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)

 

Liens ou pièces jointes
Télécharger ce fichier (data_BDTOPO_V3_Dep05_adresse.zip)data_BDTOPO_V3_Dep05_adresse.zip[ ]3889 Ko
Télécharger ce fichier (data_IRIS_2019.zip)data_IRIS_2019.zip[ ]45905 Ko
Télécharger ce fichier (decathlon_france.zip)decathlon_france.zip[308 magasins Décathlon français depuis OSM le 27 décembre 2020]11 Ko
Télécharger ce fichier (glaciers.zip)glaciers.zip[ ]231 Ko
Télécharger ce fichier (iso_iris.zip)iso_iris.zip[Des zones isochrones à 15 minutes autour de 308 POIs.]12125 Ko
Télécharger ce fichier (Koln GML.zip)Koln gml.zip[ ]2818 Ko
Télécharger ce fichier (peaks.zip)peaks.zip[ ]14 Ko
Télécharger ce fichier (peaks_selection.zip)peaks_selection.zip[ ]1 Ko
Télécharger ce fichier (simple_countries.zip)simple_countries.zip[ ]1880 Ko
Accéder à cette adresse URL (https://hg-map.fr/extern/data/shapes/france/sol.zip)sol.zip[ ]0 Ko
Accéder à cette adresse URL (https://hg-map.fr/extern/data/shapes/france/TRONCON_HYDROGRAPHIQUE.zip)TRONCON_HYDROGRAPHIQUE.zip[ ]0 Ko
Accéder à cette adresse URL (https://hg-map.fr/extern/data/shapes/france/TRONCON_ROUTE.zip)TRONCON_ROUTE.zip[ ]0 Ko
Accéder à cette adresse URL (https://hg-map.fr/extern/data/shapes/france/TRONCON_VOIE_FERREE.zip)TRONCON_VOIE_FERREE.zip[ ]0 Ko
Télécharger ce fichier (World Stats.xlsx)World Stats[ ]27 Ko