ST_Geometry dans PostgreSQL

Le type de données spatiales ST_Geometry peut être utilisé dans les bases de données PostgreSQL contenant une géodatabase et dans celles qui n'en contiennent pas. Le type de données ST_Geometry vous permet 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 que vous associez à vos analyses et à vos 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.

Dans PostgreSQL, les géodatabases utilisent le type spatial ST_Geometry par défaut, mais vous devez copier la bibliothèque st_geometry dans le répertoire d'installation de PostgreSQL avant de créer une géodatabase. Pour savoir comment procéder, reportez-vous à la rubrique Créer une géodatabase dans PostgreSQL sous Windows ou Créer une géodatabase dans PostgreSQL sous Linux. Si vous utilisez une base de données PostgreSQL qui ne contient pas de géodatabase, vous pouvez installer le type ST_Geometry à utiliser dans les tables spatiales que vous créez dans la base de données.

Pour vous aider à comprendre comment le type ST_Geometry est utilisé dans PostgreSQL, cette rubrique explique les points suivants :

Méthode de stockage des données spatiales dans ST_Geometry

Voici la description de ST_Geometry dans PostgreSQL :

NomTypeDescription

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é dans la colonne spatiale (linestring, multilinestring, multi-point, multi-polygones, point ou polygone).

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 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_Length 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.

Définition de structure ST_Geometry

Le type spatial des fonctions, tables et vues PostgreSQL est stocké dans la structure sde. La définition de structure est la description de la table de base pour les tables système 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.

Les tables sont sde_geometry_columns et sde_coordinate_systems. Les vues sont st_geometry_columns et st_spatial_references. Elles reposent sur ces tables.

Approfondissement :

Outre les vues, les fonctions et les tables système, les objets de base de données suivants sont utilisés pour gérer les informations ST_Geometry :

  • Un rôle de connexion sde
  • Une structure sde dans la base de données
  • Un déclencheur ST_Geometry : sde_coord_sys_def_insert_tg
  • Des domaines ST_Geometry :
    • st_geomcollection
    • st_linestring
    • st_multilinestring
    • st_multipoint
    • st_multipolygon
    • st_point
    • st_polygon

Utiliser ArcGIS pour créer des classes d'entités avec le stockage ST_Geometry

Vous choisissez le type de stockage à utiliser lors de la création des classes d'entités via ArcGIS Desktop.

Lors de la création d’une classe d’entités dans ArcGIS qui utilise le stockage ST_Geometry, 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 de la classe d’entités.

Dans une base de données

Vous spécifiez le type de données spatiales à utiliser lorsqu'une classe d'entités est créée dans ArcGIS.

Dans une géodatabase

Les informations de stockage des classes d'entités sont contrôlées par les paramètres des mots-clés de configuration dans la table DBTUNE. Vous spécifiez un mot-clé de configuration lorsque vous créez une classe d'entités dans ArcGIS. Le paramètre GEOMETRY_STORAGE du mot-clé de configuration DEFAULTS est défini sur ST_GEOMETRY lorsque la géodatabase est créée. Si vous souhaitez stocker toutes vos données spatiales (ou la plupart) avec le type ST_Geometry, ne modifiez pas la valeur du paramètre GEOMETRY_COLUMNS du mot-clé DEFAULTS. Ensuite, lors de la création d'une classe d'entités dans ArcGIS, spécifiez le mot-clé DEFAULTS.

Si vous modifiez le paramètre DEFAULTS GEOMETRY_STORAGE pour utiliser le type de données géométrie ou géographie PostGIS, mais que vous voulez créer certaines classes d’entités avec le type de données ST_Geometry, il peut s’avérer utile de créer un nouveau mot-clé de configuration pour le stockage ST_Geometry. Utilisez l’outil de géotraitement Export Geodatabase Configuration Keywords (Exporter les mots-clés de configuration de la géodatabase) pour exporter le contenu de la table sde_dbtune dans un fichier texte, ajoutez un mot-clé dont le paramètre GEOMETRY_STORAGE est défini sur ST_GEOMETRY, puis utilisez l’outil de géotraitement Import Geodatabase Configuration Keywords (Importer les mots-clés de configuration de la géodatabase) pour importer vos modifications. Vous pouvez par exemple exporter la table sde_dbtune et ajouter un mot-clé de configuration comme suit :

##ST_GEOMETRY
GEOMETRY_STORAGE    "ST_GEOMETRY"
UI_TEXT   "User-interface for ST_GEOMETRY keyword"
END

Une fois le mot-clé ajouté, vous pouvez le spécifier au moment de créer une classe d'entités dans ArcGIS afin que votre nouvelle classe d'entités utilise le stockage ST_Geometry.

Utiliser ArcGIS pour accéder aux tables PostgreSQL comportant des colonnes ST_Geometry

