【问题标题】:Rotate geometry around its local axis围绕其局部轴旋转几何图形
【发布时间】:2017-05-03 14:36:57
【问题描述】:

我尝试围绕其局部轴旋转几何图形,但没有找到这样做的方法。我知道有ST_Rotate(见https://postgis.net/docs/ST_Rotate.html)用于2D 计算和(除其他外)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 的一种非常基本的方法来围绕其局部轴旋转几何?

【问题讨论】:

  • 您如何定义“局部轴”,即您感兴趣的几何图形集或网格 (SRS) 轴的“局部”?如果是前者,您将如何确定您感兴趣的几何图形集的中心?

标签: postgresql gis postgis


【解决方案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】:

    您可以将ST_RotateST_Centroid 结合使用,例如:

    ST_Rotate(ST_GeomFromText(ST_AsText(runway_area)), -pi()/3, ST_Centroid(ST_GeomFromText(ST_AsText(runway_area)))
    

    【讨论】:

      【解决方案3】:

      ST_Affine 的最后三个参数不代表原点,而是仿射变换中的全局“移位”。 ST_RotateX 的文档展示了如何使用此函数来生成绕 x 轴的旋转。所有这些参数都是零,因为它是没有平移的旋转。

      如果要使用通用轴,则需要构造相应的 rotation matrix 并将其元素替换为 ST_Affine 的参数 a,b,c,d,e,f,g,h,i 并将 xoff, yoff, zoff 设置为零。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-06
        • 2018-05-20
        • 2016-08-22
        • 1970-01-01
        • 2018-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多