New
Peux-tu me donner un exemple de code Python pour exécuter des requêtes SQL (dont des requêtes spatiales pour travailler sur les géométries) sur un GeoPackage (.gpkg), via le module sqlite3 ?
2/2
Jan 14, 5:39pm

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.

Prérequis

  • Avoir un fichier GeoPackage (.gpkg) existant.
  • Installer sqlite3 (inclus dans la bibliothèque standard de Python).

Exemple de code

python
import 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()

Explications

  • Activation des extensions spatiales : load_extension('mod_spatialite') permet d’utiliser les fonctions spatiales (comme ST_Intersects, ST_AsText, etc.).
  • Requêtes spatiales : Les fonctions comme ST_Intersects, ST_MakeEnvelope, ST_AsText sont spécifiques à SpatiaLite et permettent de manipuler les géométries.
  • Adaptation : Remplacez votre_fichier.gpkg et votre_table par vos propres noms.

Remarques

  • Si vous utilisez un environnement où mod_spatialite n’est pas disponible, assurez-vous que SpatiaLite est installé sur votre système.
  • Pour des opérations plus avancées, vous pouvez aussi utiliser la bibliothèque 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 ?

Jan 14, 5:39pm
Je vois que tu n'as pas exécuté cette requête SQL :
SELECT InitSpatialMetaData();

Je ne suis pas sûr de son utilité sur un GPKG, avant mes requêtes spatiales.
Jan 14, 5:48pm

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) :


1. À quoi sert 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 :

sql
SELECT InitSpatialMetaData();

→ Cela prépare une base SQLite pour recevoir des couches spatiales.


2. Est-ce utile sur un GeoPackage (.gpkg) ?

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à.


3. Que faire à la place ?

  • Vérifier la structure (optionnel) :

    sql
    SELECT 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) :

    sql
    SELECT load_extension('mod_spatialite');

    → Cela permet d’utiliser les fonctions spatiales (ST_Intersects, ST_AsText, etc.) sur les géométries du GeoPackage.


4. Résumé des bonnes pratiques

InitSpatialMetaData()
❌ Inutile (voire dangereux)
✅ Nécessaire
load_extension('mod_spatialite')
✅ Recommandé
✅ Recommandé

5. Exemple de code adapté

python
import 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 ?

Jan 14, 5:48pm

This Chat is read-only. Login to resume chatting.

import 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()
SELECT name FROM sqlite_master WHERE type='table';
import 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()