保存在服务器上的位置的接近警报
Posted
技术标签:
【中文标题】保存在服务器上的位置的接近警报【英文标题】:Proximity alert for locations saved at server 【发布时间】:2016-08-20 23:41:05 【问题描述】:我做了一些搜索,但找不到合适的答案。
我的应用应与多个位置进行比较以了解邻近度。这意味着我将无法将所有位置保存到我的应用程序中以使用 locationManager 确认接近度。我希望在服务器中完成邻近确认
实现这一点的最佳方法是什么?
如果应用程序在每次设备移动时都要求确认接近度是否合理?
【问题讨论】:
从设备进入附近到设备收到通知的时间,您预计会有什么样的延迟?此外,您是否期望超过 100 个位置来计算半径 5 英里范围内的接近度? 延迟不是首要质量问题,希望能在几秒内得到响应。此外,我预计 5 英里半径内有许多位置,并且该位置可能会动态变化。 【参考方案1】:为此目的提供免费服务-> Radar
您可以注册无限的圆形或多边形地理围栏,并在应用中注册您的用户以跟踪该用户。当用户进入一个地理围栏时,雷达会向您的服务器发送通知并将以下数据发送给您: 用户 ID,用户输入或退出的地理围栏 ID,用于具有重叠的地理围栏的置信度(低、中、高)。 您只需 10 分钟即可使用此 SDK。
【讨论】:
【参考方案2】:对于在服务器端实现它的“快速”方式,您可以使用 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)
【讨论】:
【参考方案3】:您可以在服务器端执行一个简单的 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 树中节点的指针。如果您愿意牺牲一些内存来提高效率,这将简化半径计算和查找位置。
【讨论】:
【参考方案4】:我会尝试不同的方法,因为 GPS 的位置更新每秒会更新一次, 如果您有大量设备,我认为每秒向服务器询问是否接近不是一个好主意。 想想这个想法——
-
获取设备的初始位置并将其发送到服务器。
确定设备在接下来的 5-10 分钟内将停留在该范围内的合理半径。
还要确保您在该半径中没有“太多”点,或者在这种情况下您可以缩小半径。
由您决定半径和点数,具体取决于您的使用情况,
点数等。
将该半径内的所有位置从服务器发送到设备。
让设备自行计算距离。
当设备移出初始半径时 - 更新服务器并获取新的
相关地点。
这可以很容易地完成 - 调用半径
r
。保存设备的初始位置,并计算距离
在当前位置和初始位置之间。当它“足够接近”r
时 - 更新服务器。
【讨论】:
【参考方案5】:就您而言,简单地说,您可以将接收到的位置发送到您的服务器,然后在服务器上进行所需的计算。但不要忘记你会处理这些问题
有多少设备向服务器发送位置信息? 每台设备向服务器发送位置信息的频率如何?还负责检测设备已进入服务器
上的区域我认为你可以通过使用geofencing api来降低所有事情的复杂性,link
无需将每个位置发送到服务器。 每个设备单独检测到自己已进入或退出 地区。编辑
否则,每当每台设备的位置发生变化时,您都将在服务器上进行输入/退出计算,以获得无限数量的设备。
在我们以前的公司做类似的事情之前,计算进入/退出时间和进入持续时间。但是通过公交车上真正的 GPS 设备
我们在城市有近 100 个点(地理围栏)。所以你可以认为这些点在几条路线上
总线上的每个 gps 设备都会定期向服务器发送位置信息。
当公交车完成它的路线时,服务器会检查设备收到的所有路线上的位置。
将每个地理围栏与公交车的每个位置进行比较。
这是真实的场景。您可以将其称为“基于服务器的地理围栏”。
【讨论】:
地理围栏的限制是只有 100 个位置。我希望对我的位置检测没有限制。也回答您的问题 > Q1 有多少设备将位置发送到服务器? : A1 Unlimited > Q2 每台设备多久向服务器发送一次位置信息? : A2 当设备移动时。以上是关于保存在服务器上的位置的接近警报的主要内容,如果未能解决你的问题,请参考以下文章