Android - 需要添加超过 100 个地理围栏
Posted
技术标签:
【中文标题】Android - 需要添加超过 100 个地理围栏【英文标题】:Android - Need to add more than 100 geofences 【发布时间】:2015-06-22 14:39:38 【问题描述】:我正在开发一个用户可以设置多个位置的应用程序。当用户使用 GeoFencing 进入或离开特定区域时,我可以成功显示通知。
现在,我需要为所有保存的位置提供监控,它可能有数百个甚至更多。我已阅读给定链接“您可以拥有多个活动的地理围栏,每个设备用户限制为 100 个。”
有没有办法为每个设备用户添加超过 100 个地理围栏?
谢谢!
【问题讨论】:
如果文档说只能添加 100 个项目,那么还有什么方法可以添加更多的项目? 虽然您可以通过不创建输入 n 退出类型的相同位置的栅栏来减少栅栏。我希望您知道您可以为同一位置提供两种类型的地理围栏 感谢您的回复...但在某些情况下,我们有超过 100 个地理围栏,此时应用功能无法按照应用要求运行。 你需要减少地理围栏,没有别的办法。记住 100 个地理围栏不是每个应用程序而是每个设备。 Tracking more than 100 simultaneous geofences with the new android API的可能重复 【参考方案1】:-
拥有一个 ArrayList,其中包含您要监控的所有地理围栏 +100。
收听位置更新。
当你得到一个位置更新时,如果你的所有地理围栏的 ArrayList 超过 100,则移除所有被监控的地理围栏,然后使用 harvesine 公式计算最近的 100 个地理围栏:
public static final double R = 6372.8; // In kilometers
public static double haversine(double lat1, double lon1, double lat2, double lon2)
double dLat = Math.toRadians(lat2 - lat1);
double dLon = Math.toRadians(lon2 - lon1);
lat1 = Math.toRadians(lat1);
lat2 = Math.toRadians(lat2);
double a = Math.sin(dLat / 2) * Math.sin(dLat / 2) + Math.sin(dLon / 2) * Math.sin(dLon / 2) * Math.cos(lat1) * Math.cos(lat2);
double c = 2 * Math.asin(Math.sqrt(a));
return R * c;
这将为您提供两个位置之间的距离。之后,您可以将该距离与地理围栏区域半径进行比较,以了解是否在该区域内。
注意:如果您的半径是米,那么这个距离将以公里为单位,然后只需将 hasrsine 方法的结果乘以 1000 即可将其转换为米。
Reference
-
开始监控最近的 100 个地理围栏的结果列表。
这将允许您始终根据您的位置监控 100 个最近的地理围栏。能够监控超过 100 个,因为它将始终将监控地理围栏区域更改为最近的 100 个地理围栏区域。
【讨论】:
您也可以使用内置函数Location.distanceBetween(),而不是使用Haversine,它使用WGS84 椭球算法。 地理围栏是有状态的(它们是转换而不是位置),强烈建议不要卸载所有然后重新安装它们的幼稚方法。以上是关于Android - 需要添加超过 100 个地理围栏的主要内容,如果未能解决你的问题,请参考以下文章