如何将路线坐标数组划分为相等距离的部分?

时间:2019-01-04 02:31:45

标签: ios swift google-maps coordinates google-polyline

我正在使用iOS应用上的Google Maps API。 我在A点和B点之间有一条路线, 该路由被编码为String, 我已经解码为坐标数组,实际上是从中创建路线的。

现在出现了问题: 我需要以某种方式划分这条路线,即让我获取点的坐标,这些点彼此相距给定距离(例如20公里)。 我知道点在距离上不是规则的,所以它必须为+/- 20 km,这取决于路段中点的密度。 例如:

let decodedPolylinePoints = 
[(22.3456, 23.3232), (32.3232, 32.3332), (33.4555,34.466), ….]

然后经过计算,结果是一个数组,其中下一个元素彼此相距+/- 20km。

有什么想法吗? 我正在实施Swift应用,但是语言可以自由选择。一切都与算法有关。

route with all coordinate markers

screen of route with zoomed points

1 个答案:

答案 0 :(得分:1)

假设您希望点到点距离的总和相同:

将元组数组转换为CLLocation对象的数组。

将CLLocation对象的数组映射到结构数组,其中每个结构都包含一对点(AB,BC,CD,DE等)的起点和终点以及这些点之间的计算距离(使用CLLocation distance(from:)方法。)将其称为Segment

定义类型PolyLine,它是Segment对象的数组。

现在定义一个类型为PolyLine的数组的类型。 (将Polyline s的数组称为Route

实例化一个空的Route变量(trip)。 (var trip = Route()) 创建一个空的PolyLine变量currentPolyLine。 ({var currentPolyLine = Polyline()。)

现在循环遍历细分的大型源数组。如果当前折线中的距离之和加上新线段的总和小于或等于所需阈值,则将该线段添加到currentPolyLine中。如果新的线段会使当前的PolyLine太长,请将currentPolyLine添加到Route,清空currentPolyLine并将其替换为新的线段。当Segment用完时,请将最后剩余的PolyLine添加到Route

这将为您提供一系列折线,这些折线≤所需的距离。最后一条折线可能比其余所有折线短。

如果您想接受PolyLines,该距离可能比您想要的距离长一点或短一点,它将变得更加复杂。

假设您的Segment足够短,并且您想要的PolyLine的距离足够长,那么您应该获得PolyLine左右的长度。随着您最长的Segment长度越来越接近您的PolyLine长度,PolyLine长度的变化会越来越大。