Chapitre 3. Foire aux questions



 Table des matières

3.1. Quel type d'objets géométriques puis-je stoquer ?
3.2. Comment insérer un objet SIG dans la base de données ?
3.3. Comment construire une requête spatiale ?
3.4. Comment rendre plus rapide des requêtes spatiale sur de grandes tables ?
3.5. Pourquoi les arbres R de PostgreSQL ne sont-ils pas supportés ?
3.6. Pourquoi dois-je utiliser la fonction AddGeometryColumn() et toutes les autres fonctions de l'OpenGIS ?
3.7. Quelle est la meilleure façon de trouver tous les objets autour d'un autre ?
3.8. Comment puis-je appliquer une reprojection de coordonnées dans une requête ?

3.1. Quel type d'objets géométriques puis-je stoquer ?

Vous pouvez stocker des points, des lignes, des polygones, des multipoints, des multilignes, des multipolygones et des geometrycollections. Ceci est spécifié dans le format Textuel Bien Connu (Well Known Text) de l'OpenGIS Consortium (avec les extensions XYZ, XYM, XYZM).

haut de la page | table des matières

3.2. Comment insérer un objet SIG dans la base de données ?

Avant tout, vous devez créer une table avec une colonne de type "géométrique" pour stocker vos données SIG. Connectez-vous à la base de données avec psql et essayez le code SQL suivant :

CREATE TABLE gtest ( ID int4, NAME varchar(20) );
SELECT AddGeometryColumn('', 'gtest','geom',-1,'LINESTRING',2);

Si l'ajout de la colonne gémétrique échoue, c'est sans doute que vous n'avez pas chargé les fonctions et objets PostGIS dans la base de données. Consultez les instructions d'installation.

Ensuite, vous pouvez insèrer un objet géométrique dans la table en utilisant la commande SQL INSERT. L'objet SIG est fomaté en utilisant le format Textuel Bien Connu (Well Known Text) de l'OpenGIS Consortium :

INSERT INTO gtest (ID, NAME, GEOM) VALUES (1, 'First Geometry', GeomFromText('LINESTRING(2 3,4 5,6 5,7 8)', -1));

Pour plus d'information concernant les autres objets SIG, consultez la référence de l'objet.

Pour visualiser vos objets SIG de la table :

SELECT id, name, AsText(geom) AS geom FROM gtest;

Le résultat obtenu devrait ressembler à quelque chose comme ça :

 id |      name      |           geom
----+----------------+-----------------------------
  1 | First Geometry | LINESTRING(2 3,4 5,6 5,7 8 )
(1 row)

haut de la page | table des matières

3.3. Comment construire une requête spatiale ?

De la même manière que vous construisez n'importe quel autre type de requête pour vos bases de données, comme une combinaison SQL de valeurs de retour, fonctions et autre tests booléens.

Pour les requêtes spatiales, il y a deux choses importantes à garder à l'esprit lorsque vous construisez votre requête : y-a-t-il un index spatial que vous pouvez utiliser ; et, faites vous des calculs couteux sur un grand nombre de géométries.

En général, vous voudrez utiliser l'opérateur d'intersection (&&) qui test si les cadres limites des objets s'intersectent. La raison pour laquelle l'opérateur && est utile vient du fait que si un index spatial est disponible pour accélérer le test, l'opérateur && l'utilisera. Ceci peut rendre les requête beaucoup plus rapides.

Vous pourrez aussi utiliser des fonctions spatiales, comme par exemple Distance(), Intersects(), Contains() et Within(), parmi tant d'autres, pour limiter les résultats de vos recherches. La plupart des requêtes spatiales contiennent à la fois un test indexé et un test utilisant une fonction spatiale. Le test indexé sert à limiter le nombre de tuples résultants, uniquement ceux qui respectent la condition. La fonction spatiale est ensuite utilisée afin de tester réellement la condition.

SELECT id, the_geom FROM thetable
WHERE
the_geom && 'POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))'
AND
Contains(the_geom,'POLYGON((0 0, 0 10, 10 10, 10 0, 0 0))';

haut de la page | table des matières

3.4. Comment rendre plus rapide des requêtes spatiale sur de grandes tables ?

Les requêtes rapides sur de grandes tables sont la raison d'être des bases de données spatiales (transactionnelles) donc avoir un bon index est primordial.

Pour construire vos index spatiaux sur les tables qui ont un colonne géométrique, utilisez la fonction CREATE INDEX de la manière suivante :

CREATE INDEX [nom_de_index] ON [nom_de_la_table]
USING GIST ( [colonne_géométrique] );

L'option USING GIST signifie que le serveur doit utiliser un index GiST (Generalized Search Tree, en d'autres termes : un arbre de recherche généralisé).

