如何将两个地图位置组合成一个更准确的位置?

How do I combine two map locations into a more accurate one?

我正在创建一个应用程序,它对高度准确地估计 Android 设备的位置感兴趣。我还需要将此数据发送到代理服务器。

我当前的实现在设备本身上获取 GPS 位置并将其发送到代理。此外,它将Google的GeoLocationAPI所需的数据如wifi接入点发送给服务器,然后服务器调用API获取另一个Location。 GPS Location 和 Geolocation 的形式都是

{
  center: {
    lat: ...,
    lng: ...,
   },
   accuracy: ...
}

这意味着我最终会为一个位置得到两个不同的估计器,每个估计器都有自己的中心和准确度。我的问题如下:

有没有办法将这两个位置组合成一个更准确的位置?理想情况下,我想使用一些 API 接受上面表格中的多个对象和 returns 一个具有新中心且精度值低于提供的位置的对象。如果没有这个API,有人能帮我开发出一个达到预期效果的算法就好了。

由于这些位置估计的是相同的真实位置,因此以某种方式将它们组合起来应该能够产生更好的结果。我无法通过谷歌搜索或阅读带有 google-geolocation.

标记的所有问题的几页来找到答案。

这是一个有点难以分类的问题,它可能更适合 https://stats.stackexchange.com/ 的统计学家。如果是这样,请告诉我,我会在那里回答我的问题。

基本上,您的问题分解为找到包含由地理位置和 GPS 位置给出的两个圆的交点的圆。

为了简单起见,我们将地理定位的纬度称为 x1,将经度称为 y1,将精度称为 r1,而我们将 GPS 位置的纬度表示为 x2、经度 y2 和精度 r2。请注意,我使用的是笛卡尔坐标。在进行下面概述的计算之前,您必须转换给定的极坐标。

这两个圈子可以

  • 完全分开,没有共同点。我们通过假设报告的位置是正确的来放弃这种情况,即设备不位于计算位置之外。如果您不想做出此假设 - 请选择更准确的位置。
  • 被包含在另一个之中。在这种情况下,您只需选择较小(即更准确)的圆圈作为优化位置。
  • 恰好在一点相交(大奖! - 您已经找到确切位置)
  • 相交于一个看起来像这样的非对称透镜

你需要计算的是[(x1,y1)(x2,y2)]与跨度圆半径r3连线上的非对称透镜的中点(x3,y3)

作为一个很好的资源,我推荐你 Paul Bourke's page 关于这个主题,它也提供了一些实现,例如在 Python 或 C 中。请不要混淆文章中的要点 x3y3,因为我选择了一个更适合您的问题的替代命名。

然后您的优化位置由 x3 = x1 + a*(x2-x1)/dy3 = y1 + a*(y2-y1)/dr3 = sqrt((r1)^2-a^2) 其中 a = ((r1)^2-(r2)^2+d^2)/2*dd = (sqrt((x2-x1)^2+(y2-y1)^2).

剩下的由您决定,因为我不知道您使用的是哪种语言。如果不清楚,请随时评论此答案。

编辑: 如果您搜索 circle circle intersection,您会发现更多示例,例如这个question involving Google Maps API