名稱

ST_Transform — 返回一個新的幾何物件,其坐標已轉換為不同的空間參考系統。

概要

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

描述

返回一個新的幾何物件,其坐標已轉換為不同的空間參考系統。目標空間參考 to_srid 可以通過有效的 SRID 整數參數來識別(即,它必須存在於 spatial_ref_sys 表格中)。或者,可以使用定義為 PROJ.4 字串的空間參考來表示 to_proj 和/或 from_proj,但這些方法未經最佳化。如果目標空間參考系統使用 PROJ.4 字串而非 SRID 表示,則輸出幾何物件的 SRID 將設定為零。除了具有 from_proj 的函數外,輸入幾何物件必須具有已定義的 SRID。

ST_Transform 經常與 ST_SetSRID 混淆。ST_Transform 實際上是將幾何物件的坐標從一個空間參考系統更改為另一個空間參考系統,而 ST_SetSRID() 只是更改幾何物件的 SRID 識別符號。

ST_Transform 會自動根據來源和目標空間參考系統選擇合適的轉換管道。若要使用特定的轉換方法,請使用 ST_TransformPipeline

[Note]

需要 PostGIS 在編譯時支援 PROJ。使用 PostGIS_Full_Version 來確認您已編譯包含 PROJ 支援。

[Note]

如果使用多個轉換,最好在常用的轉換上建立函數索引,以利用索引的效能。

[Note]

在 1.3.4 之前的版本中,如果與包含 CURVES 的幾何物件一起使用,此函數會崩潰。此問題已在 1.3.4+ 中修復。

增強功能:2.0.0 引入了對多面曲面的支援。

增強功能:2.3.0 引入了對直接 PROJ.4 文字的支援。

此方法實作了 SQL/MM 規範。SQL-MM 3: 5.1.6

此方法支援圓形字串和曲線。

此函數支援多面曲面。

範例

將麻薩諸塞州州平面美國英尺幾何物件變更為 WGS 84 經緯度

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)

    

建立部分函數索引的範例。對於不確定所有幾何物件是否都會填入的表格,最好使用部分索引,排除空值幾何物件,這將節省空間,並使您的索引更小、更有效率。

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

使用 PROJ.4 文字轉換具有自訂空間參考的範例。

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

設定轉換行為

有時,涉及網格位移的坐標轉換可能會失敗,例如,如果 PROJ.4 沒有使用網格位移檔案進行建置,或者坐標不在網格位移定義的範圍內。預設情況下,如果網格位移檔案不存在,PostGIS 會擲回錯誤,但此行為可以根據每個 SRID 進行設定,方法是測試 PROJ.4 文字的不同 to_proj 值,或者變更 spatial_ref_sys 表格中的 proj4text 值。

例如,proj4text 參數 +datum=NAD87 是以下 +nadgrids 參數的簡寫形式

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

@ 字首表示如果檔案不存在,則不會報告錯誤,但如果已達到列表末尾,且沒有檔案適當(即找到且重疊),則會發出錯誤。

相反地,如果您想要確保至少存在標準檔案,但如果掃描所有檔案都沒有符合,則會套用空值轉換,則可以使用

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

空值網格位移檔案是一個有效覆蓋全世界且不套用任何位移的網格位移檔案。因此,若要完成範例,如果您想要變更 PostGIS,使轉換為 SRID 4267 且不在正確範圍內的轉換不會擲回錯誤,則可以使用以下程式碼

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;