我尝试围绕局部轴旋转几何体,但还没有找到方法。我知道有ST_Rotate
(请参阅https://postgis.net/docs/ST_Rotate.html)进行二维计算,(其中包括)ST_RotateX
(请参阅https://postgis.net/docs/ST_RotateX.html),但这些方法会围绕原点旋转几何体。当我试图改变(似乎是)原点(即0/0/0)时,我也试图滥用ST_Affine
:
SELECT ST_Affine(
ST_GeomFromText(ST_AsText(runway_area)),
1, 0, 0, 0,
cos(rotRadians), -sin(rotRadians), 0, sin(rotRadians), cos(rotRadians),
--- use the geometry's centroid instead of 0, 0, 0
ST_X(ST_GeomFromText(ST_AsText(runway_area))), ST_Y(ST_GeomFromText(ST_AsText(runway_area))), ST_Z(ST_GeomFromText(ST_AsText(runway_area)))
)
它没有成功 - 我得到的东西远离预定的位置。我是否错过了PostGIS的一个非常基本的方法来围绕其局部轴之一旋转几何体?
答案 0 :(得分:1)
您可以将ST_Rotate
与ST_Centroid
合并,例如:
ST_Rotate(ST_GeomFromText(ST_AsText(runway_area)), -pi()/3, ST_Centroid(ST_GeomFromText(ST_AsText(runway_area)))
答案 1 :(得分:1)
仔细研究ST_Rotate,并注意有三个参数签名:
geometry ST_Rotate(geometry geomA, float rotRadians);
geometry ST_Rotate(geometry geomA, float rotRadians, float x0, float y0);
geometry ST_Rotate(geometry geomA, float rotRadians, geometry pointOrigin);
最后两个签名的x0
和y0
或pointOrigin
参数完成您的问题:它们允许旋转围绕自定义坐标旋转。
文档中的示例显示了如何围绕质心将几何图形顺时针旋转60度:
SELECT ST_AsEWKT(ST_Rotate(geom, radians(-60.0), ST_Centroid(geom)))
FROM (SELECT 'LINESTRING (50 160, 50 50, 100 50)'::geometry AS geom) AS foo;
st_asewkt
--------------------------------------------------------------
LINESTRING(116.4225 130.6721,21.1597 75.6721,46.1597 32.3708)
(1 row)
答案 2 :(得分:0)
ST_Affine
的最后三个参数并不代表原点,而是全球"转变"在仿射变换中。 ST_RotateX
的文档显示了如何使用此函数生成围绕x轴的旋转。所有这些参数都为零,因为它是一个没有平移的旋转。
如果要使用通用轴,则需要构造相应的rotation matrix并将其元素替换为a,b,c,d,e,f,g,h,i
的参数ST_Affine
,并将xoff, yoff, zoff
设置为零。