如何计算经纬度的多层边界框?


11

我正在编写一个用于测试各种地图服务(主要是AGS 9.x,AGS 10和WMS 1.x)的应用程序。

该应用程序的一部分涉及在服务的整个范围内为单个请求生成随机边界框。当已知服务的全部范围时(例如,通过AGS服务的fullExtent属性),此部分可以很好地用于地理坐标系和投影坐标系。

我的问题是WMS:GetCapabilities响应中的每一层都可以在> = 1个CRS中定义其边界区域。应用程序的某些部分需要知道服务的CRS是地理的还是投影的,因此为了消除WMS中的歧义,我始终使用始终在EPSG:4326中定义的图层的LatLonBoundingBox。然后,我必须根据进入单个请求(随机化)的所有层来计算完整的服务边界框。这是棘手的地方。

我迷路了,因为对于每个纬度/经度边界框,LLx(左下经度)可能大于或小于URx(右上经度),具体取决于它跨越的子午线。每次我开始绘制方形或圆形图时,我都会想出一种方法,然后找到一个破坏它的案例,然后我的大脑变得糊涂。

我将继续努力,直到它起作用为止,如果我在此处发布了解决方案,但我敢肯定,必须有一种公认的且经过充分测试的方法,这将使我的生活更轻松。我只是现在找不到。


好的,所以在本文中:stonybrook.edu/libmap/coordinates/seriesa/no2/a2.htm(“全局陷阱”部分)我读到“不幸的是,没有简单而优雅的解决方案可以解决全局陷阱”。我正在考虑扫描所有图层范围,并且如果URx <LLx只是将范围设置为-180 +180。同一篇文章建议大多数GIS将具有这些坐标的多边形分成两个单独的要素。
tomfumb

搜索引擎还有其他一些关键字,因为我再一次找不到这个出色的帖子:最小边界框,合并多个边界框,国际日期线,不连续性,最小圆弧段
letmaik 2015年

Answers:


6

参考的文章是周到的。不过,我相信一个“简单而优雅”的解决方案:对地理数据集,有两种包围盒。那些不跨越+ -180子午线的子午线可以像往常一样存储和搜索。跨越+ -180子午线的子午线可以以半互补形式存储:即,像往常一样存储纬度范围,但存储框内包含的经度范围(并切换一点以指示哪种形式的存储空间)。基本上不需要修改地理索引或搜索树结构;搜索算法只需要稍作修改。

无论如何,这是问题本身的解决方案。


我假设您期望输入是一系列边界框描述符((LLx,LLy),(URx,URy)),其中:

  • -540 <= LLx,-180 <= URx,LLx <= 180和URx <=180。同样-90 <= LLy <= URy <= 90。

  • 当且仅当(经度,纬度)=(x,y)处的点被认为位于BB内

    1. LLy <= y <= URy和

    2. 任一 LLX <= X <= URX LLX - 360 <= X <= URX。

对于输出,您需要包含所有输入的并集的最小边界框的参数。

显然,最小边界框(MBR)的y限制将是y值的最小值和最大值。对于x极限,使用扫线来找到最大的间隙

这是算法的说明。为了说明这一点,假设输入由四个框组成,

((-81,-16),(-77,80)),
((77,-19),(156,5)),
((-149,-45),(-90,81)),
((-69,-85),(-36,-76))

这是第一个框(红色)和MBR(黑色),然后是前两个,然后是前三个,然后是所有框的方框图。

在此处输入图片说明

请注意,在第二步中,东半球和西半球的框如何被跨过+ -180度子午线的MBR包围,从而使其在此地图上显示为两个单独的框。在最后一步,MBR必须向东扩展,以容纳南美和南极洲之间的一个小盒子。

  1. 提取框的所有x坐标,对它们进行模360运算(将它们放在-180..180范围内),对它们进行升序排序,然后将第一个值(增量为360度)附加到末尾以使它们环绕周围:

    -149, -90, -81, -77, -69, -36, 77, 156, 211
    

    (请注意,211和-149是相同的子午线。)

  2. 将每个x坐标视为代表前一个坐标(但不包括该前一个值)与其之间的间隔。例如,-77表示从-81到-77的所有值,但不包括-81。对于第一个之后的每一个,计算包含该间隔的框数。

    1, 0, 1, 0, 1, 0, 1, 0
    

    例如,第一个“ 1”表示一个框覆盖从-149到-90的间隔。(这是第三个方框。)

    作为一种优化,您可以在找到覆盖x间隔的任何框后立即停止计数,然后继续进行下一个x间隔。我们仅试图确定哪些间隔可能包含在任何框内。

  3. 计算(1)中排序的x坐标的第一差。

     59, 9, 4, 8, 33, 113, 79, 55
    

    将它们与(2)中的覆盖率计数匹配。查找其coverage计数为0的最大差。在这里,它等于113前一个数组的第六个元素。 这是盒子集合留下的最大经度差距。

    (有趣的是,最大值出现在多个位置的可能性表明解决方案不一定是唯一的!一组盒子可以有多个MBR。您可以通过添加其他条件来定义唯一的盒子,例如要求MBR到+ -180子午线的平均距离应尽可能大;要解决平局,请选择(例如)最东边的解决方案。)

  4. 找到相应的间隔:在这里,它是从-36到77。这是不在 MBR中的经度范围。因此,取其补码范围为-180到180。在这里,补码是两个不相交的间隔,一个从-180到-36,另一个从77到180。 -180度子午线:此处从-283到-36(或等效地从77到324)。

  5. y值的最小值和最大值用于MBR的拐角。

    ((-283, -85), (-36, 81))
    

在第4点的最后一句话中,为什么要写“从-283到-36”。为什么不是77到-36?
letmaik 2014年

1
@neo因为“ 77到-36”是一个空的间隔。(根据定义,区间[a,b]由所有数字x组成,使得a <= x <= b。对于a = 77和b = -36,则没有这样的数字。) ,就经度而言,77到-36完全清楚。” 问题在于它不是:它将从77上升到180 = -180并继续上升到-36,还是会从77 下降到-36?为了避免这种歧义,我选择要小心。
ub

我对您的答案进行了快速实施(请参见gist)。为了检查一个盒子是否包含一个间隔,我不得不解开盒子的经度,否则,它对于穿越不连续性的盒子将不起作用。作为新手,这对我来说并不完全
清楚
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.