金仓数据库 KingbaseGIS 使用手册(6.19. 轨迹函数、6.20. SFCGAL 函数)

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。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值