基本概念

本章节将为您介绍Trajectory SQL的基本概念。

Trajectory对象

名称

描述

Trajectory Point

轨迹点,是由移动对象在某个时刻所在的空间位置与附带的属性值组成的时空对象,其中空间位置支持二维坐标或三维坐标,属性支持多字段多类型。

Trajectory Object

轨迹对象,是由一系列轨迹点、轨迹事件组成的含时间、空间、属性、事件的高维对象。

Trajectory Timeline

轨迹时间序列,轨迹在时间上连续推进的时间值序列。

Trajectory Spatial

轨迹空间对象,轨迹在空间上的Geometry对象,通常为linestring。

Trajectory Leaf

轨迹叶子,这里指轨迹点Point,即移动对象在某个时刻的空间位置。

Trajectory Attributes

轨迹属性信息(以下简称属性),移动对象在不同轨迹点上所具有的属性信息,比如速度信息、方向信息等。

Trajectory Attribute Field

轨迹属性字段(以下简称字段),轨迹属性中的某个字段,比如速度字段,轨迹属性字段值的个数与轨迹点个数一致。

Trajectory Field Value

轨迹属性值,轨迹属性在某一时刻某个字段的值。

Trajectory Events

轨迹事件,在轨迹行程中发生的额外事件,比如汽车行程轨迹中的加油事件、抛锚事件、锁车事件等,由事件类型ID和事件时间组成。

轨迹示意图如下。

BoxNdf对象

在实际计算时,由于轨迹模块涉及的对象(轨迹类型或几何类型)常常十分复杂,在分析时可能会使用计算较为简单的矩形框对象描述查询或简化计算。在轨迹模块,使用BoxNdf类型表示矩形框。

BoxNdf对象表示在时空中的一个多维立方体区域,其由在x,y,z(空间),t(时间)四个坐标轴上的最小值和最大值表示。每个矩形框包含的维度可能不同,有的矩形框只记录x、y维度信息,有些则可能记录x、y、z、t四个维度的信息。

在查询时可能用矩形框表示一个查询范围,在查询时也可以利用轨迹或几何类型的外包矩形框来辅助查询。例如下图就是一条在x,y,t空间中的运动的轨迹和它对应的外包矩形框。

外包矩形框示意图如下。

外包框示意图

PostgreSQL的时间类型

PostgreSQL中涉及时间相关的有三种类型:

  • timestamptz:带时区信息(time zone)的时间类型。

  • timestamp:不带时区信息的时间类型。

  • interval:时间段类型。

Ganos Trajectory模块中,统一使用不带时区的timestamp类型,并使用interval类型辅助计算。timestamp类型一般通过字符串样式(例如2000-01-01 10:00:00)表示,常见操作如下:

-- 创建时间类型
SELECT '2000-01-01 10:00:00'::timestamp;

-- 从Unix时间戳创建时间类型(需安装ganos_trajectory插件)
SELECT ST_UnixEpochToTS(1649765331);

-- 将时间类型转换为Unix时间戳
SELECT ST_TsToUnixEpoch('2022-04-12 12:08:51');

-- 利用interval类型计算时间的加减法
SELECT '2000-01-01 10:00:00'::timestamp + '30 day'::interval;
SELECT '2000-01-01 10:00:00'::timestamp - '1 month'::interval;

Ganos的几何类型

Ganos几何类型Geometry可以表示二维和三维的点、线、多边形等各类空间几何对象。其兼容PostGIS的接口。在Ganos Trajectory中,支持在轨迹类型和几何类型之间执行多种空间计算。

-- 构造一个点(2,4)
SELECT 'POINT(2 4)'::geometry;

-- 构造一个折线(2,4)->(0,0)->(5,3)
SELECT 'LINESTRING(2 4, 0 0, 5 3)';

-- 构造一个多边形。这里是一个三角形,三个顶点分别为(3,3),(2,2),(5,5)
SELECT 'POLYGON(3 3, 5 5, 2 2, 3 3)';

-- 构造一个以(0,1)为中心,半径为3的圆,不过是用多边形近似的。通常来说,我们在执行和圆相交的查询时,会使用ST_DistanceWithin等函数,而不会使用ST_Buffer函数。
SELECT ST_Buffer('POINT(0 1)', 3);

在一般的二维空间中,可以直接使用上述的操作;而对于地理上的经纬度坐标,当我们计算两点间的距离时,直接应用欧式距离是不合适的,而是需要计算两点在地表椭球面上的距离,并且有时需要以米为单位进行距离度量。对于经纬度坐标,我们通常设置SRID为4326, 即WGS84的投影坐标,方式如下

-- 构造一个点(2,4)
SELECT 'SRID=4326;POINT(2 4)'::geometry;

-- 构造一个折线(2,4)->(0,0)->(5,3)
SELECT 'SRID=4326;LINESTRING(2 4, 0 0, 5 3)';

-- 构造一个多边形。这里是一个三角形,三个顶点分别为(3,3),(2,2),(5,5)
SELECT 'SRID=4326;POLYGON(3 3, 5 5, 2 2, 3 3)';

-- 构造一个以(0,1)为中心,半径为3的圆,不过是用多边形近似的。通常来说,我们在执行和圆相交的查询时,会使用ST_DistanceWithin等函数,而不会使用ST_Buffer函数。
SELECT ST_SetSRID(ST_Buffer('POINT(0 1)', 3),4326);

在不同投影坐标系下,点的坐标也可能不同。一个常用的操作是将经纬度坐标转换成局部的以米为单位的坐标,方便距离计算:

-- 转为EPSG:3857,即谷歌的墨卡托坐标系,以米为单位。常用于地图应用
SELECT ST_Transform('SRID=4326;POINT(114 39)'::geometry, 3857);

-- 转为EPSG:4479,即在中国附近更加准确的Gauss Kruger投影
SELECT ST_Transform('SRID=4326;POINT(114 39)'::geometry, 4479);