参考的文章是周到的。不过,我相信是一个“简单而优雅”的解决方案:对地理数据集,有两种包围盒。那些不跨越+ -180子午线的子午线可以像往常一样存储和搜索。跨越+ -180子午线的子午线可以以半互补形式存储:即,像往常一样存储纬度范围,但存储框内未包含的经度范围(并切换一点以指示哪种形式的存储空间)。基本上不需要修改地理索引或搜索树结构;搜索算法只需要稍作修改。
无论如何,这是问题本身的解决方案。
我假设您期望输入是一系列边界框描述符((LLx,LLy),(URx,URy)),其中:
对于输出,您需要包含所有输入的并集的最小边界框的参数。
显然,最小边界框(MBR)的y限制将是y值的最小值和最大值。对于x极限,使用扫线来找到最大的间隙。
这是算法的说明。为了说明这一点,假设输入由四个框组成,
((-81,-16),(-77,80)),
((77,-19),(156,5)),
((-149,-45),(-90,81)),
((-69,-85),(-36,-76))
这是第一个框(红色)和MBR(黑色),然后是前两个,然后是前三个,然后是所有框的方框图。
请注意,在第二步中,东半球和西半球的框如何被跨过+ -180度子午线的MBR包围,从而使其在此地图上显示为两个单独的框。在最后一步,MBR必须向东扩展,以容纳南美和南极洲之间的一个小盒子。
提取框的所有x坐标,对它们进行模360运算(将它们放在-180..180范围内),对它们进行升序排序,然后将第一个值(增量为360度)附加到末尾以使它们环绕周围:
-149, -90, -81, -77, -69, -36, 77, 156, 211
(请注意,211和-149是相同的子午线。)
将每个x坐标视为代表前一个坐标(但不包括该前一个值)与其之间的间隔。例如,-77表示从-81到-77的所有值,但不包括-81。对于第一个之后的每一个,计算包含该间隔的框数。
1, 0, 1, 0, 1, 0, 1, 0
例如,第一个“ 1”表示一个框覆盖从-149到-90的间隔。(这是第三个方框。)
作为一种优化,您可以在找到覆盖x间隔的任何框后立即停止计数,然后继续进行下一个x间隔。我们仅试图确定哪些间隔可能未包含在任何框内。
计算(1)中排序的x坐标的第一差。
59, 9, 4, 8, 33, 113, 79, 55
将它们与(2)中的覆盖率计数匹配。查找其coverage计数为0的最大差。在这里,它等于113
前一个数组的第六个元素。 这是盒子集合留下的最大经度差距。
(有趣的是,最大值出现在多个位置的可能性表明解决方案不一定是唯一的!一组盒子可以有多个MBR。您可以通过添加其他条件来定义唯一的盒子,例如要求MBR到+ -180子午线的平均距离应尽可能大;要解决平局,请选择(例如)最东边的解决方案。)
找到相应的间隔:在这里,它是从-36到77。这是不在 MBR中的经度范围。因此,取其补码范围为-180到180。在这里,补码是两个不相交的间隔,一个从-180到-36,另一个从77到180。 -180度子午线:此处从-283到-36(或等效地从77到324)。
y值的最小值和最大值用于MBR的拐角。
((-283, -85), (-36, 81))