计算轨迹或子轨迹的Jaccard相似系数(Jaccard index)。

语法

record ST_JaccardSimilarity(trajectory tr1, trajectory tr2, double tol_dist, 
                            text unit default '{}', interval tol_time default NULL, 
                            timestamp ts default '-infinity', timestamp te default 'infinity') ; 

参数

参数名称 描述
tr1 轨迹对象1。
tr2 轨迹对象2。
tol_dist 空间容差,单位为米。
unit 描述距离计算方式的JSON字符串。
tol_time 时间容差。默认为NULL,当值为NULL或负值时表示只进行空间匹配不考虑时间。
ts 开始时间。默认为-infinity,只关注在起止时间之间的子轨迹。
te 结束时间。默认为infinity,只关注在起止时间之间的子轨迹。

unit参数说明如下。

参数名称 类型 默认值 说明
Projection string 重新投影的目标坐标系。取值:
  • auto:根据经纬度坐标动态选择最合适的坐标系(Lambert Azimuthal、UTM等),并投影到此坐标系进行计算。不需要额外指定Unit,单位为米。
  • srid:需要重投影到的空间参考系ID。
说明 不传本参数时,依照原有坐标系计算。
Unit string null 度量单位。取值:
  • null:即无单位,直接按照轨迹点坐标的欧式距离进行计算。
  • M:按照所在空间参考系基于的单位进行距离计算,通常为米。
useSpheroid bool true 是否使用椭球体计算。当Unit设置为M时,可以指定此项。取值:
  • true:使用椭球体并计算更精确的距离。
  • false:使用球体表示地球并计算近似的距离。

返回参数说明如下。

参数名称 类型 说明
nleaf1 int 轨迹1与轨迹2相交的点数量。
nleaf2 int 轨迹2与轨迹1相交的点数量。
说明nleaf1不一定相同,例如可能轨迹1两次经过轨迹2的同一个点,则nleaf1为1,nleaf2为2。
inter1 int 轨迹1到轨迹2的距离同时满足时间容差和空间容差的点数量。
inter2 int 轨迹2到轨迹1的距离同时满足时间容差和空间容差的点数量。
jaccard_lower double Jaccard距离下限。计算公式:inter/(nleaf1+nleaf2-inter)
说明 inter为inter1inter2中较小的值。
jaccard_upper double Jaccard距离上限。计算公式:inter/(nleaf1+nleaf2-inter)
说明 inter为inter1inter2中较大的值。

描述

两个集合的Jaccard index指两个集合交集的元素数量除以两个集合并集的元素数量。对于两条轨迹,我们扩展了Jaccard index的定义,分别计算在轨迹1与轨迹2相交的点数量,以及在轨迹2上与轨迹1相交的点数量,并通过上文jaccard_lowerjaccard_upper的公式计算距离。

示例

With traj as(
SELECT ST_makeTrajectory('STPOINT'::leaftype, 'SRID=4326;LINESTRING(114.49211 37.97921,114.49211 37.97921,114.49211 37.97921,114.49211 37.97921)'::geometry,
    ARRAY[to_timestamp(1590287775) AT TIME ZONE 'UTC', to_timestamp(1590287778) AT TIME ZONE 'UTC', to_timestamp(1590302169) AT TIME ZONE 'UTC',to_timestamp(1590302171) AT TIME ZONE 'UTC'], '{}') a,
    ST_makeTrajectory('STPOINT'::leaftype, 'SRID=4326;LINESTRING(114.49211 37.97921,114.49211 37.97921,114.49211 37.97921,114.49211 37.97921,114.49145 37.97781,114.49145 37.97781,114.49145 37.97781,114.49145 37.97781,114.49145 37.97781,114.49145 37.97781,114.49145 37.97781,114.49145 37.97781,114.49145 37.97781,114.49145 37.97781,114.49211 37.97921,114.49211 37.97921,114.49211 37.97921,114.49211 37.97921,114.49211 37.97921,114.49211 37.97921)'::geometry,
    ARRAY[ to_timestamp(1590287765) AT TIME ZONE 'UTC', to_timestamp(1590287771) AT TIME ZONE 'UTC', to_timestamp(1590287778) AT TIME ZONE 'UTC', to_timestamp(1590287780) AT TIME ZONE 'UTC', to_timestamp(1590295992) AT TIME ZONE 'UTC', to_timestamp(1590295997) AT TIME ZONE 'UTC', to_timestamp(1590296013) AT TIME ZONE 'UTC', to_timestamp(1590296018) AT TIME ZONE 'UTC',  to_timestamp(1590296025) AT TIME ZONE 'UTC', to_timestamp(1590296032) AT TIME ZONE 'UTC', to_timestamp(1590296055) AT TIME ZONE 'UTC', to_timestamp(1590296073) AT TIME ZONE 'UTC', to_timestamp(1590296081) AT TIME ZONE 'UTC', to_timestamp(1590296081) AT TIME ZONE 'UTC', to_timestamp(1590302169) AT TIME ZONE 'UTC', to_timestamp(1590302174) AT TIME ZONE 'UTC',  to_timestamp(1590302176) AT TIME ZONE 'UTC', to_timestamp(1590302176) AT TIME ZONE 'UTC', to_timestamp(1590302172) AT TIME ZONE 'UTC', to_timestamp(1590302176) AT TIME ZONE 'UTC'],'{}') b
)
select ST_JaccardSimilarity(a,b, 100,'{"unit":"M"}','20 second', '2020-05-23'::timestamptz AT TIME ZONE 'UTC', '2020-05-26'::timestamptz AT TIME ZONE 'UTC') from traj;
       st_jaccardsimilarity        
-----------------------------------
 (4,20,4,10,0.2,0.714285714285714)
(1 row)