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

12

我进行了一些搜索,但没有找到一个合适的答案。

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

实现这个功能最好的方法是什么?

如果设备移动时应用程序每次都要请求接近性确认,这样做会不会很明智?


你期望设备进入接近范围到通知设备的时间延迟是多少?此外,你是否期望计算接近5英里半径内超过100个位置? - Pablo Baxter
延迟不是最重要的质量问题,但希望在几秒钟内得到响应。此外,我期望许多位置在5英里半径内,并且这些位置可能会动态更改。 - Ham Dong Kyun
5个回答

9
我建议采用不同的方法,因为GPS定位每秒只更新一次,如果你有大量设备,每秒向服务器请求接近度可能不是一个好主意。
可以考虑以下思路:
  1. 获取设备的初始位置并将其发送到服务器。
  2. 确定设备在接下来的5-10分钟内保持在合理半径内。同时确保该半径内没有“过多”的点,否则可以缩小该半径。根据您的使用情况、点数等,您可以自行决定半径和点数。
  3. 从服务器发送所有在该半径内的位置到设备。
  4. 让设备自己计算接近度。
  5. 当设备移出初始半径时,更新服务器并获取新的相关位置。这很容易实现 - 将半径称为r。保存设备的初始位置,并计算当前位置与初始位置之间的距离。当它足够接近r时,更新服务器。

5
在您的情况下,您可以将接收到的位置发送到服务器,然后在服务器上进行必要的计算。但不要忘记,您将处理这些问题:
- 有多少设备向服务器发送位置? - 每个设备向服务器发送位置的频率如何?
此外,检测设备是否进入了服务器上的某个区域也是服务器的责任。
我认为你可以通过使用地理围栏API link 来简化所有事情的复杂性。
- 不需要将每个位置发送到服务器。 - 每个设备单独检测自己是否已经进入或退出了一个区域。
否则,您将为无限数量的设备在服务器上执行进入/退出计算,每当每个设备的位置发生变化时。
在我的上一家公司中,我们曾经通过真实的GPS设备在公交车上进行类似的计算,计算进入/退出时间和进入持续时间。
我们在城市中有近100个点(地理围栏),因此您可以认为这些点位于几条路线上。
每辆公交车上的GPS设备定期向服务器发送位置信息。
当公交车完成了它的路线,服务器会审查设备在路线上收到的所有位置。
将每个地理围栏与公交车的每个位置进行比较。
这是真实情况。您可以称其为“基于服务器的地理围栏”。

地理围栏有一个限制,只能有100个位置。我希望我的位置检测没有任何限制。 另外回答你的问题> Q1 有多少设备将位置发送到服务器?:A1 无限制 > Q2 每个设备多久发送一次位置到服务器?:A2 只要设备在移动。 - Ham Dong Kyun

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

5

如果您想在服务器端“快速”实现它,可以使用mongodb的$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)


0

有一个免费的服务可供使用 -> 雷达

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接