Выяснение того, находится ли текущая долгота и широта телефона в радиусе местоположения GPS

Я надеюсь, что кто-то может помочь с этим. Я видел много сообщений и ответов, но ни один из них, похоже, не касается моей конкретной проблемы, но если я что-то пропустил, заранее извиняюсь.
Я создаю небольшое приложение, которое хранит текущую долготу и широту телефона в виде удвоенных значений. Это делается с помощью LocationManager Android.

    @TargetApi(23)
private void initLocationService(Context context) {
    if (Build.VERSION.SDK_INT >= 23 &&
            ContextCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED &&
            ContextCompat.checkSelfPermission(context, android.Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
        return;
    }

    try {
        this.longitude = 0.0;
        this.latitude = 0.0;
        this.locationManager = (LocationManager) context.getSystemService(Context.LOCATION_SERVICE);

        // Get GPS and network status
        this.isGPSEnabled = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
        this.isNetworkEnabled = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);

        if (forceNetwork) isGPSEnabled = false;

        if (!isNetworkEnabled && !isGPSEnabled) {
            // cannot get location
            this.locationServiceAvailable = false;
        }
        else
        {
            this.locationServiceAvailable = true;

            if (isNetworkEnabled) {
                locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER,
                        MIN_TIME_BW_UPDATES,
                        MIN_DISTANCE_CHANGE_FOR_UPDATES, this);
                if (locationManager != null) {
                    location = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
                    updateCoordinates();
                }
            }//end if

            if (isGPSEnabled) {
                locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER,
                        MIN_TIME_BW_UPDATES,
                        MIN_DISTANCE_CHANGE_FOR_UPDATES, this);

                if (locationManager != null) {
                    location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
                    updateCoordinates();
                }
            }
        }
    } catch (Exception ex) {

    }
}

public void updateCoordinates()
{
    longitude = location.getLongitude();
    latitude = location.getLatitude();
}

У меня есть набор координат долготы и широты, жестко закодированных в приложении, но мне нужен способ определить, находится ли мой пользователь в пределах определенного радиуса метра от жестко запрограммированной точки.

Я использую только Android API для проекта и не могу отклоняться от этого.

Я уже научился переводить долготу и широту из градусов в метры:

public double longOffset(int offsetX, double lon){
    double longoff = offsetX / earthRadius;

    return lon + longoff * 180 / Math.PI;
}

public double latOffset(int offsetY, double lat){
    double latoff = offsetY / (earthRadius * cos(Math.PI*lat/180));

    return lat + latoff * 180 / Math.PI;
}

Но я признаю, что был в тупике насчет остального. Мне интересно, если создать небольшую ограничительную рамку вокруг долготы и широты, а затем использовать метод, аналогичный показанному здесь: http://www.sanfoundry.com/java-program-check-whether-данная-точка-лежит-данный-полигон/

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


person Deeper Shade    schedule 23.03.2018    source источник
comment
Вы ищете SphericalUtil.computeDistanceBetween? github. com/googlemaps/android-maps-utils/blob/master/library/   -  person Eugen Pechanec    schedule 24.03.2018
comment
Похоже, вам нужна геозона. Ознакомьтесь с документацией: developer.android.com/training/location/geofencing.html.   -  person xomena    schedule 24.03.2018


Ответы (1)


Как говорит @EugenPechanec, вы можете использовать SphericalUtil.computeDistanceBetween() из библиотеки утилит Google Maps Android API . Что-то вроде этого:

Location location = locationManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
double longitude = location.getLongitude();
double latitude = location.getLatitude();
LatLng positionLatLng = new LatLng(latitude, longitude);

// sample hardcoded point.
LatLng specificPointLatLang = new LatLng(1.333434, 1.3333);

// Returns the distance between two LatLngs, in meters.
double distance = SphericalUtil.computeDistanceBetween(positionLatLng, specificPointLatLang);
person ישו אוהב אותך    schedule 24.03.2018
comment
Извините за поздний ответ. Мой ноутбук сошел с ума, и я чуть не потерял весь проект. Резервные копии жизненно важны. Усвоенный урок, к счастью, разобрался, и ваш ответ работает. Спасибо :) - person Deeper Shade; 25.03.2018
comment
Иногда бывает так, что что-то плохое просыпается и заставляет нас осознать, что нужно что-то делать правильно. У нас есть опыт, и мы учимся на одном и том же. Поднять настроение ;) - person ישו אוהב אותך; 26.03.2018