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 个地理围栏的主要内容,如果未能解决你的问题,请参考以下文章

需要来自 CLGeocoder 的坐标超过限制

Android如何知道地理围栏何时过期?

android中的一个App有可能拥有超过100个java文件吗?

查找超过 100K 个位置之间的距离

100灯泡围圈通亮问题

MSSQL服务器地理类型存储一个点需要多少字节