• 金仓数据库 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。

  • 相关阅读:
    docker系统架构
    陈胡:Apache SeaTunnel实现 非CDC数据抽取实践
    使用KiCad插件,将PCB焊接可视化
    Redis 的底层数据结构和IO模型
    别被骗了,try-catch语句真的会影响性能吗?
    MyBatis-Plus标准数据层开发
    闲聊一下写技术博客的一些感想
    mbox在react中的使用
    从零开始 Spring Boot 17:MyBatis Plus 续
    docker发布镜像到阿里云与私服
  • 原文地址:https://blog.csdn.net/arthemis_14/article/details/126303469