CnosDB 在最近新发布的 2.4.0 版本中增加对时空函数的支持。
概述
时空函数是一种用于描述时空结构和演化的函数。它在物理学、数学和计算机科学等领域中都有广泛的应用。时空函数可以描述物体在时空中的位置、速度、加速度以及其他相关属性。
用法
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简介
CnosDB是一款高性能、高易用性的开源分布式时序数据库,现已正式发布及全部开源。
欢迎关注我们的社区网站:https://cn.cnosdb.com