围绕局部轴旋转几何体

时间:2017-05-03 14:36:57

标签: postgresql gis postgis

我尝试围绕局部轴旋转几何体,但还没有找到方法。我知道有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的一个非常基本的方法来围绕其局部轴之一旋转几何体?

3 个答案:

答案 0 :(得分:1)

您可以将ST_RotateST_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);

最后两个签名的x0y0pointOrigin参数完成您的问题:它们允许旋转围绕自定义坐标旋转。

文档中的示例显示了如何围绕质心将几何图形顺时针旋转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设置为零。