保存在服务器上的位置的接近警报

时间:2016-04-26 22:24:03

标签: android server location proximity

我做了一些搜索,但找不到合适的答案。

我的应用程序应该与多个位置进行比较。这意味着我将无法将所有位置保存到我的应用程序中以使用locationManager确认接近度。我希望在服务器中完成接近确认

实现这一目标的最佳方式是什么?

如果应用程序每次设备移动时都要求接近确认,这是否合理?

4 个答案:

答案 0 :(得分:8)

我会尝试不同的方法,因为GPS的位置更新每秒进行一次, 如果你有大量的设备,我不认为每秒向服务器询问接近度是一个好主意。
想想这个想法 -

  1. 获取设备的初始位置并将其发送到服务器。
  2. 确定设备将在接下来的5-10分钟内保持在合理的半径范围内。 还要确保你没有太多"该半径中的点,或者在这种情况下您可以缩小半径。 由您来决定半径和点数,具体取决于您的使用情况, 点数等。
  3. 将服务器中该半径内的所有位置发送到设备。
  4. 让设备自行计算接近度。
  5. 当设备移出初始半径时 - 更新服务器并获取新服务器 相关地点。 这可以轻松完成 - 调用半径r。保存设备的初始位置,并计算距离 当前和initail位置之间。当它足够接近"到r - 更新服务器。

答案 1 :(得分:5)

在您的情况下,您可以简单地将收到的位置发送到服务器,然后在服务器上进行必要的计算。但不要忘记你将会处理这些问题

  • 有多少设备向服务器发送位置
  • 每台设备向服务器发送位置的频率?

检测设备的责任还包括服务器

上的区域

我认为您可以使用 geofencing api link

来降低所有内容的复杂性
  • 无需将每个位置发送到服务器。
  • 每个设备单独检测自己已进入或退出 区域。

修改

否则,只要每个设备的位置发生变化,您就会在服务器上进行输入/退出计算,以获得无限数量的设备。

在我以前的公司做类似事情之前,计算进入/退出时间并输入持续时间。但是通过公共汽车上的真正gps设备

  • 我们在城市有近100分(地理围栏)。所以你可以认为那些点在几条路线上

  • 总线上的每个gps设备都会定期向服务器发送位置。

  • 当公交车完成它的路线后,服务器检查设备所有收到的路线的位置

  • 将每个地理位置与公交车的每个位置进行比较。

这是真实的情景。您可以将其称为"基于服务器的地理围栏"。

答案 2 :(得分:5)

您可以在服务器端执行简单的k-d树实现来存储坐标。

发送设备的坐标,可以在您需要的任何时间间隔确定。如果每5秒钟或10秒钟它并不重要。这主要取决于每个坐标/半径之间的最小距离。如果他们离得更近,您可能需要更频繁地更新它。

使用找到最近邻居的k-d树将是O(log(n))。但是,只要它们在设备坐标的特定半径范围内,您就可以开始将节点添加到列表中稍作修改。实际上,如果你将它本地存储为k-d树,那么你可以选择O中最远的节点(log(n))

现在,在第二次更新时,再次发送设备位置,您可以快速更新它,因为您有现有位置。假设您在x方向上移动5.您可以将现在在半径之外的点放在x - 5处。新近距离,您执行相同的最近邻居搜索,添加节点,因为它们位于半径,但这次是从最接近您移动方向的缓存节点开始。

将其与半径的间隔树相结合。所以说0到1,1对2,2到3,作为你的间隔。你也可以在O(log(n))时间内挑选出一定半径内的所有东西。那些应该是指向k-d树中节点的指针。如果您愿意牺牲一些记忆以提高效率,那么这将简化半径计算并找到位置。

答案 3 :(得分:5)

要在服务器端实现它的“快速”方式,您可以使用mondodb $ near地理空间查询。

https://docs.mongodb.org/manual/reference/operator/query/near/

在移动端,您可以使用minDistance属性进行位置更新。根据您所在地点之间的平均距离,您可以将其设置为20米/ 50米的合理距离。

http://developer.android.com/reference/android/location/LocationManager.html#requestLocationUpdates(java.lang.String,%20long,%20float,%20android.location.LocationListener)