线串之间的相似性

时间:2008-09-15 12:49:02

标签: sql-server algorithm gis

我有一些GPS记录的曲目,更正式地可以描述为多个线串。

现在,一些录制的曲目可能是同一路线的录音,但由于GPS系统的不准确,录音是在不同的场合制作的,而且它们可能是以不同的速度录制的,不会完美匹配,但在人类在地图上查看时仍然看起来足够接近,以确定它实际上是已记录的路线。

我想找到一种计算两个线串之间相似性的算法。我已经提出了一些本土方法来做到这一点,但是想知道这是否已经有一个很好的算法来解决它。

如果相似的方法在地图上表示相同的路径,您将如何计算相似度?

编辑:对于那些不确定我在说什么的人,请查看此链接以获取线字符串的定义:http://msdn.microsoft.com/en-us/library/bb895372.aspx - 我是询问字符串。

6 个答案:

答案 0 :(得分:12)

计算每对曲目上的Fréchet distance。距离可用于衡量曲目的相似性。

数学警报:Fréchet是metric space领域的先驱,与您的问题相关。

答案 1 :(得分:3)

我会根据估计的可能错误在第一行附近添加一个缓冲区,然后确定第二行是否完全适合缓冲区。

答案 2 :(得分:2)

要确定“相同路线”,请创建最小的归一化路径向量集,计算总功率差异并将总量与质量度量进行比较。

  1. 在总路径长度上标准化GPS航路点,
  2. 将路径的向量组合在一起,根据每个路点的最短向量为每条路径创建一组新的路径向量,
  3. 计算向量长度加权的归一化路径中每个向量的端点之间的总功率差异,
  4. 与质量指标进行比较。
  5. 在视觉上调整差异的力量(从差异开始,比如平方差异)和质量度量(比如总功率差异的百分比)。该算法产生路径匹配的连续质量测量以及二进制结果(路径是否相同?)

      

    Paul Tomblin说:我会添加一个缓冲区   围绕第一线的基础上   估计可能的错误,然后   确定第二条线是否合适   完全在缓冲区内。

    您可以在比较标准化矢量端点时修改算法。您可以确定是否有任何端点差异超过某个大小(实现Paul的缓冲区构思),或者,如果端点位于“缓冲区”之外,则可以使用该事实忽略该端点差异,从而允许进行比较忽略侧向行程< / em>的

答案 3 :(得分:1)

你可以沿着LineString A的每个点(Pa)走,并测量从Pa到最近的LineString B线段的距离,平均每个距离。

这不是一种快速或完美的方法,但应该能够使用有用的数字并且很快实现。

线条字符串是否在类似的点开始和结束,或者它们是否有不同的范围?

答案 4 :(得分:1)

如果您认为单个线串是[x,y]点(或[x,y,z]点)的序列,那么您可以使用{{3来计算每对线串之间的相似性算法。如引用的维基百科文章中所述,Needleman-Wunsch算法需要“相似性矩阵”,其定义一对点之间的距离。但是,使用函数而不是矩阵很容易。在您的情况下,您可以简单地使用2D Needleman-Wunsch函数(如果您的点具有高程,则使用3D欧几里得函数)来提供每对点之间的距离。

答案 5 :(得分:-2)

我实际上支持那个人(Aaron F),他说你可能对Levenshtein距离问题感兴趣(并引用this)。到目前为止,他的回答在我看来是最好的。

更具体地说,Levenshtein距离(也称为编辑距离)不严格测量逐个字符的距离,但也允许您执行插入和删除。这个距离测量的最佳算法可以在二次时间内计算(如果你的字符串很长,则相当慢),但计算生物学家对此有很好的启发式,这可能是你自己感兴趣的。查看BLASTFASTA

在您的问题中,您似乎正在处理数字字符串之间的差异,并且您关心数字。如果您提供更多信息,我可能会将您引导至BLAST / FASTA / etc的正确变体。无论如何,您可以考虑根据自己的需要调整BLAST和FASTA。他们很简单。

1http://en.wikipedia.org/wiki/Levenshtein_distancehttp://www.nist.gov/dads/HTML/Levenshtein.html