如何将路线坐标数组划分为等距部分?
How to divide array of route coordinates, to equal distance parts?
我正在 iOS 应用程序上使用 Google 地图 API。
我在 A 点和 B 点之间有一条路线,
该路由被编码为 String,它
我已经解码为坐标数组,实际上,路由是从中创建的。
现在问题出现了:
我需要以某种方式划分这条路线,让我得到点的坐标,这些点彼此相距给定的距离,比方说 20 公里。
我知道点在距离上并不规则,所以它必须是 +/- 20 公里,这取决于路段中点的密度。
例如:
let decodedPolylinePoints =
[(22.3456, 23.3232), (32.3232, 32.3332), (33.4555,34.466), ….]
经过计算,结果是一个数组,其中下一个元素彼此相距 +/- 20 公里。
有什么想法吗?
我正在实施 Swift 应用程序,但可以自由选择语言。全靠算法。
route with all coordinate markers
screen of route with zoomed points
假设您希望点对点距离之和相同:
将元组数组转换为 CLLocation
个对象数组。
将 CLLocation 对象数组映射到结构数组,其中每个结构包含一对点(A-B、B-C、C-D、D-E 等)的起点和终点以及这些点之间的计算距离(使用CLLocation distance(from:)
方法。)称其为 Segment
。
定义一个 PolyLine
类型,它是 Segment
个对象的数组。
现在定义一个 PolyLine
数组类型的类型。 (将 Polyline
的数组称为 Route
。
实例化一个空的 Route 变量 (trip
)。 (var trip = Route()
)
创建一个空的 PolyLine
变量 currentPolyLine
。 (var currentPolyLine = Polyline()
.)
现在遍历大段源数组。如果当前多段线的距离总和加上新线段,小于等于您想要的阈值,则将该线段添加到 currentPolyLine
。如果新线段会使当前 PolyLine 太长,则将 currentPolyLine 添加到 Route 中,清空 currentPolyLine 并将其替换为新线段。当您 Segment
中的 运行 时,将最后剩余的 PolyLine
添加到 Route
。
这应该会为您提供一系列 ≤ 所需距离的多段线。最后一条 PolyLine 可能比其他的都短。
如果你想接受 PolyLines
可能比你想要的距离长一点或短一点,它会变得更复杂。
假设您的 Segment
s 足够短,并且您想要的 PolyLine
s 距离足够长,您应该得到大约相同长度的 PolyLine
s。随着你最长的 Segment
长度越来越接近你的 PolyLine
长度,PolyLine
长度的变化会越来越大。
我正在 iOS 应用程序上使用 Google 地图 API。 我在 A 点和 B 点之间有一条路线, 该路由被编码为 String,它 我已经解码为坐标数组,实际上,路由是从中创建的。
现在问题出现了: 我需要以某种方式划分这条路线,让我得到点的坐标,这些点彼此相距给定的距离,比方说 20 公里。 我知道点在距离上并不规则,所以它必须是 +/- 20 公里,这取决于路段中点的密度。 例如:
let decodedPolylinePoints =
[(22.3456, 23.3232), (32.3232, 32.3332), (33.4555,34.466), ….]
经过计算,结果是一个数组,其中下一个元素彼此相距 +/- 20 公里。
有什么想法吗? 我正在实施 Swift 应用程序,但可以自由选择语言。全靠算法。
route with all coordinate markers
screen of route with zoomed points
假设您希望点对点距离之和相同:
将元组数组转换为 CLLocation
个对象数组。
将 CLLocation 对象数组映射到结构数组,其中每个结构包含一对点(A-B、B-C、C-D、D-E 等)的起点和终点以及这些点之间的计算距离(使用CLLocation distance(from:)
方法。)称其为 Segment
。
定义一个 PolyLine
类型,它是 Segment
个对象的数组。
现在定义一个 PolyLine
数组类型的类型。 (将 Polyline
的数组称为 Route
。
实例化一个空的 Route 变量 (trip
)。 (var trip = Route()
)
创建一个空的 PolyLine
变量 currentPolyLine
。 (var currentPolyLine = Polyline()
.)
现在遍历大段源数组。如果当前多段线的距离总和加上新线段,小于等于您想要的阈值,则将该线段添加到 currentPolyLine
。如果新线段会使当前 PolyLine 太长,则将 currentPolyLine 添加到 Route 中,清空 currentPolyLine 并将其替换为新线段。当您 Segment
中的 运行 时,将最后剩余的 PolyLine
添加到 Route
。
这应该会为您提供一系列 ≤ 所需距离的多段线。最后一条 PolyLine 可能比其他的都短。
如果你想接受 PolyLines
可能比你想要的距离长一点或短一点,它会变得更复杂。
假设您的 Segment
s 足够短,并且您想要的 PolyLine
s 距离足够长,您应该得到大约相同长度的 PolyLine
s。随着你最长的 Segment
长度越来越接近你的 PolyLine
长度,PolyLine
长度的变化会越来越大。