2016-04-26 196 views
12

我做了一些搜索,但找不到合适的答案。保存在服务器上的位置的接近警报

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

实现此目的的最佳方法是什么?

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

+0

从设备进入附近到设备收到通知时,您期望什么样的延迟?此外,您是否期望有超过100个地点计算5英里范围内的接近度? –

+0

延迟不是最重要的质量问题,bur希望在几秒内得到回应。此外,我期待在5英里半径范围内的许多地点,并且该位置可能会动态变化。 –

回答

8

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

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

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

  • 多少台设备发送位置服务器
  • 每个设备发送位置的频率为服务器

另外的检测设备的责任已经进入一个区域的服务器

我想你可以通过使用地理围栏API,减少的一切事物的复杂性上link

  • 无需将每个位置发送到服务器。
  • 每个设备单独检测自己已进入或退出 区域。

编辑

否则你会做进入/退出的计算上的服务器设备的无限数量,只要每个设备的位置发生了变化。

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

  • 我们在城市有近100点(geofence)。所以你可以认为这些点是在几条路线上

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

  • 当总线完成它的路线,服务器评论设备的所有接收到的位置路线上。

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

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

+0

Geofencing有限制只有100个位置。我想对我的位置检测没有限制。 也回答你的问题> Q1有多少设备发送位置到服务器? :A1 Unlimited> Q2每台设备发送位置到服务器的频率? :A2当设备移动时。 –

5

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

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

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

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

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

5

对于在服务器端实现它的“快速”方式,您可以使用mondodb $ near geospatial查询。

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

没有用于此目的的免费服务 - >Radar

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