Name

ST_Transform — Rückgabe einer neuen Geometrie mit in ein anderes räumliches Bezugssystem transformierten Koordinaten.

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);

Beschreibung

Gibt eine neue Geometrie zurück, deren Koordinaten in ein anderes räumliches Bezugssystem transformiert wurden. Der Ziel-Raumbezug to_srid kann durch einen gültigen SRID-Integer-Parameter identifiziert werden (d. h. er muss in der Tabelle spatial_ref_sys vorhanden sein). Alternativ kann ein als PROJ.4-String definierter Raumbezug für to_proj und/oder from_proj verwendet werden, allerdings sind diese Methoden nicht optimiert. Wenn das Ziel-Raumbezugssystem durch einen PROJ.4-String anstelle eines SRID ausgedrückt wird, wird der SRID der Ausgangsgeometrie auf Null gesetzt. Mit Ausnahme der Funktionen mit from_proj müssen Eingabegeometrien einen definierten SRID haben.

ST_Transform wird oft mit ST_SetSRID verwechselt. ST_Transform ändert tatsächlich die Koordinaten einer Geometrie von einem räumlichen Bezugssystem in ein anderes, während ST_SetSRID() lediglich den SRID-Bezeichner der Geometrie ändert.

ST_Transform wählt automatisch eine geeignete Konvertierungspipeline für das Quell- und Ziel-Raumbezugssystem aus. Um eine bestimmte Konvertierungsmethode zu verwenden, verwenden Sie ST_TransformPipeline.

[Note]

Erfordert, dass PostGIS mit PROJ-Unterstützung kompiliert ist. Verwenden Sie PostGIS_Full_Version, um zu bestätigen, dass Sie PROJ-Unterstützung einkompiliert haben.

[Note]

Wenn mehr als eine Transformation verwendet wird, ist es sinnvoll, einen funktionalen Index für die am häufigsten verwendeten Transformationen zu haben, um die Vorteile der Indexnutzung zu nutzen.

[Note]

Vor 1.3.4 ist diese Funktion abgestürzt, wenn die Geometrien CURVES enthalten. Dies wurde mit 1.3.4+ behoben

Erweiterung: Mit 2.0.0 wurde die Unterstützung für polyedrische Oberflächen eingeführt.

Verbessert: In Version 2.3.0 wurde die Unterstützung für direkten PROJ.4 Text eingeführt.

Diese Methode setzt die SQL/MM-Spezifikation um. SQL-MM 3: 5.1.6

Diese Methode unterstützt kreisförmige Strings und Kurven.

Diese Funktion unterstützt polyedrische Flächen.

Beispiele

Änderung der Geometrie der Ebene des Bundesstaates Massachusetts von US-Fuß auf 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)

    

Beispiel für die Erstellung eines partiellen funktionalen Indexes. Für Tabellen, bei denen Sie nicht sicher sind, dass alle Geometrien ausgefüllt werden, ist es am besten, einen partiellen Index zu verwenden, der Null-Geometrien auslässt, was sowohl Platz spart als auch Ihren Index kleiner und effizienter macht.

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

Beispiele für die Verwendung von PROJ.4 Text zur Transformation mit benutzerdefinierten räumlichen Bezügen.

-- 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))
    

Konfigurieren des Transformationsverhaltens

Manchmal kann eine Koordinatentransformation, die eine Rasterverschiebung beinhaltet, fehlschlagen, z.B. wenn PROJ.4 nicht mit Rasterverschiebungsdateien erstellt wurde oder die Koordinate nicht innerhalb des Bereichs liegt, für den die Rasterverschiebung definiert ist. Standardmäßig gibt PostGIS einen Fehler aus, wenn keine Rasterverschiebungsdatei vorhanden ist, aber dieses Verhalten kann auf einer pro-SRID-Basis konfiguriert werden, indem entweder verschiedene to_proj Werte des PROJ.4-Textes getestet oder der proj4text Wert in der spatial_ref_sys Tabelle geändert wird.

Der proj4text-Parameter +datum=NAD87 ist zum Beispiel eine Kurzform für den folgenden +nadgrids-Parameter:

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

Das Präfix @ bedeutet, dass kein Fehler gemeldet wird, wenn die Dateien nicht vorhanden sind, aber wenn das Ende der Liste erreicht wird, ohne dass eine Datei gefunden wurde (d. h. gefunden und überschneidend), wird ein Fehler ausgegeben.

Wenn Sie dagegen sicherstellen wollten, dass zumindest die Standarddateien vorhanden sind, aber wenn alle Dateien ohne Treffer durchsucht wurden, eine Nulltransformation angewendet wird, könnten Sie dies verwenden:

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

Die Null-Rasterverschiebungsdatei ist eine gültige Rasterverschiebungsdatei, die die ganze Welt abdeckt und keine Verschiebung anwendet. Wenn Sie also PostGIS so ändern wollten, dass bei Transformationen zu SRID 4267, die nicht im korrekten Bereich liegen, kein ERROR ausgelöst wird, würden Sie das folgende Beispiel verwenden:

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;