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 :

Pour plus d'informations sur l'utilisation de tables appliquant le stockage ST_Geometry à l'aide de SQL, reportez-vous aux rubriques suivantes :

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 :

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 :

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>)
    Exécutez l'instruction suivante pour inscrire la colonne shape de la table blocks et lui attribuer un SRID :
    SELECT st_register_spatial_column(
    'mycitydb', 'sasha', 'blocks', 'shape', 4)
    Cette opération ajoute la colonne spatiale à la table sde_geometry_columns dans la géodatabase. Le SRID spécifié (4 dans l'exemple précédent) doit figurer dans la table sde_spatial_references. Si la référence spatiale souhaitée ne figure pas dans la table sde_spatial_references, il est conseillé d'ouvrir ArcCatalog, de se connecter à la géodatabase et de créer une nouvelle classe d'entités utilisant le système de référence spatiale souhaité et le stockage ST_Geometry. Ainsi, la table sde_spatial_references est renseignée avec la référence spatiale nécessaire et ArcCatalog calcule automatiquement les décalages x, y, z et m-, ainsi que les unités et l'étendue de la couche. Il est également possible d'insérer la référence spatiale à l'aide de SQL mais, dans un tel cas, il vous appartient de calculer les décalages x, y, z et m- ainsi que les unités correspondantes. Notez toutefois qu'il est nécessaire de désinscrire la colonne ST_Geometry pour inscrire la table dans ArcSDE à l'aide de la commande sdelayer. Par exemple, vous pouvez créer une table dans laquelle d'autres utilisateurs pourront ensuite effectuer des insertions avec SQL. Pour imposer l'utilisation d'un SRID unique, vous pouvez inscrire la colonne ST_Geometry avec le SRID de votre choix. Ensuite, exécutez la fonction st_unregister_spatial_column lorsque vous souhaitez inscrire la table dans ArcSDE. (Voir l'astuce suivante.)
  • 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>')
    Cette opération est conseillée avant d'inscrire la table dans ArcSDE, ou pour inscrire une colonne spatiale vide avec un SRID différent ; vous pouvez alors la désinscrire et la réinscrire avec un SRID différent à l'aide de la fonction st_register_spatial_column.
  • 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>) 
    Cette instruction renvoie 1 si la colonne spatiale est inscrite et 0 si elle ne l'est pas.

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.


7/10/2012