名称

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]

需要使用 PROJ 支持编译 PostGIS。使用 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 将抛出错误,但可以通过测试 PROJ.4 文本的不同 to_proj 值,或者修改 spatial_ref_sys 表中的 proj4text 值,来基于每个 SRID 配置此行为。

例如,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 的变换不在正确的范围内时不会抛出 ERROR,则可以使用以下内容

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;