【问题标题】:Given coordinates on a globe, calculate a rectangular bounding box给定地球上的坐标,计算一个矩形边界框
【发布时间】:2019-11-12 10:13:02
【问题描述】:

我在地球表面有一组n 地理坐标,我想计算一个边界框(找到最东、最西、最北和最南的位置)而不后退到用户输入(程序没有 UI)。天真的方法是“完成纬度的最大值和最小值,经度的最大值和最小值” - 但是当集合跨越第 180 条子午线时,这显然会返回次优结果(参见例如斐济的类似情况:https://www.openstreetmap.org/relation/571747#map=2/-16.6/0.0 不应该缩小到整个星球,因为两半实际上是相邻的)。

这是在多种解决方案中承认,例如在 Algorithm for determining minimum bounding rectangle for collection of latitude/longitude coordinates 中,但没有解决。

什么没用:

  • 检查其他人如何做到这一点(传单也有同样的问题,见上文)
  • 枚举陷阱(例如“如果其中一个坐标接近 180 度子午线”)- 不适用于边界框穿过但不靠近 IDL 的点(例如日本和夏威夷)
  • 遍历坐标并标记是否超过 180(取决于排序)

【问题讨论】:

  • 我真的不需要任何特定编程语言的解决方案:因为这是一种空间算法,无论语言细节如何,都应该可以轻松计算。

标签: geospatial


【解决方案1】:

我认为这里有一条简单的路径。我只会考虑经度,因为纬度不会引起任何问题。该解决方案提供了 O(NlogN)(由于排序)解决方案,这意味着它比仅检查最小值和最大值要慢,但在大多数机器上运行它并且大多数编程语言少于 10^5 点应该不超过几秒钟

很明显,从数学的角度来看,边界有多种解决方案,因为经度值可以取模 360。

正如我们在上面的示例图片中看到的那样。最佳选择是绿色框,因为它尺寸最小并且包含所有点。

找到包含所有点的最小盒子与找到不包含点的最大盒子是相同的问题

所以在这个简单的图像中,我们需要找到 D 的两个极端点

求D(及相关点)的算法需要对点进行经度排序,因此在两个连续排序点之间肯定不会有其他点;所以我们可以检查它们之间的距离(以及最后一个)。这里有一些伪代码

Let C = your set of points
Let N = length( C )
Let S = sort( C )
Let maximumDistance = 0
Let easternLongitudeForBoundingBox = undefined
Let westernLongitudeForBoundingBox = undefined
for i = 0 to N-1 :
   Let j = (i + 1) modulo N    # The index of the point "after" point(i)
   Let D = (S[j].longitude - S[i].longitude ) modulo 360
   if (D > maximumDistance) :
      maximumDistance = D
      easternLongitudeForBoundingBox = S[i].longitude
      westernLongitudeForBoundingBox = S[j].longitude

这完全未经测试,但如果我没有犯错,它应该可以工作。

警告:当我使用“模”时,它是真正的数学运算符。在某些计算机语言中,(a - b) modulo 360 应该写成(360 + a - b) % 360 以给出正确的结果,因为他们认为-1 % 360 == -1 在这里会给出不正确的结果。)

【讨论】:

    【解决方案2】:

    https://leafletjs.com/reference-1.5.0.html#latlngbounds 的传单文档指出:

    注意:如果该区域穿过反子午线(通常与 国际日期变更线),您必须指定 [-180, 180] 度经度范围。

    因此,例如,如果您想要一个跨越 40° 到 60° 纬度并跨越从 -160° 到 160° 经度的反子午线的区域,您似乎需要使用像 @ 这样的角来指定该区域的边界987654322@或[40,-160], [60,-200]。

    【讨论】:

    • 好吧,如果我手动设置坐标,“那么不要那样做”会有些用处。但是,我需要计算这个,即以编程方式确定边界框。感谢您的努力...
    • 也许我遗漏了一些东西,但似乎如果程序知道坐标,它可以检查跨越 IDL 的条件并通过添加或减去 360 到其中之一来计算可行的坐标经度坐标。我很天真,我敢肯定。祝你好运。
    • 这就是重点。 如何我发现边界框更适合 180° 而不是不适合?我的意思是,作为人类,有直观的“观察和观察”,但我很难将其形式化为算法。
    猜你喜欢
    • 2010-10-11
    • 2012-08-25
    • 1970-01-01
    • 2019-01-05
    • 2012-04-15
    • 1970-01-01
    • 2021-02-20
    • 1970-01-01
    • 2013-03-12
    相关资源
    最近更新 更多