CnosDB 在最近新发布的 2.4.0 版本中增加对时空函数的支持。
概述
时空函数是一种用于描述时空结构和演化的函数。它在物理学、数学和计算机科学等领域中都有广泛的应用。时空函数可以描述物体在时空中的位置、速度、加速度以及其他相关属性。
用法
CnosDB 将使用一种全新的数据类型 Geometry 来支持地理信息系统。
创建表的时候可以指定列的类型为 Geometry:
create table geo_table (
geo geometry(<object_type>, )
);
复制代码
目前 CnosDB 中使用 WKT 格式来存储 Geometry 类型,Geometry 类型下有 7 种几何对象:
WKT 是是一种开放的国际标准,全拼为 Well-Known Text 。
示例
支持函数
为了更好地操纵 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 关于时空函数的功能,你可以利用这些功能来处理和分析时空数据,使用时空函数可以帮助你解决许多与地理位置相关的问题,无论是在物流规划、位置分析、地理信息系统还是其他领域,都可以从时空数据中提取有价值的信息,帮助您做出更明智的决策,优化业务流程,并提供更好的服务。
无论您是专业的地理信息系统专家,还是对地理位置数据感兴趣的普通用户,时空函数都将为您提供强大而有用的查询和分析工具。让我们一起利用时空函数,挖掘地理数据的无限潜力!欢迎加入这个精彩的时空分析的世界!
评论