将最近点索引从线串提取到给定点?

时间:2015-06-21 19:30:58

标签: java algorithm scala jts

让我们将线串视为点列表,我将其命名为trail。我需要检测哪个点足够接近这条路径。我有另一个称为兴趣点的线串,我需要从trail线串返回最近的索引点。我想提一下这些兴趣点不包含在跟踪线串中,所以我会以某种方式通过给出该兴趣点来评估该跟踪中的索引点。生成的兴趣点将获得路径列表中存在的值。

enter image description here

[编辑]:

我将使用普通数字转换此问题。我发现这很容易。

输入列表[0.5,1,1.5,2,2.5,3,3.5,4,4.5,5]。 输入数量:3.30

我可以很容易地看到conditon:list [n]<数字<列表[N + 1] 然后我可以查看费用:

cost1 = number - list [n] cost2 = list [n + 1] - number。

然后我可以得到N的索引if(cost1< cost2)返回N else返回N + 1.

[重要]:

点对象与数字无法比较,这让我陷入了盲点。

1 个答案:

答案 0 :(得分:1)

如果你只需要这样做一次,或者速度不是很重要,并且你的踪迹不会自行循环,这样检测最近的两个点可能与检测它们之间的线段不同,那很简单。

首先,你需要一个点的距离平方公式(这取代了普通数字的差异):

 def dSq(x0: Double, y0: Double, x1: Double, y1: Double) =
   (x1 - x0)*(x1 - x0) + (y1 - y0)*(y1 - y0)

请注意,除了必须计算额外的平方根之外,使用普通距离超过距离平方没有任何实际优势。 (但请def d(...) = sqrt(dSq(...))随意使用它。)

现在您可以找到从跟踪到目标点的距离:

 val ds = trace.map(p => dSq(target.x, target.y, p.x, p.y))

你找到了成对点之间的距离:

 val pairDs = ds.sliding(2).map(xx => xx(0) + xx(1))

你找到了最小的索引:

 val smallest = pairDs.min
 val index = pairDs.indexWhere(_ == smallest)

然后在原始列表中,这两个点为indexindex+1

或者,您可以找到最接近的单个点,然后通过比较距离来确定您是想要下一个还是上一个点。 (再次注意,所有这些都是不精确的 - 要真正做到这一点,你必须计算点到两点之间的线段的最接近点,这是一个更长的公式。)

如果你必须这么做,那么你想要有一种更快的方法来忽略那些不相关的大距离。一种常见的方法是在跟踪上放置网格,然后在每个网格元素内部进行子跟踪。然后,当给定兴趣点时,首先查找其网格位置,然后在网格内部执行相同的搜索技巧。 (您可能还需要搜索8个相邻的邻居,具体取决于您如何剪切网格内的点。)