【问题标题】:How to check if lng/lat bounding box intersects with another?如何检查 lng/lat 边界框是否与另一个相交?
【发布时间】:2015-10-15 18:56:43
【问题描述】:

假设我有几个具有 4 个坐标对(仅限长/纬度)的边界框,每个坐标对代表一个方形框的 4 个角。如何检查其中两个框是否相交?

我知道我可以使用 java.awt.Rectangle 检查 2 个矩形是否相交,但问题是它是使用 X/Y/Width/Height 而不是坐标计算的。

有人可以给我一些关于如何进行此计算的指导吗?

谢谢。

编辑

我想要完成的与this library 所代表的相同。

基本上,它会计算给定点周围的正方形边界框,并检查(假想的)正方形是否相互交叉,如下图所示:


(来源:google.com

到目前为止,我已经能够计算出每个标记的角,现在我需要以某种方式检查它们是否相互交叉。我该如何做这个交集计算?

编辑 2

这就是我计算角的方式:

private static double getLatitude(double distance, double lat, double angle) {
    return toDegrees(asin(sin(toRadians(lat)) * cos(distance / RADIUS) + cos(toRadians(lat)) * sin(distance / RADIUS) * cos(toRadians(angle))));
}

private static double getLongitude(double distance, double lat, double lng, double angle) {
    double newLat = getLatitude(distance, lat, angle);
    return toDegrees(toRadians(lng) + atan2(sin(toRadians(angle)) * sin(distance / RADIUS) * cos(toRadians(lat)), cos(distance / RADIUS) - sin(toRadians(lat)) * sin(toRadians(newLat))));
}

其中 RADIUS = 6378.1,角度 = 45/135/225/315(右上角、右下角、左下角和左上角)。

Example output

【问题讨论】:

  • 你的代码在哪里?
  • 到目前为止,我只编写了边界框生成,它给了我四个角坐标。我不知道如何从这里继续,所以我没有编码交叉部分。
  • 到目前为止太宽泛了。
  • 我添加了另一个解释,看看它是否能更好地解释我的需要。
  • 请记住,如何定义“相交”会有所不同。球体的表面上没有直线,因此如果您将矩形的线定义为在纬度/经度空间中是“直的”,它们在现实生活中实际上是弯曲的。所以盒子是否相交取决于你如何解释这些曲线。

标签: java


【解决方案1】:

我假设在您的“纬度/经度边界框”中,每一边都遵循恒定经度和纬度线 - 换句话说,顶部遵循恒定纬度线,左侧遵循恒定纬度线经度。

虽然这实际上不是现实生活中的矩形,但实际上可以将其视为我们的目的。从数学上讲,您可以将其视为将边界框转换为“纬度/经度”空间,其中形状实际上是一个矩形。如果这没有意义,您可能不得不相信我的话。无论如何它当且仅当矩形在弯曲空间中相交时,才有可能证明真实空间中的弯曲形状相交。

简短的版本是:如果你对矩形的交集进行标准测试(使用 Java Rectangle 类代码,并使用纬度和经度作为矩形边界)你会得到正确的结果。

示例

您有两个区域,定义为:

  1. 北纬 50 到 52 度和东经 75 到 77 度之间的区域
  2. 北纬 51 到 53 度和东经 76 到 79 度之间的区域

您可以通过以下方式正确测试它们的交集:

Rectangle r1 = new Rectangle(75,50,2,2);
Rectangle r2 = new Rectangle(76,51,2,3);
boolean intersects = r1.insersects(r2);

矩形在欧几里得空间中不是矩形并不重要。

附:如果您的一个矩形实际上包含北极或南极,这将不起作用。在这种情况下,您需要将每个矩形一分为二,在杆的每一侧各一个。您需要将所有内容标准化为 +/- 90 纬度和 +/- 180 经度。如果一个或多个矩形与 +/-180 经线重叠,您将需要做一些聪明的事情。

【讨论】:

  • 我可以假设边界是 topLeft long 和 bottomRight lat 吗? Width 和 Height 应该是 topLeft/topRight 之间的半角距离?
  • 上下应为纬度,左右应为经度。宽度和高度都应该以度为单位。
  • 好的,有道理。如何获得递减的宽度/高度?是半正弦边界距离吗?
  • 不,只是 lat2-lat1 和 long2-long1。
  • 如何在纬度/经度之间进行选择以传递给 Rectangle 类?比如,你为什么在第一个 Rectangle 上选择 75 而不是 77?或者我可以选择其中任何一个,因为我也传递了高度和宽度?
猜你喜欢
  • 2011-07-23
  • 1970-01-01
  • 2013-04-13
  • 1970-01-01
  • 2018-03-09
  • 2015-07-13
  • 2016-08-16
  • 2023-03-14
  • 2023-03-29
相关资源
最近更新 更多