如何将两个地图位置组合成一个更准确的位置?
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 中。请不要混淆文章中的要点 x3
和 y3
,因为我选择了一个更适合您的问题的替代命名。
然后您的优化位置由
x3 = x1 + a*(x2-x1)/d
、y3 = y1 + a*(y2-y1)/d
和
r3 = sqrt((r1)^2-a^2)
其中 a = ((r1)^2-(r2)^2+d^2)/2*d
和
d = (sqrt((x2-x1)^2+(y2-y1)^2)
.
剩下的由您决定,因为我不知道您使用的是哪种语言。如果不清楚,请随时评论此答案。
编辑: 如果您搜索 circle circle intersection,您会发现更多示例,例如这个question involving Google Maps API
我正在创建一个应用程序,它对高度准确地估计 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 中。请不要混淆文章中的要点 x3
和 y3
,因为我选择了一个更适合您的问题的替代命名。
然后您的优化位置由
x3 = x1 + a*(x2-x1)/d
、y3 = y1 + a*(y2-y1)/d
和
r3 = sqrt((r1)^2-a^2)
其中 a = ((r1)^2-(r2)^2+d^2)/2*d
和
d = (sqrt((x2-x1)^2+(y2-y1)^2)
.
剩下的由您决定,因为我不知道您使用的是哪种语言。如果不清楚,请随时评论此答案。
编辑: 如果您搜索 circle circle intersection,您会发现更多示例,例如这个question involving Google Maps API