两个或更多轨迹之间的相似性


11

我有卡车的数据(http://www.chorochronos.org/)。

该数据是雅典卡车的多个轨迹的gps坐标。

我必须计算轨迹之间的相似度,才能删除非常相似的轨迹!

问题:

红色和绿色相似,但是蓝色,黑色和(红色或绿色)是不同的轨迹。我要删除相似的红色或绿色之一。

数据以点(几何,纬度和经度,x和y)(坐标gps)为单位,图像是轨迹的示例


1
如果红色和绿色相似,绿色和黑色相似,但红色和黑色不相似怎么办?另外,如何定义“相似”-它是线的一部分落在另一条线的距离内还是其他度量?
韧皮部2014年

我只想保留与其他轨迹不同的轨迹。轨迹是gps坐标,而不是线...
user2883056 2014年

1
您具有用于postgispostgresql的标签,但在问题正文中均未提及。尽管标记很重要,但如果您使用的是这些产品,我强烈建议您将它们记录在问题的正文中,因为在浏览标题后,这将是您所关注的部分。
PolyGeo

2
我同意@phloem-关键问题是“您如何定义相似词”?所有路线均来自AB,因此从某种意义上说它们“相似”。您需要提供有关如何评估成功结果的更多信息
Stephen Lead

Answers:


10

一个非常简单但并非理想的方法是获取每个组合之间的Hausdorff距离,这是通过ST_HausdorffDistance函数完成的。使用您图中的近似LineStrings,它们全部显示为蓝色,并且一对线之一的Hausdorff距离显示为红色:

Hausdorff距离

然后查询以降序对6个组合进行排序:

WITH data AS (
  SELECT 'blue' AS name, 'LINESTRING (60 200, 110 290, 200 320, 330 320, 430 240, 450 200)'::geometry AS geom
  UNION SELECT 'black', 'LINESTRING (60 200, 120 270, 235 297, 295 207, 450 200)'::geometry
  UNION SELECT 'green', 'LINESTRING (60 200, 280 190, 450 200)'::geometry
  UNION SELECT 'red', 'LINESTRING (60 200, 150 210, 257 195, 360 210, 430 190, 450 200)'::geometry)
SELECT a.name || ' <-> ' || b.name AS compare, ST_HausdorffDistance(a.geom, b.geom)
FROM data a, data b WHERE a.name < b.name
ORDER BY ST_HausdorffDistance(a.geom, b.geom) DESC;

     compare     | st_hausdorffdistance
-----------------+----------------------
 blue <-> green  |                  130
 blue <-> red    |                  125
 black <-> blue  |     110.102502131467
 black <-> green |     104.846289061163
 black <-> red   |     97.9580173908678
 green <-> red   |     15.2677257073823
(6 rows)

因此,此示例在此示例中效果很好,但是对于将线进行聚类而言,它并不是一种出色的技术,因为这是唯一的度量标准,它是距离最大的单个点,而不是比较完整线的差异。有很多更好的方法,但是它们会更复杂。


好答案。我可能会使用类似ST_Interpolate点的方法,然后作为幼稚的方法计算每组相关点的平均距离。通过更好的方法您有什么想法?
约翰·鲍威尔

1
@JohnBarça更好的方法是比较每条线的覆盖范围的空间统计信息。一种方法是对每条线进行栅格化,对栅格进行高斯模糊处理,然后根据每种组合确定重合的栅格值的相关性。基于ST_Segmentize和ST_Interpolate工具的方法也可以使用。
Mike T

4

我无权访问PostGres / PostGIS,但是这是我在ArcGIS(或其他)中的处理方式。

  1. 计算原始行到静态列的长度
  2. 根据如何定义“相似”来缓冲行。不要溶解缓冲液。结果缓冲区的FID等于原始行。
  3. 与缓冲区和原始线相交。结果层将标识参与该特定交叉点的FID(例如“ FID_lines”和“ FID_buff”)。
  4. 通过两个原始FID列和原始长度列溶解#3中的图层
  5. 使用定义查询或其他方法忽略两个原始FID列具有相同值的结果行(当然,缓冲并与其自身缓冲区相交的行将完全重叠)。
  6. 添加一个数字列,并用新的长度填充它
  7. 将新长度除以原始长度(进入新列),以得到落入每条附近线缓冲区中的原始线的比率。
  8. 检查比率值。保留那些您定义为“足够相似”的内容。例如,也许一条线在另一条线的缓冲区中占其长度的75%足够相似,也许您的截止点是50%一致,等等。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.