Name

ST_Affine — ジオメトリに3次元アフィン変換を適用します。

Synopsis

geometry ST_Affine(geometry geomA, float a, float b, float c, float d, float e, float f, float g, float h, float i, float xoff, float yoff, float zoff);

geometry ST_Affine(geometry geomA, float a, float b, float d, float e, float xoff, float yoff);

説明

3次元アフィン変換をジオメトリに適用して移動、回転、拡大縮小を一度に行います。

一つ目の形式では、次のように関数を呼んでいます。

ST_Affine(geom, a, b, c, d, e, f, g, h, i, xoff, yoff, zoff) 

これは次のような変換行列を表現しています。

/ a  b  c  xoff \
| d  e  f  yoff |
| g  h  i  zoff |
\ 0  0  0     1 /

次のようにも表現できます。

x' = a*x + b*y + c*z + xoff
y' = d*x + e*y + f*z + yoff
z' = g*x + h*y + i*z + zoff

全ての移動/拡大縮小関数はこのようなアフィン変換を経由しています。

二つ目の形式では、2次元アフィン変換をジオメトリに適用します。次のように関数を呼んでいます。

ST_Affine(geom, a, b, d, e, xoff, yoff)

これは次のような変換行列を表現しています。

/  a  b  0  xoff  \       /  a  b  xoff  \
|  d  e  0  yoff  | rsp.  |  d  e  yoff  |
|  0  0  1     0  |       \  0  0     1  /
\  0  0  0     1  /

頂点は次のように変換されます。

x' = a*x + b*y + xoff
y' = d*x + e*y + yoff
z' = z 

このメソッドは上述の3次元メソッドの特異ケースです。

Enhanced: 2.0.0 多面体サーフェス対応、三角対応、TIN対応が導入されました。

Availability: 1.1.2 AffineからST_Affineに名称変更しました。

[Note]

1.3.4より前では、曲線を含むジオメトリで使用すると、この関数はクラッシュします。これは1.3.4以上で訂正されています。

この関数は多面体サーフェスに対応しています。

この関数は三角形と不規則三角網 (TIN)に対応しています。

この関数は3次元に対応し、Z値を削除しません。

このメソッドは曲線ストリングと曲線に対応しています。

--Rotate a 3d line 180 degrees about the z axis.  Note this is long-hand for doing ST_Rotate();
 SELECT ST_AsEWKT(ST_Affine(geom,  cos(pi()), -sin(pi()), 0,  sin(pi()), cos(pi()), 0,  0, 0, 1,  0, 0, 0)) As using_affine,
         ST_AsEWKT(ST_Rotate(geom, pi())) As using_rotate
        FROM (SELECT ST_GeomFromEWKT('LINESTRING(1 2 3, 1 4 3)') As geom) As foo;
        using_affine         |        using_rotate
-----------------------------+-----------------------------
 LINESTRING(-1 -2 3,-1 -4 3) | LINESTRING(-1 -2 3,-1 -4 3)
(1 row)

--Rotate a 3d line 180 degrees in both the x and z axis
SELECT ST_AsEWKT(ST_Affine(geom, cos(pi()), -sin(pi()), 0, sin(pi()), cos(pi()), -sin(pi()), 0, sin(pi()), cos(pi()), 0, 0, 0))
        FROM (SELECT ST_GeomFromEWKT('LINESTRING(1 2 3, 1 4 3)') As geom) As foo;
           st_asewkt
-------------------------------
 LINESTRING(-1 -2 -3,-1 -4 -3)
(1 row)
                

関連情報

ST_Rotate, ST_Scale, ST_Translate, ST_TransScale