• AffineTransformations仿射变化


    1. Affine Transformations 仿射变化

    1.1. ST_Affine

    ST_Affine -对几何图形应用三维仿射变换

    1.1.1. 概要

    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);
    
    • 1
    • 2
    • 3

    1.1.2. 描述

    应用三维仿射变换到几何图形,可以在一步内完成平移、旋转、缩放等操作。

    ST_Affine(geom, a, b, c, d, e, f, g, h, i, xoff, yoff, zoff)
    
    • 1
    • 表示变换矩阵
    / a b c xoff \
    | d e f yoff |
    | g h i zoff |
    \ 0 0 0 1 /
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 顶点变换如下:
    x' = a*x + b*y + c*z + xoff
    y' = d*x + e*y + f*z + yoff
    z' = g*x + h*y + i*z + zoff
    
    • 1
    • 2
    • 3

    下面所有的平移/缩放函数都是通过这样的仿射变换表示的。

    版本2:对几何图形应用二维仿射变换。调用

    ST_Affine(geom, a, b, d, e, xoff, yoff)
    
    • 1
    • 表示变换矩阵
    / 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    /
    
    • 1
    • 2
    • 3
    • 4

    顶点变换如下:

    x' = a*x + b*y + xoff
    y' = d*x + e*y + yoff
    z' = z
    
    • 1
    • 2
    • 3

    在1.3.4之前,如果与包含CURVES的几何图形一起使用,这个函数会崩溃。这在1.3.4+中得到了修正

    1.1.3. 样例

    • 将一条三维直线绕z轴旋转180度。注意,这是执行ST_Rotate()的长手操作;
    --Rotate a 3d line 180 degrees about the z axis. Note this is long-hand for doing ST_Rotate();
    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_Rotate(the_geom, pi())) As using_rotate FROM (SELECT ST_GeomFromEWKT('LINESTRING(1 2 3, 1 4 3)') As the_geom) As foo;
    
    • 1
    • 2
    using_affineusing_rotate
    LINESTRING(-1 -2 3,-1 -4 3)LINESTRING(-1 -2 3,-1 -4 3)
    • 将一条三维直线在x轴和z轴上旋转180度
    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;
    
    • 1
    • 2
    st_asewkt
    LINESTRING(-1 -2 -3,-1 -4 -3)

    1.2. ST_Rotate

    ST_Rotate -围绕原点旋转几何图形。

    1.2.1. 概要

    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);
    
    • 1
    • 2
    • 3

    1.2.2. 描述

    围绕原点逆时针旋转几何体。旋转原点可以指定为POINT几何图形,也可以指定为x和y坐标。如果未指定原点,则几何图形将围绕点(0 0)旋转。

    增强:2.0.0支持多面体曲面,三角形和TIN。

    增加了用于指定旋转原点的附加参数。

    • 这个函数支持3d并且不会删除z-index。
    • 此方法支持圆形字符串和曲线
    • 此函数支持多面体曲面。
    • 该功能支持三角形和三角形不规则网络表面(TIN)。

    1.2.3. 样例

    • 180度旋转
    SELECT ST_AsEWKT(ST_Rotate('LINESTRING (50 160, 50 50, 100 50)', pi()));
    
    • 1
    st_asewkt
    LINESTRING(-50 -160,-50 -50,-100 -50)
    • 在x=50 y=160处逆时针旋转30度
    SELECT ST_AsEWKT(ST_Rotate('LINESTRING (50 160, 50 50, 100 50)', pi()/6, 50, 160));
    
    • 1
    st_asewkt
    LINESTRING(50 160,105 64.7372055837117,148.301270189222 89.7372055837117)
    • 从质心开始顺时针旋转60度
    SELECT ST_AsEWKT(ST_Rotate(geom, -pi()/3, ST_Centroid(geom))) FROM (SELECT 'LINESTRING (50 160, 50 50, 100 50)'::geometry AS geom) AS foo;
    
    • 1
    st_asewkt
    LINESTRING(116.4225 130.6721,21.1597 75.6721,46.1597 32.3708)

    1.3. ST_RotateX

    ST_RotateX -绕X轴旋转几何图形。

    1.3.1. 概要

    geometry ST_RotateX(geometry geomA, float rotRadians);
    
    • 1

    1.3.2. 描述

    绕X轴旋转几何体geomA - rotRadians。

    • 此函数支持多面体曲面。
    • 这个函数支持3d并且不会删除z-index。
    • 该功能支持三角形和三角形不规则网络表面(TIN)。

    1.3.3. 样例

    • 沿x轴旋转一条线90度
    SELECT ST_AsEWKT(ST_RotateX(ST_GeomFromEWKT('LINESTRING(1 2 3, 1 1 1)'), pi()/2));
    
    • 1
    st_asewkt
    LINESTRING(1 -3 2,1 -1 1)

    1.4. ST_RotateY

    ST_RotateY -绕Y轴旋转几何图形

    1.4.1. 概要

    geometry ST_RotateY(geometry geomA, float rotRadians);
    
    • 1

    1.4.2. 描述

    绕y轴旋转几何体geomA - rotRadians

    • 此函数支持多面体曲面。
    • 这个函数支持3d并且不会删除z-index。
    • 该功能支持三角形和三角形不规则网络表面(TIN)。

    1.5. ST_RotateZ

    ST_RotateZ -绕Z轴旋转几何图形

    1.5.1. 概要

    geometry ST_RotateZ(geometry geomA, float rotRadians);
    
    • 1

    1.5.2. 描述

    绕Z轴旋转几何体geomA - rotRadians

    • 此函数支持多面体曲面。
    • 这个函数支持3d并且不会删除z-index。
    • 该功能支持三角形和三角形不规则网络表面(TIN)。

    1.5.3. 样例

    • 沿z轴旋转一条线90度
    SELECT ST_AsEWKT(ST_RotateZ(ST_GeomFromEWKT('LINESTRING(1 2 3, 1 1 1)'), pi()/2));
    
    • 1
    st_asewkt
    LINESTRING(-2 1 3,-1 1 1)
    • 绕z轴旋转一个弯曲的圆
    SELECT ST_AsEWKT(ST_RotateZ(the_geom, pi()/2)) FROM (SELECT ST_LineToCurve(ST_Buffer(ST_GeomFromText('POINT(234 567)'), 3)) As the_geom) As foo;
    
    • 1
    st_asewkt
    CURVEPOLYGON(CIRCULARSTRING(-567 237,-564.87867965644 236.12132034356,-564 234,-569.12132034356 231.87867965644,-567 237))

    1.6. ST_Scale

    ST_Scale -根据给定的因子缩放几何图形

    1.6.1. 概要

    geometry ST_Scale(geometry geomA, float XFactor, float YFactor, float ZFactor);
    geometry ST_Scale(geometry geomA, float XFactor, float YFactor);
    geometry ST_Scale(geometry geom, geometry factor);
    geometry ST_Scale(geometry geom, geometry factor, geometry origin);
    
    • 1
    • 2
    • 3
    • 4

    1.6.2. 描述

    通过将坐标与相应的因子参数相乘,将几何图形缩放到新的大小。

    采用几何图形作为因子参数的版本允许通过2d、3dm、3dz或4d点来设置所有支持维度的缩放因子。因子点中缺失的维数等同于不缩放相应的维数。

    三几何变体允许传入缩放的“假原点”。这允许“就地缩放”,例如使用几何图形的质心作为假原点。没有假原点,缩放发生相对于实际原点,所以所有坐标都乘以缩放因子

    • 此函数支持多面体曲面。
    • 这个函数支持3d并且不会删除z-index。
    • 此方法支持圆形字符串和曲线
    • 该功能支持三角形和三角形不规则网络表面(TIN)。
    • 此函数支持M坐标。

    1.6.3. 样例

    SELECT ST_AsEWKT(ST_Scale(ST_GeomFromEWKT('LINESTRING(1 2 3, 1 1 1)'), 0.5, 0.75, 0.8));
    
    • 1
    st_asewkt
    LINESTRING(0.5 1.5 2.4,0.5 0.75 0.8)
    SELECT ST_AsEWKT(ST_Scale(ST_GeomFromEWKT('LINESTRING(1 2 3, 1 1 1)'), 0.5, 0.75));
    
    • 1
    st_asewkt
    LINESTRING(0.5 1.5 3,0.5 0.75 1)
    SELECT ST_AsEWKT(ST_Scale(ST_GeomFromEWKT('LINESTRING(1 2 3 4, 1 1 1 1)'),ST_MakePoint(0.5, 0.75, 2, -1)));
    
    • 1
    st_asewkt
    LINESTRING(0.5 1.5 6 -4,0.5 0.75 2 -1)
    SELECT ST_AsText(ST_Scale('LINESTRING(1 1, 2 2)', 'POINT(2 2)', 'POINT(1 1)'::geometry));
    
    • 1
    st_astext
    LINESTRING(1 1,3 3)

    1.7. ST_Translate

    ST_Translate -通过给定的偏移量转换几何图形。

    1.7.1. 概要

    geometry ST_Translate(geometry g1, float deltax, float deltay);
    geometry ST_Translate(geometry g1, float deltax, float deltay, float deltaz);
    
    • 1
    • 2

    1.7.2. 描述

    返回一个新的几何图形,其坐标为平移的delta x,delta y,delta z单位。单位是基于空间参考(SRID)中为这个几何定义的单位。

    在1.3.4之前,如果与包含CURVES的几何图形一起使用,这个函数会崩溃。这在1.3.4+中得到了修正

    1.7.3. 样例

    • 移动一个点经度1度
    SELECT ST_AsText(ST_Translate(ST_GeomFromText('POINT(-71.01 42.37)',4326),1,0)) As wgs_transgeomtxt;
    
    • 1
    wgs_transgeomtxt
    POINT(-70.01 42.37)
    • 将linestring移动1度经度和1/2度纬度
    SELECT ST_AsText(ST_Translate(ST_GeomFromText('LINESTRING(-71.01 42.37,-71.11 42.38)',4326) ,1,0.5)) As wgs_transgeomtxt;
    
    • 1
    wgs_transgeomtxt
    LINESTRING(-70.01 42.87,-70.11 42.88)
    • 移动一个3d点
    SELECT ST_AsEWKT(ST_Translate(CAST('POINT(0 0 0)' As geometry), 5, 12,3));
    
    • 1
    st_asewkt
    POINT(5 12 3)
    • 移动一条曲线和一个点
    SELECT ST_AsText(ST_Translate(ST_Collect('CURVEPOLYGON(CIRCULARSTRING(4 3,3.12 0.878,1 0,-1.121 5.1213,6 7, 8 9,4 3))','POINT(1 3)'),1,2));
    
    • 1
    st_astext
    GEOMETRYCOLLECTION(CURVEPOLYGON(CIRCULARSTRING(5 5,4.12 2.878,2 2,-0.121 7.1213,7 9,9 11,5 5)),POINT(2 5))

    1.8. ST_TransScale

    ST_TransScale -通过给定的偏移量和因子来平移和缩放几何图形。

    1.8.1. 概要

    geometry ST_TransScale(geometry geomA, float deltaX, float deltaY, float XFactor, float YFactor);
    
    • 1

    1.8.2. 描述

    使用deltaX和deltaY参数转换几何图形,然后使用XFactor和YFactor参数缩放它,只在2D中工作。

    1.8.3. 样例

    SELECT ST_AsEWKT(ST_TransScale(ST_GeomFromEWKT('LINESTRING(1 2 3, 1 1 1)'), 0.5, 1, 1, 2));
    
    • 1
    st_asewkt
    LINESTRING(1.5 6 3,1.5 4 1)
    • 缓冲一个点来得到一个圆的近似值,转换成曲线,然后平移1,2缩放3,4
    SELECT ST_AsText(ST_Transscale(ST_LineToCurve(ST_Buffer('POINT(234 567)', 3)),1,2,3,4));
    
    • 1
    st_astext
    CURVEPOLYGON(CIRCULARSTRING(714 2276,711.363961030679 2267.51471862576,705 2264,698.636038969321 2284.48528137424,714 2276))
  • 相关阅读:
    okHttp网络请求结果Response返回主线程中
    【机器学习】支持向量机【下】软间隔与核函数
    finereport报表制作总结:每页既有页内合计,又有总合计,包含解决页合计,总合计最后一页重复的问题
    ai智能生成文章-智能生成文章软件
    react源码分析:实现react时间分片
    .NET WebAPI 自定义 NullableConverter 解决可为空类型字段入参“”空字符触发转换异常问题
    【云原生】什么是CI/CD? | CI/CD 带来的好处
    Nacos整合Gateway入门示例
    ios开发App,在App Store上架的app更新提交过程
    二叉树中两个节点的最短路径
  • 原文地址:https://blog.csdn.net/a13407142317/article/details/126429555