You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

地理围栏应用无法绘制多个圆形与地图标记问题求助

解决地图仅绘制单个地理围栏圆形和标记的问题

嘿,你已经精准揪出问题根源了!在loadGeofencesFromDatabase的循环里,每次迭代都重新初始化GeofenceLatLngCoordinates集合,这就导致之前循环添加的坐标全被清空,最后集合里只剩最后一个坐标,自然只能画出一个围栏和标记。

接下来给你整理好的修正方案:

核心修正点

把集合初始化和addGeofences()调用都移到循环外面——这样每次循环只会往同一个集合里追加坐标,而不是覆盖整个集合,同时避免重复调用添加地理围栏的方法。

修正后的完整代码

private void loadGeofencesFromDatabase() {
    // 集合只初始化一次,放在循环外面
    GeofenceLatLngCoordinates = new ArrayList<>();
    GEOFENCE_RADIUS = Constants.GEOFENCE_RADIUS_IN_METERS;
    
    for (Map.Entry<String, LatLng> entry : Constants.BAY_AREA_LANDMARKS.entrySet()) {
        mGeofenceList.add(new Geofence.Builder()
            .setRequestId(entry.getKey())
            .setCircularRegion(
                entry.getValue().latitude,
                entry.getValue().longitude,
                Constants.GEOFENCE_RADIUS_IN_METERS
            )
            .setExpirationDuration(Constants.GEOFENCE_EXPIRATION_IN_MILLISECONDS)
            .setTransitionTypes(Geofence.GEOFENCE_TRANSITION_ENTER | Geofence.GEOFENCE_TRANSITION_EXIT)
            .build());
        
        // 往已存在的集合里添加坐标,而非新建集合
        GeofenceLatLngCoordinates.add(new LatLng(entry.getValue().latitude, entry.getValue().longitude));
    }
    
    // 所有地理围栏构建完成后,统一调用添加方法
    addGeofences();
}

额外优化建议

  • 确认GeofenceLatLngCoordinates是类的成员变量,而非方法内的局部变量,这样drawGeofence才能访问到完整的坐标列表。
  • 如果后续需要支持不同半径的地理围栏,别用单一的GEOFENCE_RADIUS变量,可以创建一个List<Double>来存储每个围栏对应的半径,在循环里同步添加,这样drawGeofence就能为每个圆形设置正确的半径了。

这样修改后,drawGeofence遍历完整的坐标集合,就能画出所有地理围栏的圆形和标记,同时地理围栏的进入/退出功能依然能正常工作。

内容的提问来源于stack exchange,提问作者captain_watanabe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:33:53