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.1.2. 描述

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

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

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

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

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

顶点变换如下:

x' = a*x + b*y + xoff
y' = d*x + e*y + yoff
z' = z

在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;
using_affine using_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;
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.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()));
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));
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;
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.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));
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.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.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));
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;
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.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));
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));
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)));
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));
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.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;
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;
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));
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));
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.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));
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));
st_astext
CURVEPOLYGON(CIRCULARSTRING(714 2276,711.363961030679 2267.51471862576,705 2264,698.636038969321 2284.48528137424,714 2276))

AffineTransformations仿射变化相关推荐

  1. Javascript实现二次多项式仿射变化

    Javascript实现二次多项式仿射变化 我之前遇到了这样的问题,用户想要将没有任何坐标信息的图片发布成地图服务,但是又不能对图片进行拉伸等一系列的变换,所以,最终采用的二次多项式做校准,用二次多项 ...

  2. 20200813-共轭函数的仿射变化

    在Convex Optimization的第三章中提到了共轭函数的仿射变化.但是没有具体说明过程,这里推导一下. 参考资料: Convex Optimization: Chapter-3 函数的共轭函 ...

  3. OpenCV开发笔记(四十六):红胖子8分钟带你深入了解仿射变化(图文并茂+浅显易懂+程序源码)

    若该文为原创文章,未经允许不得转载 原博主博客地址:https://blog.csdn.net/qq21497936 原博主博客导航:https://blog.csdn.net/qq21497936/ ...

  4. 6、随机仿射变化 transforms.RandomAffine()

    transforms.RandomAffine(degrees, translate=None, scale=None, shear=None, interpolation=<Interpola ...

  5. OpenCV 图像处理系列(6)—— 图像的几何变化

    图像的几何变换 OpenCV 提供了两个变换函数,cv2.warpAffine 和 cv2.warpPerspective,使用这两个函数你可以实现所有类型的变换.cv2.warpAffine 接收的 ...

  6. SIFT特征提取算法总结

    转自:http://www.jellon.cn/index.php/archives/374 一.综述 Scale-invariant feature transform(简称SIFT)是一种图像特征 ...

  7. B样条曲线 及 B样条曲面

    B样条曲线 在保留Bézie优点的同时,克服了他的弱点:采用样条--分段连续多项式 例如,现在有n+1个点,在每两点之间构造一条多项式,则有n个小区间.每个小区间构造一条三次多项式,变成了n段的三次多 ...

  8. 读完这45篇论文,“没人比我更懂AI了”

    作者 | 黄海广 转载自机器学习爱好者(ID:ai-start-com) 导读:AI领域的发展会是IT中最快的.我们所看到的那些黑科技,其后无不堆积了大量论文,而且都是最新.最前沿的论文.从某种角度来 ...

  9. 做人工智能必看的45篇论文 | 附下载地址

    而AI领域的发展会是IT中最快的.我们所看到的那些黑客技,其后面无不堆积了大量的论文.而且都是最新.最前沿的论文. 从某种调度来讲,他们所用的技术跟书籍里的内容确实不是一个时代.要想与时俱进,就必须改 ...

最新文章

  1. 使用jmeter测试工具完成文件的上传
  2. 开源 1 年半 star 破 1.2 万的 Dapr 是如何在阿里落地的?
  3. Object构造函数的方法
  4. windows10大瘦身 - 关闭lync的日志记录
  5. 【Elasticsearch】es 使用Rollup在Elasticsearch 6.3中合并旧日志 上卷 Rollup
  6. [专题练习] Part1 搜索
  7. 【渝粤教育】电大中专计算机使用基础_1作业 题库
  8. 浏览器网页操作 EXCEL 示例
  9. 公司小规模纳税人税务零申报操作说明
  10. EditPlus3.3 集成 SVN
  11. Unity-世界坐标与屏幕坐标
  12. LocalDateTime日期格式之间的转换
  13. rfid考勤系统mysql_RFID智能考勤管理系统
  14. RS232转RS485电路图
  15. java正则匹配ip_正则表达式匹配ip地址
  16. 搭建react + typescript + airbnb eslint 项目
  17. 【奇葩问题】每次打开excel文件都会出现两个窗口,一个是空白的sheet1,另一个是自己的文档
  18. vue安装及创建运行
  19. 二叉树的前中后序遍历(栈)(C++)
  20. 2023年中央财经大学数量经济学考博必看上岸前辈复习经验分享

热门文章

  1. 只要你敢,总会有光芒指引你
  2. Java获取指定日期所在周的周一和周日的日期
  3. mysql ssh 登陆
  4. uos系统能做服务器吗,国产操作系统UOS可以用PS,还可以玩英雄联盟?
  5. Power BI-DAX
  6. 荣耀8x与华为畅享9s鸿蒙系统,华为畅享9 Plus和荣耀8X哪款更值得买呢?华为畅享9 Plus和荣耀8X区别对比评测...
  7. Android面试经验总结
  8. python同切圆_画一组同切圆 画一组同心圆 画一个五角星 画一个黄色实心五角星 turtle.up() turtle.goto(0,-100) turtle.down() ...
  9. 2018年河南省对口升学计算机基础答案,河南省2018 年计算机类基础课 对口升学考试题.doc...
  10. Mathtype 公式在word中不对应的问题总结