Отслеживание в Geofence Radious

Я создал приложение для геозоны.

Я реализую прослушиватель местоположения, который отправляет мне текущую широту и долготу.

У меня есть массив Lat Long, и я создал Geofence из этого массива.

Я хочу проверить, что текущая широта и долгота находятся в пределах моей геозоны или нет?

Код для геозоны: -

private void createGeofence(double latitude, double longitude, int radius,
            String geofenceType, String title) {

        Marker stopMarker = googleMap.addMarker(new MarkerOptions()
                .draggable(true)
                .position(new LatLng(latitude, longitude))
                .title(title)
                );

        googleMap.addCircle(new CircleOptions()
                .center(new LatLng(latitude, longitude)).radius(radius)
                .fillColor(Color.parseColor("#B2A9F6")));
    }

Lat Long от слушателя: -

@Override
    public void onLocationChanged(Location location) {
        // TODO Auto-generated method stub


        Lat=location.getLatitude();
        Lng=location.getLongitude();    

        Geocoder geocoder;
        List<Address> addresses;
        geocoder = new Geocoder(this, Locale.getDefault());
        try {

             addresses = geocoder.getFromLocation(Lat, Lng, 1);
             address = addresses.get(0).getAddressLine(0);
             city = addresses.get(0).getAddressLine(1);
             country = addresses.get(0).getAddressLine(2);


        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }



        System.out.println("Lat Long is "+ Lat + " " + Lng);

    }

Пожалуйста, помогите в этом.


person Amee    schedule 18.02.2015    source источник


Ответы (1)


Вы можете использовать формулу харвезина:

    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, чтобы преобразовать его в метры.

Справочник

person Rendy Del Rosario    schedule 10.04.2015