我有一个网页,我正在使用谷歌地图。当用户拖动地图并放手时,我需要向服务器查询落在地图可见区域范围内的所有数据点。我可以通过javascript API轻松获得地图可见区域的东北和西南坐标,基本上提供了一个边界矩形。但是在服务器上,我依赖的是一个数据库,其地理查询API仅支持中心点和半径形式的查询。基本上我想要做的是找出至少包含东北和西南点所需的最小半径圆。
我想到的最简单的算法包括找到NE和SW坐标之间的中心点,然后测量半径作为从中心点到NE或SW坐标的距离。在一个简单的欧几里德空间里,我会很自在地做到这一点,但我想我可能会对地球的非平面坐标系统出错。我甚至没有能够说服自己,如果我知道中心点,中心和NE以及中心和SW之间的距离是相同的。
我遇到了平面2D表面上最小圆圈的算法,以及描述相反的算法,即圆心和半径的边界框。虽然我没有遇到这个特殊问题的简明算法。
答案 0 :(得分:1)
我认为你所谓的东西和南北坐标是经度和纬度。您可以将它们转换为笛卡尔坐标点,并找到您所在地区边缘点之间的中点。这将在地球表面下方产生一个C'点,其纬度和经度与中心点C相同。(这只适用于经度差小于180°的情况;否则您将得到一个点地球的另一侧,但具有相同的纬度。)如果您的中心点需要笛卡尔坐标,您可以通过调整半径来将C'投影到曲面上以找到新的中心点。
可以使用great-circle disnatce公式计算地球表面上两点之间的距离。
如果假设地球是半径为R = 6373 km的完美球体,则转换很容易:
x = R * cos(lat) * cos(lon)
y = R * cos(lat) * sin(lon)
z = R * sin(lat)
并返回:
lon = atan2(y, x)
lat = atan2(z, r) with r = sqrt(x*x + y*y)
(但是地球没有恒定的半径,所以你可能想要使用更好的坐标系,如ECEF中所述,如果你需要更高的精度,可能需要this answer。)
我的第一个想法是根据经度和纬度找到你的中点,如果你照顾wrapping纬度,这应该没问题。然后根据great-circle公式计算距离。但如果您的地图区域包含一个极点,那么平均经度和纬度似乎并不合理。