将多个地理围栏添加到地图中

时间:2017-11-03 16:23:12

标签: java android google-maps google-maps-markers android-geofence

到目前为止,我可以借助此tutorial向地图添加单一地理围栏。实际上,我在地图点击事件中向地图添加标记,允许我在触摸时添加多个标记。我不想为我添加的所有标记添加地理围栏。我已尝试对上述教程的特定方法进行少量更改

ArrayList<LatLng> locs= new ArrayList<LatLng>();
    // Create a marker for the geofence creation
private void markerForGeofence(LatLng latLng) {
    Log.i(TAG, "markerForGeofence(" + latLng + ")");
    String title = latLng.latitude + ", " + latLng.longitude;
    // Define marker options
    MarkerOptions markerOptions = new MarkerOptions()
            .position(latLng)
            .icon(BitmapDescriptorFactory.defaultMarker(BitmapDescriptorFactory.HUE_ORANGE))
            .title(title);
    if (map != null) {
        // Remove last geoFenceMarker
      //  if (geoFenceMarker != null)
      //      geoFenceMarker.remove();

        geoFenceMarker = map.addMarker(markerOptions);  
        gfmarkr.add(geoFenceMarker);
    }
}
...
   // Start Geofence creation process
private void startGeofence() {
    Log.i(TAG, "startGeofence()");
    if (geoFenceMarker != null) {
        for (int i = 0; i < gfmarkr.size(); i++) {
            Geofence geofence = createGeofence(locs.get(i), GEOFENCE_RADIUS);
            GeofencingRequest geofenceRequest = createGeofenceRequest(geofence);
            addGeofence(geofenceRequest);
        }
    } else {
        Log.e(TAG, "Geofence marker is null");
    }
}

简而言之,添加多个地理围栏的方法是什么。任何解决方案都会有很大的帮助。三江源。

3 个答案:

答案 0 :(得分:1)

它解决了。我将locs.get(i)传递给负责创建特定地理围栏的所有方法,并将其用作位置的参考点。我也删除了陈述  if (geoFenceLimits != null) geoFenceLimits.remove();
来自drawGeofence()方法。

答案 1 :(得分:0)

当您获得位置更新时,如果您所有地理围栏的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;
}

这将为您提供两个位置之间的距离。之后,您可以将该距离与地理围栏区域半径进行比较,以了解是否在该区域内。 注意:如果半径为米,则此距离将以千米为单位,然后将半径方法结果乘以1000,以便将其转换为米。

Reference

答案 2 :(得分:0)

这是一个很好的问题。我经历过这种情况,我不知道添加多个地理围栏的方法。这段视频Android Development Tutorial - Geo Fencing multiple location with GeoFire and Firebase帮助我解决了很多问题。