Name

ST_Transform — Renvoie une nouvelle géométrie dont les coordonnées ont été transformées dans un système de référence spatial différent.

Synopsis

geometry ST_Transform(geometry g1, integer srid);

geometry ST_Transform(geometry geom, text to_proj);

geometry ST_Transform(geometry geom, text from_proj, text to_proj);

geometry ST_Transform(geometry geom, text from_proj, integer to_srid);

Description

Renvoie une nouvelle géométrie dont les coordonnées ont été transformées dans un système de référence spatiale différent. La référence spatiale de destination to_srid peut être identifiée par un paramètre entier SRID valide (c'est-à-dire qu'elle doit exister dans la table spatial_ref_sys). Il est également possible d'utiliser une référence spatiale définie comme une chaîne PROJ.4 pour to_proj et/ou from_proj, mais ces méthodes ne sont pas optimisées. Si le système de référence spatiale de destination est exprimé avec une chaîne PROJ.4 au lieu d'un SRID, le SRID de la géométrie de sortie sera mis à zéro. A l'exception des fonctions avec from_proj, les géométries d'entrée doivent avoir un SRID défini.

ST_Transform est souvent confondu avec ST_SetSRID. ST_Transform modifie en fait les coordonnées d'une géométrie d'un système de référence spatiale à un autre, tandis que ST_SetSRID() modifie simplement l'identifiant SRID de la géométrie.

ST_Transform sélectionne automatiquement un pipeline de conversion approprié en fonction des systèmes de référence spatiale source et cible. Pour utiliser une méthode de conversion spécifique, utilisez ST_TransformPipeline.

[Note]

PostGIS doit être compilé avec le support PROJ. Utilisez PostGIS_Full_Version pour confirmer que vous avez compilé le support PROJ.

[Note]

Si l'on utilise plus d'une transformation, il est utile de disposer d'un index fonctionnel sur les transformations les plus couramment utilisées afin de tirer parti de l'utilisation de l'index.

[Note]

Avant la version 1.3.4, cette fonction se bloquait si elle était utilisée avec des géométries contenant des CURVES. Ce problème est corrigé dans la version 1.3.4+

Amélioration : 2.0.0 introduction du support des surfaces polyédriques.

Amélioration : la version 2.3.0 a introduit la prise en charge du texte PROJ.4 direct.

Cette méthode implémente la spécification SQL/MM.

SQL-MM 3: 5.1.6

Cette méthode prend en charge les types Circular String et Curve.

Cette fonction prend en charge les surfaces Polyhedral.

Exemples

Changer la géométrie des pieds US du plan de l'État du Massachusetts en WGS 84 long lat

SELECT ST_AsText(ST_Transform(ST_GeomFromText('POLYGON((743238 2967416,743238 2967450,
  743265 2967450,743265.625 2967416,743238 2967416))',2249),4326)) As wgs_geom;

 wgs_geom
---------------------------
 POLYGON((-71.1776848522251 42.3902896512902,-71.1776843766326 42.3903829478009,
-71.1775844305465 42.3903826677917,-71.1775825927231 42.3902893647987,-71.177684
8522251 42.3902896512902));
(1 row)

--3D Circular String example
SELECT ST_AsEWKT(ST_Transform(ST_GeomFromEWKT('SRID=2249;CIRCULARSTRING(743238 2967416 1,743238 2967450 2,743265 2967450 3,743265.625 2967416 3,743238 2967416 4)'),4326));

         st_asewkt
--------------------------------------------------------------------------------------
 SRID=4326;CIRCULARSTRING(-71.1776848522251 42.3902896512902 1,-71.1776843766326 42.3903829478009 2,
 -71.1775844305465 42.3903826677917 3,
 -71.1775825927231 42.3902893647987 3,-71.1776848522251 42.3902896512902 4)

    

Exemple de création d'un index fonctionnel partiel. Pour les tables dont vous n'êtes pas sûr que toutes les géométries seront renseignées, il est préférable d'utiliser un index partiel qui laisse de côté les géométries nulles, ce qui permet à la fois de conserver de l'espace et de rendre votre index plus petit et plus efficace.

CREATE INDEX idx_geom_26986_parcels
  ON parcels
  USING gist
  (ST_Transform(geom, 26986))
  WHERE geom IS NOT NULL;
    

Exemples d'utilisation du texte PROJ.4 pour transformer avec des références spatiales personnalisées.

-- Find intersection of two polygons near the North pole, using a custom Gnomic projection
-- See http://boundlessgeo.com/2012/02/flattening-the-peel/
 WITH data AS (
   SELECT
     ST_GeomFromText('POLYGON((170 50,170 72,-130 72,-130 50,170 50))', 4326) AS p1,
     ST_GeomFromText('POLYGON((-170 68,-170 90,-141 90,-141 68,-170 68))', 4326) AS p2,
     '+proj=gnom +ellps=WGS84 +lat_0=70 +lon_0=-160 +no_defs'::text AS gnom
 )
 SELECT ST_AsText(
   ST_Transform(
     ST_Intersection(ST_Transform(p1, gnom), ST_Transform(p2, gnom)),
   gnom, 4326))
 FROM data;
                                          st_astext
 --------------------------------------------------------------------------------
  POLYGON((-170 74.053793645338,-141 73.4268621378904,-141 68,-170 68,-170 74.053793645338))
    

Configurer le comportement de transformation

Parfois, la transformation de coordonnées impliquant un décalage de grille peut échouer, par exemple si PROJ.4 n'a pas été construit avec des fichiers de décalage de grille ou si la coordonnée ne se trouve pas dans la plage pour laquelle le décalage de grille est défini. Par défaut, PostGIS génère une erreur si un fichier de décalage de grille n'est pas présent, mais ce comportement peut être configuré pour chaque SRID, soit en testant différentes valeurs to_proj de texte PROJ.4, soit en modifiant la valeur proj4text dans la table spatial_ref_sys.

Par exemple, le paramètre proj4text +datum=NAD87 est une forme abrégée du paramètre +nadgrids suivant :

+nadgrids=@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat

Le préfixe @ signifie qu'aucune erreur n'est signalée si les fichiers ne sont pas présents, mais si la fin de la liste est atteinte sans qu'aucun fichier n'ait été approprié (c'est-à-dire trouvé et se chevauchant), une erreur est émise.

Si, à l'inverse, vous voulez vous assurer qu'au moins les fichiers standard sont présents, mais que si tous les fichiers ont été analysés sans résultat, une transformation nulle est appliquée, vous pouvez utiliser :

+nadgrids=@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat,null

Le fichier de décalage de grille nul est un fichier de décalage de grille valide couvrant le monde entier et n'appliquant aucun décalage. Ainsi, pour un exemple complet, si vous vouliez modifier PostGIS de manière à ce que les transformations du SRID 4267 qui ne se situent pas dans la plage correcte n'entraînent pas d'ERREUR, vous utiliseriez ce qui suit :

UPDATE spatial_ref_sys SET proj4text = '+proj=longlat +ellps=clrk66 +nadgrids=@conus,@alaska,@ntv2_0.gsb,@ntv1_can.dat,null +no_defs' WHERE srid = 4267;

Voir aussi

Section 4.5, “Systèmes de référence spatiale”, ST_SetSRID, ST_SRID, UpdateGeometrySRID, ST_TransformPipeline