0

我有两个 GPS 位置。对于每一个我都在不同的范围内创建一个边界框。每个边界框都有最小/最大纬度和最小/最大经度。

需要实现一种方法来检测这两个框是否重叠(不要介意重叠范围......只有真/假)。此外,此方法将集成在一个长循环中,因此我正在寻找最有效的方法。

注意:当说重叠时,我的意思是-“地图上至少有一个点包含在两个边界框中”。

有任何想法吗?

4

2 回答 2

4

我面临同样的问题,以前的解决方案还不够。

此图显示了涵盖和未涵盖的案例

我发现这个网页给出了解决问题的正确方法:https ://rbrundritt.wordpress.com/2009/10/03/determining-if-two-bounding-boxes-overlap/ 这是实现这个解决方案:

函数 DoBoundingBoxesIntersect(bb1, bb2) {

            //First bounding box, top left corner, bottom right corner
            var ATLx = bb1.TopLeftLatLong.Longitude;
            var ATLy = bb1.TopLeftLatLong.Latitude;
            var ABRx = bb1.BottomRightLatLong.Longitude;
            var ABRy = bb1.BottomRightLatLong.Latitude;

            //Second bounding box, top left corner, bottom right corner
            var BTLx = bb2.TopLeftLatLong.Longitude;
            var BTLy = bb2.TopLeftLatLong.Latitude;
            var BBRx = bb2.BottomRightLatLong.Longitude;
            var BBRy = bb2.BottomRightLatLong.Latitude;

            var rabx = Math.abs(ATLx + ABRx – BTLx – BBRx);
            var raby = Math.abs(ATLy + ABRy – BTLy – BBRy);

            //rAx + rBx
            var raxPrbx = ABRx – ATLx + BBRx – BTLx;

            //rAy + rBy
            var rayPrby = ATLy – ABRy + BTLy – BBRy;

            if(rabx <= raxPrbx && raby <= rayPrby)
            {
                            return true;
            }
            return false; 

}

我们可以这样调整解决方案:

  • 第 1 步:检查 2 个边界框是否在经度上重叠

    • Bondingbox1 的左经度在boundingbox2 的longMin 和longMax 之间,或者bondingbox1 的右经度在boundingbox2 的longMin 和longMax 之间
  • 第 2 步:检查 2 个边界框是否在纬度上重叠

    • Bondingbox1 的顶部纬度在 boundingbox2 的 latMin 和 latMax 之间,或者 bondingbox1 的底部经度在 boundingbox2 的 latMin 和 latMax 之间
  • 如果 step1 和 step 2 正确,则 2 boundingbox 重叠

你可以在这里看到相应的草图:

于 2015-09-01T12:16:38.133 回答
0

检查一个矩形的一个角是否在另一个矩形内就足够了。这两个持有是真实的:

  • rect1.minXrect1.maxX 在 rect2.minX 和 rect2.maxX 之间
    并且
  • rect1.minYrect1.maxY 在 rect2.minY 和 rect2.maxY 之间

这个检查应该不需要任何时间,所以效率不是问题。此外,参数的顺序无关紧要。

于 2012-10-22T16:13:08.277 回答