我正在使用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应用,但是语言可以自由选择。一切都与算法有关。
答案 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
长度的变化会越来越大。