ST_Affine — Applies a 3d affine transformation to the geometry to do things like translate, rotate, scale in one step.
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);
Applies a 3d affine transformation to the geometry to do things like translate, rotate, scale in one step.
Version 1: The call
ST_Affine(geom, a, b, c, d, e, f, g, h, i, xoff, yoff, zoff)
represents the transformation matrix
/ a b c xoff \ | d e f yoff | | g h i zoff | \ 0 0 0 1 /
and the vertices are transformed as follows:
x' = a*x + b*y + c*z + xoff y' = d*x + e*y + f*z + yoff z' = g*x + h*y + i*z + zoff
All of the translate / scale functions below are expressed via such an affine transformation.
Version 2: Applies a 2d affine transformation to the geometry. The call
ST_Affine(geom, a, b, d, e, xoff, yoff)
represents the transformation matrix
/ 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 /
and the vertices are transformed as follows:
x' = a*x + b*y + xoff y' = d*x + e*y + yoff z' = z
This method is a subcase of the 3D method above.
Availability: 1.1.2. Name changed from Affine to ST_Affine in 1.2.2
| ![[Note]](images/note.png) | |
| Prior to 1.3.4, this function crashes if used with geometries that contain CURVES. This is fixed in 1.3.4+ | 
 This function supports 3d and will not drop the z-index.
 This function supports 3d and will not drop the z-index.
 This method supports Circular Strings and Curves
 This method supports Circular Strings and Curves
--Rotate a 3d line 180 degrees about the z axis.  Note this is long-hand for doing ST_RotateZ();
 SELECT ST_AsEWKT(ST_Affine(the_geom,  cos(pi()), -sin(pi()), 0,  sin(pi()), cos(pi()), 0,  0, 0, 1,  0, 0, 0)) As using_affine,
	 ST_AsEWKT(ST_RotateZ(the_geom, pi())) As using_rotatez
	FROM (SELECT ST_GeomFromEWKT('LINESTRING(1 2 3, 1 4 3)') As the_geom) As foo;
		using_affine         |        using_rotatez
-----------------------------+-----------------------------
 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(the_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 the_geom) As foo;
		   st_asewkt
-------------------------------
 LINESTRING(-1 -2 -3,-1 -4 -3)
(1 row)