CnosDB 支持时空函数啦!

原创
2023/11/20 21:10
阅读数 31

CnosDB 在最近新发布的 2.4.0 版本中增加对时空函数的支持。

CnosDB 支持时空函数啦!

概述

时空函数是一种用于描述时空结构和演化的函数。它在物理学、数学和计算机科学等领域中都有广泛的应用。时空函数可以描述物体在时空中的位置、速度、加速度以及其他相关属性。

用法

CnosDB 将使用一种全新的数据类型 Geometry来支持地理信息系统。

创建表的时候可以指定列的类型为Geometry:

create table geo_table (
  geo geometry(<object_type>, )
);

目前 CnosDB 中使用 WKT 格式来存储Geometry类型,Geometry类型下有 7 种几何对象:

WKT 是是一种开放的国际标准,全拼为 Well-Known Text 。

几何对象

语法描述

POINT(<x1><y1>)

线

LINESTRING(<x1><y1>,<x2><y2>,…)

多边形

POLYGON((<x1><y1>,<y1><y2>))

多点

MULTIPOINT (<x1> <y1>, <x2> <y2>, …)

多线

MULTILINESTRING ((<x1> <y1>, <x2> <y2>, …), (<x1> <y1>, <x2> <y2>, …))

多面(多多边形)

MULTIPOLYGON (((<x1> <y1>, <x2> <y2>, …)), ((<x1> <y1>, <x2> <y2>, …)))

几何对象集合

GEOMETRYCOLLECTION (<geometry tag1> <wkt data1>, <geometry tag2> <wkt data2>, …)

示例

几何对象

示例

POINT(30 10)

线

LINESTRING (30 10, 10 30, 40 40)

多边形

POLYGON ((30 10, 40 40, 20 40, 10 20, 30 10))

POLYGON ((35 10, 45 45, 15 40, 10 20, 35 10), (20 30, 35 35, 30 20, 20 30))

多点

MULTIPOINT ((10 40), (40 30), (20 20), (30 10))

MULTIPOINT (10 40, 40 30, 20 20, 30 10)

多线

MULTILINESTRING ((10 10, 20 20, 10 40), (40 40, 30 30, 40 20, 30 10))

几何对象集合

GEOMETRYCOLLECTION (POINT (40 10), LINESTRING (10 10, 20 20, 10 40), POLYGON ((40 40, 20 45, 45 30, 40 40)))

支持函数

为了更好地操纵 Geometry 类型,CnosDB 提供了 ST_Geometry SQL 系列的函数,来计算几何体的性质和几何体之间的关系

ST_AsBinary(geometry)

将几何对象转换为 WKB 格式,WKB 格式是由 OpenGIS 规范定义的,用于以二进制流的形式交换几何数据,二进制流由含几何 WKB 信息的 BLOB 值表示。

参数类型:Geometry

返回类型:Binary

示例:

select ST_AsBinary('POINT  (1 1)')

返回结果为16进制:

+--------------------------------------------+
| st_AsBinary(Utf8("POINT  (1 1)"))          |
+--------------------------------------------+
| 0101000000000000000000f03f000000000000f03f |
+--------------------------------------------+

第一个字节表示数据的字节序:01

后面4个字节表示对象的几何类型 :01000000

POINT的值X和Y用8字节double类型的数据表示:000000000000F03F,000000000000F03F

ST_GeomFromWKB

功能:把WKB格式二进制转为Geometry类型

参数类型: Binary

返回类型: Geometry

示例:

SELECT ST_GeomFromWKB(ST_AsBinary('POINT(0 3)'))

返回的结果:

+-------------------------------------------------+
| st_GeomFromWKB(st_AsBinary(Utf8("POINT(0 3)"))) |
+-------------------------------------------------+
| POINT(0 3)                                      |
+-------------------------------------------------+

ST_Distance(geometry1, geometry2)

功能: ST_Distance 返回两个几何体的 2D 投影之间的最小欧氏距离。

参数类型:Binary

返回类型: Double

示例:

两点间距离

SELECT ST_Distance('POINT(1 0)', 'POINT(0 0)',);