Si vous utilisez SQL pour créer une table avec une colonne ST_Geometry, vous pouvez accéder aux données par l'intermédiaire d'applications SQL, d'applications tierces personnalisées et d'ArcGIS. Lorsque vous vous connectez à la base de données depuis ArcGIS, vous pouvez effectuer des analyses, afficher ou charger des données dans les tables contenant une colonne ST_Geometry. Pour cela, les critères suivants doivent être satisfaits :

  • La table doit contenir une seule colonne ST_Geometry.
  • La table ne doit comporter aucune autre colonne d'un type défini par l'utilisateur.
  • Si la table stocke plusieurs types de géométrie (points, lignes et polygones), vous devez spécifier les types de géométrie à afficher ; vous ne pouvez afficher qu’un seul type à la fois dans ArcGIS.
  • Tous les enregistrements de la table doivent utiliser la même référence spatiale.

Si vous avez créé la table dans une géodatabase à l'aide du langage SQL, vous pouvez l'enregistrer avec la géodatabase si vous souhaitez en utiliser les fonctions (par exemple la réplication, les réseaux, les classes de relations et la topologie) ou si vous souhaitez modifier la table dans ArcGIS. Pour l'inscrire auprès de la géodatabase, les conditions suivantes doivent être remplies :

  • 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 avoir un type de géométrie unique (points, lignes ou polygones).
  • Tous les enregistrements de la table doivent utiliser la même référence spatiale.
  • Vous devez également avoir une colonne de nombres entiers, uniques et de valeur non NULL que vous utiliserez comme identifiant ObjectID.

Inscrire la colonne ST_Geometry

Si vous utilisez SQL pour créer une table contenant une colonne ST_Geometry, vous pouvez enregistrer la colonne pour utiliser une référence spatiale et dimensionnalité spécifiques. De la sorte, lorsque vous insérez des enregistrements avec SQL, vous ne pouvez pas insérer accidentellement des enregistrements utilisant une référence spatiale différente. Pour cela, utilisez la fonction sde.st_register_spatial_column. La syntaxe permettant d'utiliser cette fonction est la suivante :

SELECT st_register_spatial_column('<database_name>', '<schema_name>', 
'<table_name>', '<spatial_column_name>', <srid>, <coordinate_dimension>)

Le SRID spécifié doit figurer dans la table public.sde_spatial_references. La dimension de coordonnée indique si les données comportent uniquement des coordonnées x, y (2), des coordonnées x, y, z (3), des coordonnées x, y, z, m (4) ou des coordonnées x, y, m (5). Par défaut, si vous n'indiquez pas de dimension de coordonnée, les données sont enregistrées comme ayant uniquement les dimensions x, y.

Dans l'exemple suivant, la colonne de forme de la table des blocs dans la structure sasha de la base de données mycitydb est inscrite pour utiliser un SRID de 4236 et stocker uniquement des coordonnées tridimensionnelles :

SELECT st_register_spatial_column(
'mycitydb', 'sasha', 'blocks', 'shape', 4236, 3);

Cette opération ajoute un enregistrement pour la colonne spatiale à la table public.sde_geometry_columns dans la géodatabase ou la base de données.

Si la colonne spatiale est vide et que vous l'inscrivez avec un SRID et une dimensionnalité particuliers, vous pouvez la désinscrire pour modifier le SRID ou la dimensionnalité, puis la réinscrire avec différentes valeurs. Vous pouvez désinscrire une colonne spatiale en exécutant la fonction st_unregister_spatial_column(). Cette fonction supprime la colonne spatiale de la table système public.sde_geometry_columns. De la sorte, la colonne spatiale n'est plus associée à aucun système de référence spatiale. La syntaxe permettant d'utiliser cette fonction est la suivante :

SELECT st_unregister_spatial_column( '<database_name>', '<schema_name>',
 '<table_name>', '<column_name>')

Vous pouvez vérifier qu'une colonne spatiale est enregistrée en exécutant la fonction st_isregistered_spatial_column. La syntaxe permettant d'utiliser cette fonction est la suivante :

SELECT st_isregistered_spatial_column( '<database_name>', '<schema_name>',
 '<table_name>', '<column_name>', <srid>)

Si la colonne spatiale est inscrite avec le SRID spécifié, 1 est renvoyé. 0 est renvoyé dans le cas contraire.

Pour découvrir la dimensionnalité avec laquelle la table a été enregistrée, utilisez la fonction st_get_coord_dimension. La syntaxe de la fonction st_get_coord_dimension est la suivante :

SELECT st_get_coord_dimension(
'<schema_name>', '<table_name>', '<column_name>', <srid>)

Dans cet exemple, st_get_coord_dimension renvoie xyz, car la table des blocs est enregistrée comme étant tridimensionnelle.

SELECT st_get_coord_dimension( 'sasha', 'blocks', 'shape', 4236);
st_get_coord_dimension
---------------------------
xyz