Bien sûr ! Voici un exemple de code Python qui utilise le module sqlite3 pour exécuter des requêtes SQL, y compris des requêtes spatiales, sur un fichier GeoPackage (.gpkg). Les GeoPackages sont des bases de données SQLite avec des extensions spatiales, ce qui permet d’utiliser des fonctions géométriques via le module sqlite3 standard, à condition d’activer les extensions spatiales.
sqlite3 (inclus dans la bibliothèque standard de Python).pythonimport sqlite3 # Chemin vers votre fichier GeoPackage gpkg_path = "votre_fichier.gpkg" # Connexion à la base de données GeoPackage conn = sqlite3.connect(gpkg_path) conn.enable_load_extension(True) # Activation des extensions spatiales (nécessaire pour les requêtes géométriques) conn.execute("SELECT load_extension('mod_spatialite');") # Exemple 1: Lister les tables disponibles print("Tables disponibles dans le GeoPackage:") tables = conn.execute("SELECT name FROM sqlite_master WHERE type='table';").fetchall() for table in tables: print(f"- {table[0]}") # Exemple 2: Exécuter une requête spatiale simple (ex: sélectionner les géométries d'une table) table_name = "votre_table" # Remplacez par le nom de votre table query = f""" SELECT id, ST_AsText(geom) as geometry FROM {table_name} LIMIT 5; """ print(f"\nExemple de géométries dans la table '{table_name}':") for row in conn.execute(query): print(f"ID: {row[0]}, Géométrie: {row[1]}") # Exemple 3: Requête spatiale avec filtre (ex: sélectionner les objets dans une zone) # Supposons que vous ayez une table 'batiments' avec une colonne 'geom' bbox = (48.85, 2.35, 48.86, 2.36) # Exemple de bbox (minx, miny, maxx, maxy) query = f""" SELECT id, ST_AsText(geom) FROM batiments WHERE ST_Intersects( geom, ST_MakeEnvelope({bbox[0]}, {bbox[1]}, {bbox[2]}, {bbox[3]}, 4326) ); """ print(f"\nBâtiments dans la bbox {bbox}:") for row in conn.execute(query): print(f"ID: {row[0]}, Géométrie: {row[1]}") # Fermeture de la connexion conn.close()
load_extension('mod_spatialite') permet d’utiliser les fonctions spatiales (comme ST_Intersects, ST_AsText, etc.).ST_Intersects, ST_MakeEnvelope, ST_AsText sont spécifiques à SpatiaLite et permettent de manipuler les géométries.votre_fichier.gpkg et votre_table par vos propres noms.mod_spatialite n’est pas disponible, assurez-vous que SpatiaLite est installé sur votre système.geopandas qui simplifie la manipulation des GeoPackages.Tu veux que j’adapte cet exemple pour un cas d’usage précis ou que j’explique une partie en détail ?
Tu as tout à fait raison de poser la question ! Voici ce qu’il faut savoir sur InitSpatialMetaData() et son utilité (ou non) avec un GeoPackage (.gpkg) :
InitSpatialMetaData() ?Cette commande est utilisée pour initialiser les métadonnées spatiales dans une base de données SQLite vide, afin de la transformer en une base compatible SpatiaLite. Elle crée les tables système nécessaires (geometry_columns, spatial_ref_sys, etc.) pour stocker et gérer les données géométriques.
Exemple d’utilisation classique :
sqlSELECT InitSpatialMetaData();
→ Cela prépare une base SQLite pour recevoir des couches spatiales.
Non, pas du tout.
Un fichier GeoPackage est déjà une base de données SQLite avec les métadonnées spatiales correctement configurées (selon la norme OGC). Exécuter InitSpatialMetaData() sur un GeoPackage existant peut même casser sa structure, car cela va essayer de recréer des tables système qui existent déjà.
Vérifier la structure (optionnel) :
sqlSELECT name FROM sqlite_master WHERE type='table';
Tu devrais voir des tables comme gpkg_contents, gpkg_geometry_columns, etc.
Activer SpatiaLite (si tu veux utiliser ses fonctions) :
sqlSELECT load_extension('mod_spatialite');
→ Cela permet d’utiliser les fonctions spatiales (ST_Intersects, ST_AsText, etc.) sur les géométries du GeoPackage.
InitSpatialMetaData()load_extension('mod_spatialite')pythonimport sqlite3 conn = sqlite3.connect("ton_fichier.gpkg") conn.enable_load_extension(True) conn.execute("SELECT load_extension('mod_spatialite');") # Pas besoin de InitSpatialMetaData() ! # Exemple de requête spatiale result = conn.execute(""" SELECT id, ST_AsText(geom) FROM ta_table LIMIT 1; """).fetchone() print(result) conn.close()
En résumé : Ne pas utiliser InitSpatialMetaData() sur un GeoPackage, mais bien activer SpatiaLite si tu veux utiliser ses fonctions spatiales.
Tu veux que je t’aide à adapter une requête spatiale précise ?