Les index GiST sont supposés à perte. Les index à perte utilisent un objet par procuration (dans le cas spatial, le cadre limite) pour construire l'index.

Vous devriez aussi vous assurer que le planificateur de requête de PostgreSQL a suffisamment d'informations concernant votre index pour prendre une décision rationnelle quant à son utilisation. Pour ce faire, vous devez rassembler les statistiques de vos tables géométriques.

Pour PostgreSQL 8.0.x et supérieur, lancez simplement la commande VACUUM ANALYZE

Pour PostgreSQL 7.4.x et précédant, lancez la commande : SELECT UPDATE_GEOMETRY_STATS().

haut de la page | table des matières

3.5. Pourquoi les arbres R de PostgreSQL ne sont-ils pas supportés ?

Les précédentes versions de PostGIS utilisaient les arbres R de PostgreSQL. Cependant, les arbres R de PostgreSQL ont été totalement supprimé depuis la version 0.6, et l'indexation spatiale est disponible avec un schéma arbre R sur arbre de recherches généralisés (GiST).

Nos tests ont montrés que la rapidité d'exécution pour les arbres R natifs et les GiST sont comparables. Les arbres R natifs de PostgreSQL ont deux limitations qui les rendent inutilisable pour une utilisation dans le cadre SIG (notez que ces limitations sont dues à l'implémentation des arbres R natifs de PostgreSQL, et non au concept d'arbre R en lui-même) :

haut de la page | table des matières

3.6. Pourquoi dois-je utiliser la fonction AddGeometryColumn() et toutes les autres fonctions de l'OpenGIS ?

Si vous ne voulez pas utiliser les fonctionnalités spécifiées par l'OpenGIS, vous n'avez pas à les utiliser. Créez simplement vos tables comme vous le faisiez avec les versions précédentes, définissez vos colonnes géométriques lors de leurs créations. Toutes vos géométries auront alors -1 comme valeur pour SRID et les tables de méta-données de l'OpenGIS ne seront pas remplies correctement. Cependant, cela a pour conséquence que la plupart des applications basées sur PostGIS ne fonctionneront plus. C'est pourquoi il est généralement conseillé d'utiliser la fonction AddGeometryColumn() pour créer ses tables géométriques.
Par exemple Mapserver est une application qui utilise les méta-données de la table geometry_columns. Par exemple, Mapserver peut utiliser le SRID de la colonne géométrique afin de réaliser des reprojections.

haut de la page | table des matières

3.7. Quelle est la meilleure façon de trouver tous les objets autour d'un autre ?

Afin d'utiliser la base de données plus efficacement, il vaut mieux faire une requête de rayon qui combine le test de rayon et le test des cadres limites : le test de cadre limite utilise un index spatial, permettant un accès rapide à un sous-ensemble de données pour lesquels le test de rayon est ensuite effectué.

La fonction ST_DWithin(geometry, geometry, distance) permet de réaliser un calcul de distance utilisant les index. Elle fonctione en créant un espace rectangulaire de recherche suffisamment large pour contenir le rayon ayant la valeur du parmètre distance, ensuite elle réalise l'opération exacte de calcul de distance sur le sous-ensemble résultant.

Par exemple, pour trouver tout les objets dans un rayon de 100 mètres autour du point POINT(1000 1000), la requête suivante devrait bien fonctionner :


SELECT * FROM tablegeo
WHERE ST_DWithin(colonnegeo, 'POINT(1000 1000)', 100.0);

haut de la page | table des matières

3.8. Comment puis-je appliquer une reprojection de coordonnées dans une requête ?

Pour effectuer une reprojection, les systèmes de références spatiales source et destination doivent être tout deux définis dans la table SPATIAL_REF_SYS, et les géométries qui doivent être reprojetées doivent déjà avoir un SRID d'attribué. Une fois que cela est fait, une reprojection consiste simplement à stipuler le SRID du système de projection désiré pour la destination. L'exemple ci-dessous reprojette une géométrie dans le système NAD 83 long lat. Cet exemple ne fonctionnera que si la valeur du srid de la colonne the_geom est différente de -1 (qui correspond à un système de référence indéfini).

SELECT ST_Transform(the_geom,4269) FROM geotable;
haut de la page | table des matières