如何在多边形 OpenLayer 内构建路线
How to build a route inside a polygon OpenLayer
我使用 OpeenStreetMap 和 OpenLayers 库,我需要像在任务规划程序中一样在多边形内构建一条路线,这里 https://www.youtube.com/watch?v=MhHomssqD7k&ab_channel=AeroHawk 在 2 分钟后你可以看到多边形内部如何用红色线段标记,该程序会自动构建一条路线。我怎样才能复制这个?这是什么算法?
mission planer
我看到你说的是在多边形内生成无人机飞行路径,计算航路点的位置。
非常有趣的挑战!我会用文字写出算法的工作原理,但在 javascript 中这样做也很有趣!
对于给定的(可调整的)方向角度应该可以做到这一点,但我建议您可以通过假设无人机在正好东 <-> 西的方向上飞行来简化事情。
这也意味着起点只是多边形的最北角,即纬度最大的顶点(给定一个北边如图所示的多边形,两个顶点中的哪一个并不重要角是起点)。同样,最终路径点也很简单。多边形的最南角。
我们需要计算其间的所有 waypoints。左侧和右侧的一系列位置可创建此阶梯效果。或许您希望首先构建代表左侧和右侧的两条线(或角点的有序数组)。该算法需要沿着这些边“走”下去,因此保持 lastLeft
和 lastRight
点,它们都初始化到它们的行的开头。对于这两条线,这是顶部的起点。
沿着一条线的每个“走步”都涉及一些计算 (sub-function!)。它们将是无人机通道之间配置的“间隙”。这个delta-latitude会在这个时候用到。对于每个步行步骤,我们都从最后一个点(lastLeft 或 lastRight)开始,因此我们有一个目标纬度。 targetLat = lastLeft.lat - gap
。在一个循环中,我们可以走到线的下一个点(原始多边形的角),如果它位于间隙内,即该点的纬度 > targetLat。另一个极端情况是下一个点实际上是终点(休息!我们完成了!)。但除此之外,我们还有一条边穿过 targetLat。我们进行几何计算以找到沿边缘穿过 targetLat* 的点。那个点就是我们的下一个路点!
*几何计算以找到沿具有 targetLat 的直线上的点?可能这部分是 do-able 和 TurfJS 之类的东西,尽管我不能确切地告诉你哪个库调用。但是在计算出算法的其余部分后,我个人可能只是直接使用代码线性数学。您已经知道线的起点和终点,因此已知梯度。将其应用于已知的 delta-lat 以找到 delta-lon.
我们需要按照“走步”的算法,沿着左边的线走,然后沿着右边的线走,然后沿着右边的线走,然后沿着左边的线走,生成阶梯形的一系列路点到为止!
我使用 OpeenStreetMap 和 OpenLayers 库,我需要像在任务规划程序中一样在多边形内构建一条路线,这里 https://www.youtube.com/watch?v=MhHomssqD7k&ab_channel=AeroHawk 在 2 分钟后你可以看到多边形内部如何用红色线段标记,该程序会自动构建一条路线。我怎样才能复制这个?这是什么算法?
mission planer
我看到你说的是在多边形内生成无人机飞行路径,计算航路点的位置。
非常有趣的挑战!我会用文字写出算法的工作原理,但在 javascript 中这样做也很有趣!
对于给定的(可调整的)方向角度应该可以做到这一点,但我建议您可以通过假设无人机在正好东 <-> 西的方向上飞行来简化事情。
这也意味着起点只是多边形的最北角,即纬度最大的顶点(给定一个北边如图所示的多边形,两个顶点中的哪一个并不重要角是起点)。同样,最终路径点也很简单。多边形的最南角。
我们需要计算其间的所有 waypoints。左侧和右侧的一系列位置可创建此阶梯效果。或许您希望首先构建代表左侧和右侧的两条线(或角点的有序数组)。该算法需要沿着这些边“走”下去,因此保持 lastLeft
和 lastRight
点,它们都初始化到它们的行的开头。对于这两条线,这是顶部的起点。
沿着一条线的每个“走步”都涉及一些计算 (sub-function!)。它们将是无人机通道之间配置的“间隙”。这个delta-latitude会在这个时候用到。对于每个步行步骤,我们都从最后一个点(lastLeft 或 lastRight)开始,因此我们有一个目标纬度。 targetLat = lastLeft.lat - gap
。在一个循环中,我们可以走到线的下一个点(原始多边形的角),如果它位于间隙内,即该点的纬度 > targetLat。另一个极端情况是下一个点实际上是终点(休息!我们完成了!)。但除此之外,我们还有一条边穿过 targetLat。我们进行几何计算以找到沿边缘穿过 targetLat* 的点。那个点就是我们的下一个路点!
*几何计算以找到沿具有 targetLat 的直线上的点?可能这部分是 do-able 和 TurfJS 之类的东西,尽管我不能确切地告诉你哪个库调用。但是在计算出算法的其余部分后,我个人可能只是直接使用代码线性数学。您已经知道线的起点和终点,因此已知梯度。将其应用于已知的 delta-lat 以找到 delta-lon.
我们需要按照“走步”的算法,沿着左边的线走,然后沿着右边的线走,然后沿着右边的线走,然后沿着左边的线走,生成阶梯形的一系列路点到为止!