Recette
#6: |
|
Février 2011 |
Nous allons maintenant étudier en détail comment définir
correctement une colonne géométrique. |
CREATE TABLE test_geom
( |
SELECT
AddGeometryColumn('test_geom', 'the_geom', |
C'est la seule façon d'obtenir une colonne géométrique
valide.
Toutes autres approches entraînera nécessairement des
erreurs.
SELECT
AddGeometryColumn('test_geom', 'the_geom', |
SELECT
AddGeometryColumn('test_geom', 'the_geom', |
Bien que la syntaxe précédente soit la plus courante, celle ci est la plus complète admise par AddGeometryColumn():
le dernier argument (optionnel) signifie: NOT NULL
la valeur ZERO (par défaut) indique que la colonne géométrie ne peut contenir de valeurs NULLe.
En spécifiant explicitement la valeur 1, les géométries NON NULLes seront acceptées.
Choix du SRIDs:
tous les SRID définis au sein de la table metadata spatial_ref_sys est autorisé (ie tous les codes EPSG).
-1 spécifie tout simplement à un système de projection (SRS) inconnu ou non spécifié.
Les types Géométriques supportés:
Geometry Type |
Notes |
POINT |
Types géométriques communs: |
LINESTRING |
|
POLYGON |
|
MULTIPOINT |
|
MULTILINESTRING |
|
MULTIPOLYGON |
|
GEOMETRYCOLLECTION |
Peu utilisé: non supporté par les Shapefiles et les logiciels SIG |
GEOMETRY |
Classe non instanciable, regroupant l'ensemble des types
géométriques |
Choix de la Dimension:
Dimension model |
Alias |
Notes |
XY |
2 |
X et Y coords (simple 2D) |
XYZ |
3 |
X, Y et Z coords (3D) |
XYM |
|
X et Y coords + valeur mesurée M |
XYZM |
|
X, Y et Z coords + valeur mesurée M |
Erreur courante: |
Je suppose qu'un coup d’œil rapide à la façon dont
AddGeometryColumn() affecte la BDD vous permettra de mieux
comprendre.
PRAGMA table_info(test_geom); |
cid |
name |
type |
notnull |
dflt_value |
pk |
0 |
id |
INTEGER |
1 |
NULL |
1 |
1 |
name |
TEXT |
1 |
NULL |
0 |
2 |
measured_value |
DOUBLE |
1 |
NULL |
0 |
3 |
the_geom |
POINT |
0 |
NULL |
0 |
étape 1: une nouvelle colonne test_geom a été ajoutée à la table correspondante.
SELECT * |
f_table_name |
f_geometry_column |
type |
coord_dimension |
srid |
spatial_index_enabled |
test_geom |
the_geom |
POINT |
XY |
4326 |
0 |
étape 2: la ligne correspondante a été insérée dans la table metadata geometry_columns.
SELECT * |
type |
name |
tbl_name |
rootpage |
sql |
trigger |
ggi_test_geom_the_geom |
test_geom |
0 |
CREATE
TRIGGER "ggi_test_geom_the_geom" BEFORE INSERT ON
"test_geom" |
trigger |
ggu_test_geom_the_geom |
test_geom |
0 |
CREATE
TRIGGER "ggu_test_geom_the_geom" BEFORE UPDATE ON
"test_geom" |
étape 3: la table
sqlite_master est
la table metadata principale utilisée par SQLite pour stocker
les objets géométriques.
Comme vous pouvez le constater, chaque
géométrie nécessite des triggers pour être pleinement
comprises et gérées par la BDD.
Rien de bien surprenant, tout
ceci doit être définit d'une manière très robuste afin de
permettre à SpatiaLite de fonctionner correctement.
Si des
éléments viennent à manquer ou à être modifiés, la BDD spatiale
sera inévitablement défectueuse
SELECT DiscardGeometryColumn('test_geom', 'the_geom'); |
Cette commande va supprimer toutes les tables metadata ainsi que
les trigger liés à la colonne géométrique. note: cependant, tous
les objects géométriques stockés dans la table seront
indemnes.
Simplement, suite l'appel de la fonction
DiscardGeometryColumn(...)
ils ne seront plus considérés comme des géométries légitimes,
mais comme des valeurs BLOB anonymes et génériques.
SELECT
RecoverGeometryColumn('test_geom', 'the_geom', |
Ceci va tenter de recréer toutes les tables metadata et
les trigger associé à la colonne géométrique
correspondante.
Si cette opération réussie, la colonne
géométrique deviens alors légitime.
En d'autres termes, il n'y
a absolument pas de différences entre une colonne géométrique
créée avec AddGeometryColumn()
et une autre créée avec RecoverGeometryColumn().
Très simplement:
AddGeometryColumn() permet de créer une nouvelle colonne, vide.
RecoverGeometryColumn() permet de recréer une colonne géométrique à partir d'une colonne pré-éxistante
Problèmes de compatibilité entre les différentes versions SpatiaLite peut être amené à évoluer, et il en va de même
pour SQLite. |
Dans certains cas, cette incompatibilité est majeure: e.g.
l'utilisation de la géométrie 3D est impossible dans les versions
antérieures de SpatiaLite
Mais dans la plupart des cas, il s'agit
simplement de petites incompatibilités au niveau de fonctions
binaires utilisées par les triggers.
Astuce utile Pour tenter de résoudre d'éventuels problèmes d'incompatibilité:
Ceci va permettre de s'assurer que les tables metadata et que les trigger soient compatibles avec la version utilisée. |
|
Author: Alessandro Furieri a.furieri@lqt.it |
This work is licensed under the Attribution-ShareAlike 3.0 Unported (CC BY-SA 3.0) license. |
|
|
|
Permission is granted to copy, distribute and/or modify this
document under the terms of the |