服务器上保存的位置的接近警报
Proximity alert for locations saved at server
我做了一些搜索,但找不到合适的答案。
我的应用程序应该与多个位置进行比较以了解邻近度。这意味着我将无法将所有位置保存到我的应用程序中以使用 locationManager 确认接近度。我希望在服务器中完成邻近度确认
实现这个的最佳方法是什么?
如果每次设备四处移动时应用程序都要求进行接近确认是否明智?
在你的情况下,简单地说,你可以将接收到的位置发送到你的服务器,然后在服务器上进行所需的计算。但不要忘记你将要处理这些问题
- 有多少设备将位置发送到 服务器?
- 每台设备向服务器发送位置信息的频率如何?
检测设备的责任也进入了服务器
上的区域
我认为您可以通过使用 地理围栏 api、link
来降低所有事情的复杂性
- 无需将每个位置发送到服务器。
- 每个设备单独检测自己进入或退出
面积.
编辑
否则,每当每个设备的位置发生变化时,您将在服务器上进行 entered/exited 计算以无限计算设备数量。
之前我们在我以前的公司做类似的事情,计算 enter/exit 时间并输入持续时间。但通过公共汽车上的真实 gps 设备
我们在城市中有将近 100 个点(地理围栏)。所以你可以认为那些点在几条路线上
总线上的每个 gps 设备都定期向服务器发送位置。
当公交车完成它的路线时,服务器审查设备在路线上的所有接收位置。
将每个地理围栏与公交车的每个位置进行比较。
这是真实场景。你可以称它为 "server based geofencing".
我会尝试不同的方法,因为 GPS 的位置更新每秒进行一次,
如果您有大量设备,我认为每秒向服务器询问接近度不是一个好主意。
想到这个想法-
- 获取设备的初始位置并将其发送到服务器。
- 确定一个合理的半径,让设备在接下来的 5-10 分钟内停留在其中。
还要确保您在该半径内没有 "too many" 点,或者在这种情况下您可以缩小半径。
由您决定半径和点数,具体取决于您的使用情况,
点数等
- 从服务器发送该半径内的所有位置到设备。
- 让设备自己计算距离。
- 当设备移出初始半径时-更新服务器并获取新的
相关地点。
这可以很容易地完成——调用半径
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。
为此提供免费服务 -> Radar
您可以注册无限制的圆形或多边形地理围栏,并在应用程序中注册您的用户以跟踪该用户。当用户进入一个地理围栏时,雷达会向您的服务器发送通知并向您发送以下数据:
用户 ID、用户进入或退出的地理围栏 ID、用于重叠地理围栏的置信度(低、中、高)。
只需10分钟即可使用此SDK。
我做了一些搜索,但找不到合适的答案。
我的应用程序应该与多个位置进行比较以了解邻近度。这意味着我将无法将所有位置保存到我的应用程序中以使用 locationManager 确认接近度。我希望在服务器中完成邻近度确认
实现这个的最佳方法是什么?
如果每次设备四处移动时应用程序都要求进行接近确认是否明智?
在你的情况下,简单地说,你可以将接收到的位置发送到你的服务器,然后在服务器上进行所需的计算。但不要忘记你将要处理这些问题
- 有多少设备将位置发送到 服务器?
- 每台设备向服务器发送位置信息的频率如何?
检测设备的责任也进入了服务器
上的区域我认为您可以通过使用 地理围栏 api、link
来降低所有事情的复杂性- 无需将每个位置发送到服务器。
- 每个设备单独检测自己进入或退出 面积.
编辑
否则,每当每个设备的位置发生变化时,您将在服务器上进行 entered/exited 计算以无限计算设备数量。
之前我们在我以前的公司做类似的事情,计算 enter/exit 时间并输入持续时间。但通过公共汽车上的真实 gps 设备
我们在城市中有将近 100 个点(地理围栏)。所以你可以认为那些点在几条路线上
总线上的每个 gps 设备都定期向服务器发送位置。
当公交车完成它的路线时,服务器审查设备在路线上的所有接收位置。
将每个地理围栏与公交车的每个位置进行比较。
这是真实场景。你可以称它为 "server based geofencing".
我会尝试不同的方法,因为 GPS 的位置更新每秒进行一次,
如果您有大量设备,我认为每秒向服务器询问接近度不是一个好主意。
想到这个想法-
- 获取设备的初始位置并将其发送到服务器。
- 确定一个合理的半径,让设备在接下来的 5-10 分钟内停留在其中。 还要确保您在该半径内没有 "too many" 点,或者在这种情况下您可以缩小半径。 由您决定半径和点数,具体取决于您的使用情况, 点数等
- 从服务器发送该半径内的所有位置到设备。
- 让设备自己计算距离。
- 当设备移出初始半径时-更新服务器并获取新的
相关地点。
这可以很容易地完成——调用半径
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。
为此提供免费服务 -> Radar
您可以注册无限制的圆形或多边形地理围栏,并在应用程序中注册您的用户以跟踪该用户。当用户进入一个地理围栏时,雷达会向您的服务器发送通知并向您发送以下数据:
用户 ID、用户进入或退出的地理围栏 ID、用于重叠地理围栏的置信度(低、中、高)。
只需10分钟即可使用此SDK。