Stockage 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.
Par défaut, les géodatabases dans PostgreSQL sont définies de manière à utiliser le type spatial ST_Geometry. Vous devez toutefois configurer leur utilisation. Pour en savoir plus, reportez-vous à la rubrique Configuration d'une géodatabase dans PostgreSQL. Si vous utilisez une base de données PostgreSQL qui ne contient pas de géodatabase, vous pouvez installer le type ST_Geometry. Pour plus d'informations sur l'installation du type ST_Geometry dans une base de données PostgreSQL, reportez-vous à la rubrique Ajout du type ST_Geometry à une base de données PostgreSQL.
Cette rubrique vous aide à comprendre la façon dont le type ST_Geometry est utilisé dans PostgreSQL :
- Architecture du type spatial ST_Geometry dans PostgreSQL
- Procédure de création de classes d'entités dans ArcGIS avec le stockage ST_Geometry
- Utilisation des tables PostgreSQL contenant des colonnes ST_Geometry avec ArcGIS
- Procédure d'inscription d'une colonne ST_Geometry pour restreindre la référence spatiale qui peut être utilisée
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
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é 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. |
shape |
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.
Structure de métadonnées
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 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 et vue, reportez-vous à la rubrique Tables système d'une géodatabase stockée dans PostgreSQL. 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.
En outre les vues, fonctions et tables système, les objets de base de données suivants sont utilisés pour gérer les métadonnées 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
Création de classes d'entités avec le stockage ST_Geometry à l'aide d'ArcGIS
Au moyen d'ArcGIS for Desktop, vous choisissez le type de stockage à utiliser lors de la création des classes d'entités.
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. Pour plus d'informations, reportez-vous à la rubrique Création d'une table de base de données spatiales 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 géométrie PostGIS, mais que vous voulez créer certaines classes d'entités avec le type de données ST_Geometry, il est utile de créer un nouveau mot-clé de configuration pour le stockage ST_Geometry dans la table sde_dbtune. Utilisez la commande d'administration sdedbtune 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 sdedbtune 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
Pour plus d'informations, reportez-vous à la rubrique Modification du contenu de la table sde_dbtune.
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.
Accès aux tables PostgreSQL avec 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 : un seul type à la fois peut être affiché 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'inscrire auprès de 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.
- Il est également nécessaire de disposer d'une colonne de nombres entiers, uniques et de valeur non NULL utilisable comme identifiant d'enregistrement.
Enregistrement de la colonne spatiale
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 l'inscription effective d'une colonne spatiale 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é inscrite, 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 inscrite comme étant en trois dimensions.
SELECT st_get_coord_dimension(
'sasha', 'blocks', 'shape', 4236);
st_get_coord_dimension
---------------------------
xyz