6.19. 轨迹函数
6.19.1. ST_IsValidTrajectory
ST_IsValidTrajectory — 检测一个几何对象是否编码了一个合法的轨迹。
用法
boolean ST_IsValidTrajectory(geometry line);
描述
检测一个几何对象是否编码了一条合法的轨迹。 一条合法的轨迹是由一条带有 M 维坐标的 LINESTRING 对象表示的。线上每个顶点的 M 值应是逐渐增大的。
类似 ST_ClosestPointOfApproach 那样的时空函数需要合法的轨迹作为输入参数。
-
该函数支持 3D 对象,并且不会丢弃 Z 坐标。
样例
-- A valid trajectory SELECT ST_IsValidTrajectory(ST_MakeLine( ST_MakePointM(0,0,1), ST_MakePointM(0,1,2)) ); t -- An invalid trajectory SELECT ST_IsValidTrajectory(ST_MakeLine(ST_MakePointM(0,0,1), ST_MakePointM(0,1,0))); NOTICE: Measure of vertex 1 (0) not bigger than measure of vertex 0 (1) st_isvalidtrajectory ---------------------- f
请参考
ST_ClosestPointOfApproach
6.19.2. ST_ClosestPointOfApproach
ST_ClosestPointOfApproach — 返回给定的两条轨迹上相距最近的点上的 M 值。
用法
float8 ST_ClosestPointOfApproach(geometry track1, geometry track2);
描述
返回给定的两条轨迹上相距最近的点上的 M 值。
输入的轨迹必须是能通过 ST_IsValidTrajectory 函数检验的轨迹。 如果两条轨迹上没有重叠的 M 值范围,则返回 NULL 。
要想获取轨迹上具有给定 M 值的点,请使用 ST_LocateAlong 函数。
-
该函数支持 3D 对象,并且不会丢弃 Z 坐标。
样例
-- Return the time in which two objects moving between 10:00 and 11:00 -- are closest to each other and their distance at that point WITH inp AS ( SELECT ST_AddMeasure('LINESTRING Z (0 0 0, 10 0 5)'::geometry, extract(epoch from '2015-05-26 10:00'::timestamptz), extract(epoch from '2015-05-26 11:00'::timestamptz) ) a, ST_AddMeasure('LINESTRING Z (0 2 10, 12 1 2)'::geometry, extract(epoch from '2015-05-26 10:00'::timestamptz), extract(epoch from '2015-05-26 11:00'::timestamptz) ) b ), cpa AS ( SELECT ST_ClosestPointOfApproach(a,b) m FROM inp ), points AS ( SELECT ST_Force3DZ(ST_GeometryN(ST_LocateAlong(a,m),1)) pa, ST_Force3DZ(ST_GeometryN(ST_LocateAlong(b,m),1)) pb FROM inp, cpa ) SELECT to_timestamp(m) t, ST_Distance(pa,pb) distance FROM points, cpa; t | distance -------------------------------+------------------ 2015-05-26 10:45:31.034483+02 | 1.96036833151395
相关参考
ST_IsValidTrajectory, ST_DistanceCPA, ST_LocateAlong, ST_AddMeasure
6.19.3. ST_DistanceCPA
ST_DistanceCPA — 返回两个运动物体在运动过程中的最近距离。
用法
float8 ST_DistanceCPA(geometry track1, geometry track2);
描述
返回两个运动物体在运动过程中的最近距离。
输入的轨迹必须是能通过 ST_IsValidTrajectory 函数检验的轨迹。 如果两条轨迹上没有重叠的 M 值范围,则返回 NULL 。
-
该函数支持 3D 对象,并且不会丢弃 Z 坐标。
样例
-- Return the minimum distance of two objects moving between 10:00 and 11:00 WITH inp AS ( SELECT ST_AddMeasure('LINESTRING Z (0 0 0, 10 0 5)'::geometry, extract(epoch from '2015-05-26 10:00'::timestamptz), extract(epoch from '2015-05-26 11:00'::timestamptz) ) a, ST_AddMeasure('LINESTRING Z (0 2 10, 12 1 2)'::geometry, extract(epoch from '2015-05-26 10:00'::timestamptz), extract(epoch from '2015-05-26 11:00'::timestamptz) ) b ) SELECT ST_DistanceCPA(a,b) distance FROM inp; distance ------------------ 1.96036833151395
请参考
ST_IsValidTrajectory, ST_ClosestPointOfApproach, ST_AddMeasure, |=|
6.19.4. ST_CPAWithin
ST_CPAWithin — 检测两个运动物体在运动过程中是否曾经接近到指定的距离内。
用法
boolean ST_CPAWithin(geometry track1, geometry track2, float8 maxdist);
描述
检测两个运动物体在运动过程中是否曾经接近到指定的距离内。
输入的轨迹必须是能通过 ST_IsValidTrajectory 函数检验的轨迹。 如果两条轨迹上没有重叠的 M 值范围,则返回 NULL 。
-
该函数支持 3D 对象,并且不会丢弃 Z 坐标。
样例
WITH inp AS ( SELECT ST_AddMeasure('LINESTRING Z (0 0 0, 10 0 5)'::geometry, extract(epoch from '2015-05-26 10:00'::timestamptz), extract(epoch from '2015-05-26 11:00'::timestamptz) ) a, ST_AddMeasure('LINESTRING Z (0 2 10, 12 1 2)'::geometry, extract(epoch from '2015-05-26 10:00'::timestamptz), extract(epoch from '2015-05-26 11:00'::timestamptz) ) b ) SELECT ST_CPAWithin(a,b,2), ST_DistanceCPA(a,b) distance FROM inp; st_cpawithin | distance --------------+------------------ t | 1.96521473776207
请参考
ST_IsValidTrajectory, ST_ClosestPointOfApproach, ST_DistanceCPA, |=|
6.20. SFCGAL 函数
6.20.1. ST_Extrude
ST_Extrude — 把一个 Surface 类型对象拉伸一定体积。
用法
geometry ST_Extrude(geometry geom, float x, float y, float z);
描述
可用性
-
该函数方法需要 SFCGAL 库的支持.
-
这个函数支持 3D 对象,并且不会删除 z 坐标
-
该函数支持 Polyhedral Surface 类型几何对象.
-
该函数支持 Triangles 和 Triangulated Irregular Network Surfaces (TIN) 类型.
6.20.2. ST_StraightSkeleton
ST_StraightSkeleton — 从一个几何对象中计算出一个直线组成的框架。
用法
geometry ST_StraightSkeleton(geometry geom);
描述
可用性
-
该函数方法需要 SFCGAL 库的支持.
-
这个函数支持 3D 对象,并且不会删除 z 坐标
-
该函数支持 Polyhedral Surface 类型几何对象.
-
该函数支持 Triangles 和 Triangulated Irregular Network Surfaces (TIN) 类型.
6.20.3. ST_ApproximateMedialAxis
ST_ApproximateMedialAxis — 基于面状输入对象的直线骨架,返回一个近似的中轴线。
用法
geometry ST_ApproximateMedialAxis(geometry geom);
描述
基于面状输入对象的直线骨架,返回一个近似的中轴线。
-
该函数支持 3D 对象, 并且不会丢弃 Z 坐标。
-
该函数支持 Polyhedral 表面。
-
该函数支持三角形和 TIN。
样例
SELECT ST_ApproximateMedialAxis(ST_GeomFromText('POLYGON (( 190 190, 10 190, 10 10, 190 10, 190 20, 160 30, 60 30, 60 130, 190 140, 190 190 ))'));
请参考
ST_StraightSkeleton
6.20.4. ST_IsPlanar
ST_IsPlanar — 检验一个面是否是平面
用法
boolean ST_IsPlanar(geometry geom);
描述
可用性
-
该函数方法需要 SFCGAL 库的支持.
-
这个函数支持 3D 对象,并且不会删除 z 坐标
-
该函数支持 Polyhedral Surface 类型几何对象.
-
该函数支持 Triangles 和 Triangulated Irregular Network Surfaces (TIN) 类型.
6.20.5. ST_Orientation
ST_Orientation — 确定表面方向
用法
integer ST_Orientation(geometry geom);
描述
可用性
-
该函数方法需要 SFCGAL 库的支持.
-
这个函数支持 3D 对象,并且不会删除 z 坐标
-
该函数支持 Polyhedral Surface 类型几何对象.
-
该函数支持 Triangles 和 Triangulated Irregular Network Surfaces (TIN) 类型.
6.20.6. ST_ForceLHR
ST_ForceLHR — 强制对输入的几何对象做左手定则转换
用法
geometry ST_ForceLHR(geometry geom);
描述
可用性
-
该函数方法需要 SFCGAL 库的支持。
-
这个函数支持 3D 对象,并且不会删除 z 坐标。
-
该函数支持 Polyhedral Surface 类型几何对象。
-
该函数支持 Triangles 和 Triangulated Irregular Network Surfaces (TIN) 类型。
6.20.7. ST_MinkowskiSum
ST_MinkowskiSum — 求 Minkowski (闵可夫斯基)和闵可夫斯基和定义如下:
闵可夫斯基和是两个欧几里得空间的点集的和,以德国数学家闵可夫斯基命名。点集 A 与 B 的闵可夫斯基和就是 A+B={a+b|a∈A,b∈B}。例如,平面上有两个三角形,其坐标分别为 A = {(1, 0), (0, 1), (0, −1)} 及 B = {(0, 0), (1, 1), (1, −1)},则其闵可夫斯基和为 A + B = {(1, 0), (2, 1), (2, −1), (0, 1), (1, 2), (1, 0), (0, −1), (1, 0), (1, −2)}。
用法
geometry ST_Minkowski(geometry geom1, geometry geom2);
描述
-
该函数方法需要 SFCGAL 库的支持。
-
这个函数支持 3D 对象,并且不会删除 z 坐标。
-
该函数支持 Polyhedral Surface 类型几何对象。
-
该函数支持 Triangles 和 Triangulated Irregular Network Surfaces (TIN) 类型。
6.20.8. ST_ConstrainedDelaunayTriangles
ST_ConstrainedDelaunayTriangles — 围绕输入几何对象的顶点, 返回一个带约束条件的迪洛尼三角网, 输出类型为 TIN。
用法
geometry ST_ConstrainedDelaunayTriangles(geometry g1);
描述
围绕输入几何对象的顶点,返回一个带约束条件的迪洛尼三角网,输出类型为 TIN。
该函数支持 3D 对象,并且不会丢弃 Z 坐标。
样例
对两个多边形调用该函数
select ST_ConstrainedDelaunayTriangles( ST_Union( 'POLYGON((175 150, 20 40, 50 60, 125 100, 175 150))'::geometry, ST_Buffer('POINT(110 170)'::geometry, 20) ) );
对两个多边形调用 ST_DelaunayTriangles 函数, 三角形的边穿越了多边形的边界。
select ST_DelaunayTriangles( ST_Union( 'POLYGON((175 150, 20 40, 50 60, 125 100, 175 150))'::geometry, ST_Buffer('POINT(110 170)'::geometry, 20) ) );
相关参考
ST_DelaunayTriangles, ST_Tesselate, ST_ConcaveHull, ST_Dump
6.20.9. ST_3DIntersection
ST_3DIntersection — 返回两个几何体的公共部分。
用法
geometry ST_3DIntersection(geometry geom1, geometry geom2);
描述
返回两个几何体的公共部分。
-
该函数支持 3D 对象, 并且不会丢弃 Z 坐标。
-
该函数支持 Polyhedral 表面。
-
该函数支持三角形和 TIN。
样例
SELECT ST_Extrude(ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50, 'quad_segs=2'),0,0,30) AS geom1, ST_Extrude(ST_Buffer(ST_GeomFromText('POINT(80 80)'), 50, 'quad_segs=1'),0,0,30) AS geom2;
原始 3D 几何体的叠加展示, geom2 显示为半透明
SELECT ST_3DIntersection(geom1,geom2) FROM ( SELECT ST_Extrude(ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50, 'quad_segs=2'),0,0,30) AS geom1, ST_Extrude(ST_Buffer(ST_GeomFromText('POINT(80 80)'), 50, 'quad_segs=1'),0,0,30) AS geom2 ) As t;
两个几何体的交集
3D 线与多边形的交集
SELECT ST_AsText(ST_3DIntersection(linestring, polygon)) As wkt FROM ST_GeomFromText('LINESTRING Z (2 2 6,1.5 1.5 7,1 1 8,0.5 0.5 8,0 0 10)') AS linestring CROSS JOIN ST_GeomFromText('POLYGON((0 0 8, 0 1 8, 1 1 8, 1 0 8, 0 0 8))') AS polygon; wkt -------------------------------- LINESTRING Z (1 1 8,0.5 0.5 8)
立方体(封闭多边形表面) 与 3D 多边形
SELECT ST_AsText(ST_3DIntersection( ST_GeomFromText('POLYHEDRALSURFACE Z( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )'), 'POLYGON Z ((0 0 0, 0 0 0.5, 0 0.5 0.5, 0 0.5 0, 0 0 0))'::geometry)) TIN Z (((0 0 0,0 0 0.5,0 0.5 0.5,0 0 0)),((0 0.5 0,0 0 0,0 0.5 0.5,0 0.5 0)))
两个实心几何体的交集也是一个实心的几何体
SELECT ST_AsText(ST_3DIntersection( ST_Extrude(ST_Buffer('POINT(10 20)'::geometry,10,1),0,0,30), ST_Extrude(ST_Buffer('POINT(10 20)'::geometry,10,1),2,0,10) ));
POLYHEDRALSURFACE Z (((13.3333333333333 13.3333333333333 10,20 20 0,20 20 10,13.3333333333333 13.3333333333333 10)),
((20 20 10,16.6666666666667 23.3333333333333 10,13.3333333333333 13.3333333333333 10,20 20 10)), ((20 20 0,16.6666666666667 23.3333333333333 10,20 20 10,20 20 0)), ((13.3333333333333 13.3333333333333 10,10 10 0,20 20 0,13.3333333333333 13.3333333333333 10)), ((16.6666666666667 23.3333333333333 10,12 28 10,13.3333333333333 13.3333333333333 10,16.6666666666667 23.3333333333333 10)), ((20 20 0,9.99999999999995 30 0,16.6666666666667 23.3333333333333 10,20 20 0)), ((10 10 0,9.99999999999995 30 0,20 20 0,10 10 0)),((13.3333333333333 13.3333333333333 10,12 12 10,10 10 0,13.3333333333333 13.3333333333333 10)), ((12 28 10,12 12 10,13.3333333333333 13.3333333333333 10,12 28 10)), ((16.6666666666667 23.3333333333333 10,9.99999999999995 30 0,12 28 10,16.6666666666667 23.3333333333333 10)), ((10 10 0,0 20 0,9.99999999999995 30 0,10 10 0)), ((12 12 10,11 11 10,10 10 0,12 12 10)),((12 28 10,11 11 10,12 12 10,12 28 10)), ((9.99999999999995 30 0,11 29 10,12 28 10,9.99999999999995 30 0)),((0 20 0,2 20 10,9.99999999999995 30 0,0 20 0)), ((10 10 0,2 20 10,0 20 0,10 10 0)),((11 11 10,2 20 10,10 10 0,11 11 10)),((12 28 10,11 29 10,11 11 10,12 28 10)), ((9.99999999999995 30 0,2 20 10,11 29 10,9.99999999999995 30 0)),((11 11 10,11 29 10,2 20 10,11 11 10)))
6.20.10. ST_3DDifference
ST_3DDifference — 返回两个几何体有差异的部分。
用法
geometry ST_3DDifference(geometry geom1, geometry geom2);
描述
返回两个几何体有差异的部分。
-
该函数支持 3D 对象, 并且不会丢弃 Z 坐标。
-
该函数支持 Polyhedral 表面。
-
该函数支持三角形和 TIN。
样例
SELECT ST_Extrude(ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50, 'quad_segs=2'),0,0,30) AS geom1, ST_Extrude(ST_Buffer(ST_GeomFromText('POINT(80 80)'), 50, 'quad_segs=1'),0,0,30) AS geom2;
原始 3D 几何体的叠加展示, geom2 显示为半透明
SELECT ST_3DDifference(geom1,geom2) FROM ( SELECT ST_Extrude(ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50, 'quad_segs=2'),0,0,30) AS geom1, ST_Extrude(ST_Buffer(ST_GeomFromText('POINT(80 80)'), 50, 'quad_segs=1'),0,0,30) AS geom2 ) As t;
Geom1 减去 geom2 后的差异部分
相关参考
ST_Extrude, ST_AsX3D, ST_3DIntersection ST_3DUnion
6.20.11. ST_3DUnion
ST_3DUnion — 返回两个几何体的并集。
用法
geometry ST_3DUnion(geometry geom1, geometry geom2);
描述
-
该函数支持 3D 对象, 并且不会丢弃 Z 坐标。
-
该函数支持 Polyhedral 表面。
-
该函数支持三角形和 TIN。
样例
SELECT ST_Extrude(ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50, 'quad_segs=2'),0,0,30) AS geom1, ST_Extrude(ST_Buffer(ST_GeomFromText('POINT(80 80)'), 50, 'quad_segs=1'),0,0,30) AS geom2;
原始 3D 几何体的叠加展示, geom2 显示为半透明
SELECT ST_3DUnion(geom1,geom2) FROM ( SELECT ST_Extrude(ST_Buffer(ST_GeomFromText('POINT(100 90)'), 50, 'quad_segs=2'),0,0,30) AS geom1, ST_Extrude(ST_Buffer(ST_GeomFromText('POINT(80 80)'), 50, 'quad_segs=1'),0,0,30) AS geom2 ) As t;
相关参考
ST_Extrude, ST_AsX3D, ST_3DIntersection ST_3DDifference
6.20.12. ST_3DArea
ST_3DArea — 计算一个 3D 面对象的面积,对于立体则返回 0。
用法
float ST_3DArea(geometry geom1);
描述
-
该函数支持 3D 对象, 并且不会丢弃 Z 坐标。
-
该函数支持 Polyhedral 表面。
-
该函数支持三角形和 TIN。
样例
默认情况下, PolyhedralSurface 将建立一个面对象,而非立体,因此拥有面积。一旦被转换为立体,就不再有面积。
SELECT ST_3DArea(geom) As cube_surface_area, ST_3DArea(ST_MakeSolid(geom)) As solid_surface_area FROM (SELECT 'POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )'::geometry) As f(geom); cube_surface_area | solid_surface_area -------------------+-------------------- 6 | 0
相关参考
ST_Area, ST_MakeSolid, ST_IsSolid, ST_Area
6.20.13. ST_Tesselate
ST_Tesselate — 对一个 Surface 进行曲面三角形化切割
用法
geometry ST_Tesselate(geometry geom);
样例
暂无
描述
可用性
-
该函数方法需要 SFCGAL 库的支持。
-
这个函数支持 3D 对象,并且不会删除 z 坐标。
-
该函数支持 Polyhedral Surface 类型几何对象。
-
该函数支持 Triangles 和 Triangulated Irregular Network Surfaces (TIN) 类型。
6.20.14. ST_Volume
ST_Volume — 求体积。
用法
float ST_Volume(geometry geom1);
描述
-
该函数支持 3D 对象, 并且不会丢弃 Z 坐标。
-
该函数支持 Polyhedral 表面。
-
该函数支持三角形和 TIN。
样例
封闭表面仍然是面对象,要想将其变为立体,需使用 ST_MakeSolid 函数。面对象没有体积。
SELECT ST_Volume(geom) As cube_surface_vol, ST_Volume(ST_MakeSolid(geom)) As solid_surface_vol FROM (SELECT 'POLYHEDRALSURFACE( ((0 0 0, 0 0 1, 0 1 1, 0 1 0, 0 0 0)), ((0 0 0, 0 1 0, 1 1 0, 1 0 0, 0 0 0)), ((0 0 0, 1 0 0, 1 0 1, 0 0 1, 0 0 0)), ((1 1 0, 1 1 1, 1 0 1, 1 0 0, 1 1 0)), ((0 1 0, 0 1 1, 1 1 1, 1 1 0, 0 1 0)), ((0 0 1, 1 0 1, 1 1 1, 0 1 1, 0 0 1)) )'::geometry) As f(geom); cube_surface_vol | solid_surface_vol ------------------+------------------- 0 | 1
相关参考
ST_3DArea, ST_MakeSolid, ST_IsSolid
6.20.15. ST_MakeSolid
ST_MakeSolid — 将封闭的面对象转变成立体。
用法
geometryST_MakeSolid(geometry geom1);
描述
-
该函数支持 3D 对象, 并且不会丢弃 Z 坐标。
-
该函数支持 Polyhedral 表面。
-
该函数支持三角形和 TIN。
6.20.16. ST_IsSolid
ST_IsSolid — 判断一个几何对象是否是立体。
用法
booleanST_IsSolid(geometry geom1);
描述
-
该函数支持 3D 对象, 并且不会丢弃 Z 坐标。
-
该函数支持 Polyhedral 表面。
-
该函数支持三角形和 TIN。