+----------------------------------------------------+
| st_distance(Utf8("POINT(1 0)"),Utf8("POINT(0 0)")) |
+----------------------------------------------------+
| 1.0                                                |
+----------------------------------------------------+

返回结果:

+----------------------------------------------------+
| st_distance(Utf8("POINT(1 0)"),Utf8("POINT(0 0)")) |
+----------------------------------------------------+
| 1.0                                                |
+----------------------------------------------------+

点到直线距离

SELECT ST_Distance('POINT(0 0)', 'LINESTRING (30 10, 10 30, 40 40)');

返回结果:

+--------------------------------------------------------------------------+
| st_distance(Utf8("POINT(0 0)"),Utf8("LINESTRING (30 10, 10 30, 40 40)")) |
+--------------------------------------------------------------------------+
| 28.284271247461902                                                       |
+--------------------------------------------------------------------------+

平面和平面之间的距离

SELECT ST_Distance('POLYGON((0 2,1 1,0 -1,0 2))', 'POLYGON((-1 -3,-2 -1,0 -3,-1 -3))') as distance;

返回结果

+--------------------+
| distance           |
+--------------------+
| 1.4142135623730951 |
+--------------------+

ST_Area(geometry)

功能:返回几何对象 2D 投影的笛卡尔面积。面积单位与用于表示输入几何体坐标的单位相同。 对于点、线串、多点和多线串,此函数返回 0。 对于几何体集合,它返回集合中几何体的面积之和。

参数类型: Geometry

返回类型: Double

示例:

SELECT ST_Area('POLYGON ((40 40, 20 45, 45 30, 40 40))') as area;

+------+
| area |
+------+
| 87.5 |
+------+

返回结果

+------+
| area |
+------+
| 87.5 |
+------+

注意:部分几何图形不支持计算面积,对这些几何体计算面积会返回 0,如:Point、MultiPoint、LineString、MultiLineString、Line。 如果参数内容格式非法,返回值为 NULL。

案例:物联网场景监控车辆驶入电子围栏

下面有一张表 car。

表car记录车辆的实时位置, id 唯一指示一辆车, location 是车的实时坐标。

create table car (
  location: geometry(point, 0),
  tags(id)
);

这里有一种圆形的电子围栏,坐标为117.20, 39.12, 半径为0.0008。

1.计算此时电子围栏中的车辆数量

select count(*)
from(
  select max(time), id, location 
  from car 
  group by id, location
)
where st_distance(location, 'POINT (117.20, 39.12)') < 0.0008; 

首先通过max 聚合时间列,找到每辆车最新的位置记录,

然后使用 空间函数 st_distance 找到离电子围栏距离小于电子围栏半径的车辆 ,最后使用 count计算数量。

2.计算车 A5678 的最先进入电子围栏的时间以及最后在电子围栏内的时间。

select min(time), max(time) 
from car 
where id = 'A5678' and st_distance(location, 'POINT (117.20, 39.12') < 0.0008;

通过 id 筛选出指定车的记录,再使用 空间函数st_distance过滤出该车坐标在电子围栏中的记录,最后使用 min max 聚合函数找出时间。

以上就是 CnosDB2.4 关于时空函数的功能,你可以利用这些功能来处理和分析时空数据,使用时空函数可以帮助你解决许多与地理位置相关的问题,无论是在物流规划、位置分析、地理信息系统还是其他领域,都可以从时空数据中提取有价值的信息,帮助您做出更明智的决策,优化业务流程,并提供更好的服务。

无论您是专业的地理信息系统专家,还是对地理位置数据感兴趣的普通用户,时空函数都将为您提供强大而有用的查询和分析工具。让我们一起利用时空函数,挖掘地理数据的无限潜力!欢迎加入这个精彩的时空分析的世界!

 

参与 CnosDB 社区交流群:

 

扫描下方二维码,加入 CC 进入 CnosDB 社区交流,CC 也会在群内分享直播链接哒

up-55fffc7defd74a930ab4770f21926394f77.png

展开阅读全文
加载中
点击引领话题📣 发布并加入讨论🔥
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部