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