Stockage ST_Geometry dans PostgreSQL
ArcSDE pour PostgreSQL prend en charge des types de stockage de géométries permettant un accès à la géodatabase en langage SQL (Structured Query Language) conforme aux normes de l'ISO (International Organization for Standardization) et de l'OGC (Open Geospatial Consortium, Inc.). Ces types de stockage sont ST_Geometry et géométrie PostGIS. Ils étendent les capacités de la base de données PostgreSQL en permettant le stockage d'objets (points, lignes et polygones) représentant des entités géographiques. Ils permettent d'intégrer des données spatiales à d'autres types de données commerciales ; ainsi, votre base de données multi-utilisateurs s'enrichit d'un composant géographique associé à vos analyses et produits de données. En réduisant le nombre de sources de données à gérer, le stockage en commun de vos données spatiales et d'autres objets commerciaux simplifie également l'accès des utilisateurs multiples, la gestion et la protection de vos données.
Par défaut, une géodatabase ArcSDE dans PostgreSQL utilise le type spatial ST_Geometry. Il implémente les spécifications SQL 3 pour les types de données définis par l'utilisateur (UDT), qui permettent de créer des colonnes capables de stocker des données spatiales telles que la localisation d'un point de repère, d'une rue ou d'une parcelle. Pour obtenir une explication sur le type spatial ST_Geometry, reportez-vous à la rubrique Qu'est-ce que le type de stockage ST_Geometry ?.
L'utilisation du type spatial ST_Geometry dans une géodatabase de PostgreSQL vous permet d'accéder aux données spatiales à l'aide de fonctions SQL appliquant la norme spatiale SQL/MM de l'ISO, ainsi que la spécification relative aux entités simples de l'OGC. Vous pouvez utiliser des commandes SQL pour stocker, extraire ou manipuler des entités spatiales de la même façon que tout autre type de données. Avec les commandes SQL et les procédures mémorisées, vous pouvez utiliser un nombre important de fonctions conformes aux normes pour l'extraction et l'analyse de données spatiales. L'accès aux données par SQL vous permet d'utiliser d'autres applications pour accéder aux données créées dans une géodatabase dans PostgreSQL.
Cette rubrique décrit les éléments suivants :
- Architecture du type spatial tel qu'utilisé dans une géodatabase ArcSDE de PostgreSQL
- Procédure de stockage de classes d'entités à l'aide du stockage ST_Geometry
- Enregistrements dans la table sde_coordinate_system
- Où trouver de la documentation complémentaire
Pour plus d'informations sur l'utilisation de tables appliquant le stockage ST_Geometry à l'aide de SQL, reportez-vous aux rubriques suivantes :
- Création de tables avec une colonne ST_Geometry
- Insertion d'entités dans une table avec une colonne ST_Geometry
- Interrogation des tables ayant une colonne ST_Geometry
- Mise à jour de valeurs dans une colonne spatiale ST_Geometry à l'aide de SQL
- Utilisation des vues spatiales sur les tables comportant une colonne ST_Geometry
Pour plus d'informations sur le type de géométrie PostGIS, consultez la rubrique Qu'est-ce que le type de géométrie PostGIS ?.
Méthode de stockage des données spatiales dans ST_Geometry
Voici la description de ST_Geometry dans PostgreSQL :
Nom |
Type |
Description |
---|---|---|
taille |
LONG INTEGER |
Longueur totale de la structure ST_Geometry, y compris la zone tampon de la forme. |
srid |
LONG INTEGER |
Contient l'identifiant de la géométrie la reliant à son enregistrement de référence spatiale (système de coordonnées) associé dans la table sde_spatial_references. |
numpts |
LONG INTEGER |
Nombre de points définissant la géométrie. Pour les géométries multi-parties, ce nombre inclut les séparateurs entre les différentes parties, à raison d'un point par séparateur. |
entity |
SHORT INTEGER |
Type d'entité géométrique stockée dans la colonne spatiale (linestring, multilinestring, multi-points, multi-polygones, point ou polygone), dont la valeur est un masque binaire dérivé de la procédure mémorisée st_geom_util. |
sqltype |
SHORT INTEGER |
Type SQL pour la forme ; par exemple, POINT_TYPE, POINTM_TYPE ou MULTIPOLYGONZM_TYPE. |
minx |
LFLOAT |
Définit l'enveloppe spatiale de la géométrie avec miny, maxx et maxy. |
miny |
LFLOAT |
Définit l'enveloppe spatiale de la géométrie avec minx, maxx et maxy. |
maxx |
LFLOAT |
Définit l'enveloppe spatiale de la géométrie avec minx, miny et maxy. |
maxy |
LFLOAT |
Définit l'enveloppe spatiale de la géométrie avec minx, miny et maxx. |
minz |
LFLOAT |
Valeur z minimale. |
maxz |
LFLOAT |
Valeur z maximale. |
minm |
LFLOAT |
Valeur de mesure minimale. |
maxm |
LFLOAT |
Valeur de mesure maximale. |
surface |
LFLOAT |
Surface de la géométrie |
len |
LFLOAT |
Périmètre de la géométrie. |
forme |
BYTEA |
Forme compressée par ESRI. |
Comme d'autres types d'objets, le type de données ST_Geometry contient une méthode constructeur et des fonctions. Une méthode constructeur est une fonction qui renvoie une nouvelle instance (objet) du type de données et définit les valeurs de ses attributs.
Le nom du constructeur est le même que celui du type (ST_Geometry). Lorsque vous instanciez un objet de type ST_Geometry, vous invoquez la méthode constructeur, comme illustré dans l'exemple suivant :
CREATE TABLE hazardous_sites (name varchar(128), location st_geometry);
Les accesseurs ST_Geometry suivants prennent un seul élément ST_Geometry en entrée et renvoient la valeur de propriété demandée en tant que nombre :
- La fonction membre ST_Area renvoie la surface d'une géométrie.
- ST_Len renvoie la longueur d'une géométrie.
- ST_Entity renvoie un nombre contenant un masque binaire qui décrit le type d'entité.
- ST_NumPoints renvoie le nombre de points (sommets) qui définissent une géométrie.
- ST_MinM, ST_MinX, ST_MinY et ST_MinZ renvoient la coordonnée minimale souhaitée d'une géométrie.
- ST_MaxM, ST_MaxX, ST_MaxY et ST_MaxZ renvoient la coordonnée maximale souhaitée d'une géométrie.
- ST_SRID renvoie l'identifiant de référence spatiale d'une géométrie.
Par exemple, la requête suivante renvoie le nom et la surface des différents états des Etats-Unis.
SELECT name, st_area(geometry) FROM us_states ORDER BY name;
ST_LineString, ST_MultiLineString, ST_MultiPoint, ST_MultiPolygon, ST_Point et ST_Polygon sont tous des sous-types (ou sous-classes) de ST_Geometry. ST_Geometry et ses sous-types ont des attributs et fonctions en commun. La définition du constructeur est la même pour ST_LineString, ST_MultiLineString, ST_MultiPoint, ST_MultiPolygon, ST_Point et ST_Polygon. Le nom du constructeur est identique à celui du type qu'il construit.
Structure de métadonnées
Le type spatial des types PostgreSQL et les tables de métadonnées sont stockés dans la structure sde. La définition de structure est la description de la table de base pour les tables de métadonnées permettant de définir et de décrire la colonne (ou la table), l'index spatial et les informations de références spatiales du type.
Pour obtenir la description de chaque table, reportez-vous aux tables répertoriées sous Tables système d'une géodatabase stockée dans PostgreSQL. Les tables sont st_coordinate_systems, st_units_of_measure, sde_geometry_columns, sde_spatial_references et sde_coordinate_system.
Création de classes d'entités avec le stockage ST_Geometry à l'aide d'ArcGIS
Lors de la première installation d'ArcSDE pour PostgreSQL, ST_Geometry est le type de stockage de géométries par défaut lors de la création de classes d'entités avec ArcGIS Desktop ou avec la commande sdelayer. Les paramètres par défaut pour le stockage ArcSDE sont définis dans la table sde_dbtune par le paramètre GEOMETRY_STORAGE du mot-clé de configuration DEFAULTS. Si vous ne modifiez pas la valeur du paramètre GEOMETRY_STORAGE du mot-clé DEFAULTS, toutes vos classes d'entités sont créées à l'aide du stockage ST_Geometry, sauf si vous spécifiez un mot-clé de configuration différent ayant un paramètre GEOMETRY_STORAGE défini sur PG_GEOMETRY lors de la création de la classe d'entités.
En cas de modification du paramètre GEOMETRY_STORAGE du mot-clé DEFAULTS en PG_GEOMETRY, indiquant le type spatial utilisé par PostGIS, il est utile de créer un nouveau mot-clé de configuration pour le stockage ST_Geometry. Vous pouvez par exemple créer un mot-clé de configuration de la façon suivante :
##ST_GEOMETRY GEOMETRY_STORAGE "ST_GEOMETRY" UI_TEXT "User-interface for ST_GEOMETRY keyword" END
L'utilisation de la commande sdedbtune permet de modifier ou d'ajouter des valeurs à la table sde_dbtune. Pour obtenir des instructions, reportez-vous à Modification du contenu de la table DBTUNE après sa création.
Les types de stockage PostGIS et ST_Geometry sont utilisables simultanément dans une même base de données. Bien qu'il ne puisse y avoir qu'un seul type de stockage de géométries par défaut, vous pouvez créer des tables individuelles avec des types de stockage de géométries différents. Par conséquent, si vous modifiez le paramètre par défaut GEOMETRY_STORAGE en PG_GEOMETRY, il reste possible de créer certaines classes d'entités à l'aide du type de stockage ST_GEOMETRY en spécifiant un mot-clé semblable à celui indiqué précédemment.
Lors de la création d'une classe d'entités utilisant la valeur ST_GEOMETRY du paramètre GEOMETRY_STORAGE, la table métier de la classe d'entités est créée avec une colonne de type ST_Geometry dans laquelle sont stockées les données spatiales pour la classe d'entités.
Utilisation de tables PostgreSQL existantes avec des colonnes ST_Geometry
L'utilisation de SQL pour créer une table avec une colonne ST_Geometry permet d'inscrire la table dans ArcSDE si les critères suivants sont vérifiés :
- La table doit appartenir à l'utilisateur qui effectue son inscription.
- Elle doit comporter une seule colonne ST_Geometry.
- Elle ne doit pas avoir d'autres colonnes d'un type défini par l'utilisateur.
- Elle doit contenir un seul type de géométrie (points, lignes ou polygones), cette géométrie peut toutefois être de type multi-parties (multipoint, multilinestring, ou multipolygon).
- Tous les enregistrements de la table doivent utiliser la même référence spatiale.
Il est également nécessaire de disposer d'une colonne de nombres entiers, uniques et de valeur non NULL utilisable comme identifiant d'enregistrement. Vous pouvez ajouter cette colonne à la table avant l'inscription dans ArcSDE ou pendant cette inscription.
De plus, la table doit comporter un index spatial. Cet élément peut être ajouté à l'aide de SQL avant ou après l'inscription de la table dans ArcSDE.
Création d'une table avec une colonne ST_Geometry
Dans l'exemple suivant, une table nommée blocks est créée avec une colonne ST_Geometry nommée shape à l'aide de SQL.
CREATE TABLE sasha.blocks (objectid integer NOT NULL, block varchar(4), res smallint, shape st_geometry) WITHOUT OIDS;
Création d'un index spatial pour la table
ArcSDE pour PostgreSQL utilise un index GiST (Generalized Search Tree). Utilisez une instruction CREATE INDEX avec la méthode d'accès GiST et la classe d'opérateur st_geometry_ops afin de créer un index sur la colonne ST_Geometry d'une table. Par exemple :
CREATE INDEX blockssp_idx ON blocks USING gist(zone st_geometry_ops);
Inscription de la table dans ArcSDE
Une fois que la table avec la colonne ST_Geometry existe et dispose d'un index spatial, utilisez la commande sdelayer –o register pour inscrire la table dans ArcSDE. Lors de l'inscription d'une table dans ArcSDE, un enregistrement est ajouté pour cette dernière dans les tables système sde_layers, sde_table_registry et sde_geometry_columns. Des enregistrements sont également ajoutés à la table système sde_column_registry pour chaque colonne de la table.
sdelayer –o register –l blocks,shape –e a –C objectid,SDE –R 5 –t ST_GEOMETRY – s myserver –i sde:postgresql:myserver –D mycitydb –u sasha –p super1
L'inscription de la colonne d'ID d'enregistrement comme gérée par l'utilisateur peut permettre d'accélérer l'inscription des tables contenant un grand nombre d'enregistrements.
sdelayer –o register –l blocks,shape –e a –C objectid,USER –t ST_GEOMETRY –s myserver –i sde:postgresql:myserver –D mycitydb –u sasha –p super1
Si vous inscrivez la colonne des identifiants d'entités comme gérée par l'utilisateur, puis inscrivez la classe d'entités dans la géodatabase, ArcGIS ajoute une colonne d'ID d'enregistrement supplémentaire, appelée object_ID. ArcGIS assure la mise à jour des valeurs de cette colonne. Si la table contient un grand nombre d'enregistrements, l'ajout de cette colonne object_ID supplémentaire peut nécessiter un certain temps.
Il est inutile de spécifier un SRID avec la commande sdelayer si vous avez inscrit votre colonne spatiale et avez spécifié un ID de référence spatiale (SRID) pour la table à l'aide de la fonction st_register_spatial_column. Cependant, vous devez spécifier un SRID valide avec l'option –R si vous n'en avez pas déjà attribué à la table, comme illustré dans l'exemple suivant :
sdelayer –o register –l infestations,site –e p+ –C siteid,SDE –s myserver –t ST_GEOMETRY –R 3 –i sde:postgresql:myserver –D meddb –u blorca –p it.s.me
Comme indiqué précédemment dans cette rubrique, si la référence spatiale nécessaire n'existe pas dans la table sde_spatial_references, créez une classe d'entités modèle dans ArcCatalog utilisant la référence spatiale souhaitée et interrogez la table sde_spatial_references pour voir quel SRID lui a été attribué. Il s'agit du nombre utilisé lors de l'inscription d'autres tables spatiales dans le même système de référentiel de coordonnées.
Le SRID du premier enregistrement sera utilisé si vous n'inscrivez pas la colonne spatiale avec un SRID à l'aide de la fonction st_register_spatial_column et si vous n'en spécifiez pas un avec l'option –R lors de l'inscription de la table dans ArcSDE. Une valeur SRID de 0 sera utilisée si vous n'enregistrez pas la colonne spatiale avec un SRID à l'aide de la fonction st_register_spatial_column et si la table est vide. Cette valeur de SRID n'existe que pour la documentation ou à titre d'exemple et ne doit pas être utilisée avec les données de production. Les spécifications correspondant à ce SRID sont les suivantes :
falsex |
- 400 |
falsey |
- 400 |
xyunits |
1000000000 |
falsez |
- 100000 |
unités z |
10000 |
falsem |
- 100000 |
munits |
10000 |
xycluster_tol |
0.000000008983153 |
zcluster_tol |
.001 |
mcluster_tol |
.001 |
srtext |
GEOGCS["GCS_WGS_1984",DATUM["D_WGS_1984",SPHEROID["WGS_1984",6378137.0,298.257223563]], PRIMEM["Greenwich",0.0],UNIT["Degré",0.0174532925199433]] |
cs_id |
4326 |
organisation |
EPSG |
Pour connaître la syntaxe complète et obtenir une description de la commande sdelayer, consultez le manuel ArcSDE Administration Command Reference fourni avec ArcGIS Server Enterprise.
La commande sdelayer effectue uniquement l'ajout de la table aux tables système ArcSDE. Pour activer les fonctionnalités de géodatabase d'ArcGIS Desktop, telles que la topologie, le versionnement et les réseaux, il est également nécessaire d'inscrire la table dans la géodatabase. Pour plus d'informations, reportez-vous à Enregistrement d'une table dans la géodatabase et Enregistrement d'une table tierce contenant une colonne spatiale.
Astuces
- Vous pouvez inscrire la colonne spatiale dans une table ayant une colonne ST_Geometry en exécutant la fonction sde.st_register_spatial_column. Cette opération attribue le SRID de la table et empêche ainsi les utilisateurs de spécifier d'autres SRID lors de l'insertion de données à l'aide de SQL.
SELECT st_register_spatial_column( '<database_name>', '<schema_name>', '<table_name>', '<spatial_column_name>', <srid>)
SELECT st_register_spatial_column( 'mycitydb', 'sasha', 'blocks', 'shape', 4)
- Vous pouvez désinscrire une colonne spatiale en exécutant la fonction st_unregister_spatial_column(). Cette fonction permet de désinscrire une colonne spatiale en la supprimant de la table système sde_geometry_columns de telle sorte qu'elle n'est plus associée à aucun système de référence spatiale.
SELECT st_unregister_spatial_column( '<database_name>', '<schema_name>', '<table_name>', '<column_name>')
- Vous pouvez vérifier l'inscription effective d'une colonne spatiale en exécutant la fonction st_isregistered_spatial_column.
SELECT st_isregistered_spatial_column( '<database_name>', '<schema_name>', '<table_name>', '<column_name>', <srid>)
Enregistrements dans la table sde_coordinate_systems
La table sde_coordinate_systems de la structure SDE stocke l'ID et la description des systèmes de coordonnées utilisés dans la base de données. Les systèmes de coordonnées sont renseignés dans cette table lors de la création de la géodatabase.
Vous pouvez utiliser les systèmes de coordonnées de cette table pour les classes d'entités créées avec ArcGIS Desktop ou SQL.
Vous devez créer une référence spatiale en complément de l'attribution d'un système de coordonnées. ArcGIS Desktop effectue cette opération dans le cadre de la création de classe d'entités. Pour créer une référence spatiale pour des tables à l'aide de SQL, reportez-vous à Création d'index spatiaux pour les tables ayant une colonne ST_Geometry.
Où trouver de la documentation sur PostgreSQL
Vous trouverez la documentation PostgreSQL sur le site Web PostgreSQL Web à l'adresse http://www.postgresql.org/docs/. Cette documentation contient des informations sur l'installation et l'administration de PostgreSQL, sur les commandes et la programmation SQL, ainsi que des didacticiels sur l'utilisation de PostgreSQL.
- Groupes d'utilisateurs
Il existe de nombreux groupes d'utilisateurs de PostgreSQL à travers le monde. Vous trouverez certains d'entre eux à l'adresse http://pugs.postgresql.org/.
- Etudes de cas
Vous trouverez des liens vers des études de cas de sites utilisant PostgreSQL à l'adresse http://www.postgresql.org/about/casestudies/.
- Actualités hebdomadaires
Un bulletin d'informations publié chaque semaine détaille les nouveaux développements et les informations concernant PostgreSQL : http://www.postgresql.org/community/weeklynews/.