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

Proximity alert for locations saved at server

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

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

实现这个的最佳方法是什么?

如果每次设备四处移动时应用程序都要求进行接近确认是否明智?

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

  • 有多少设备将位置发送到 服务器
  • 每台设备向服务器发送位置信息的频率如何?

检测设备的责任也进入了服务器

上的区域

我认为您可以通过使用 地理围栏 apilink

来降低所有事情的复杂性
  • 无需将每个位置发送到服务器。
  • 每个设备单独检测自己进入或退出 面积.

编辑

否则,每当每个设备的位置发生变化时,您将在服务器上进行 entered/exited 计算以无限计算设备数量。

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

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

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

  • 当公交车完成它的路线时,服务器审查设备在路线上的所有接收位置。

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

这是真实场景。你可以称它为 "server based geofencing".

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

  1. 获取设备的初始位置并将其发送到服务器。
  2. 确定一个合理的半径,让设备在接下来的 5-10 分钟内停留在其中。 还要确保您在该半径内没有 "too many" 点,或者在这种情况下您可以缩小半径。 由您决定半径和点数,具体取决于您的使用情况, 点数等
  3. 从服务器发送该半径内的所有位置到设备。
  4. 让设备自己计算距离。
  5. 当设备移出初始半径时-更新服务器并获取新的 相关地点。 这可以很容易地完成——调用半径 r。保存设备的初始位置,并计算距离 在当前位置和初始位置之间。当它是 "close enough" 到 r - 更新服务器。

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

把设备的坐标传过来,你需要什么时间间隔就可以确定。如果是每 5 秒或 10 秒,那其实并不重要。这将主要由每个 coordinates/radius 之间的最小距离决定。如果它们更近,您可能需要更频繁地更新它。

使用 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 树中节点的指针。如果您愿意为了效率牺牲一些内存,那将简化半径计算和查找位置。

对于在服务器端实现它的 "fast" 方法,您可以使用 mondodb $near 地理空间查询。

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

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

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

为此提供免费服务 -> Radar

您可以注册无限制的圆形或多边形地理围栏,并在应用程序中注册您的用户以跟踪该用户。当用户进入一个地理围栏时,雷达会向您的服务器发送通知并向您发送以下数据:
用户 ID、用户进入或退出的地理围栏 ID、用于重叠地理围栏的置信度(低、中、高)。
只需10分钟即可使用此SDK。