Отображение текущего местоположения в автономном режиме с помощью GPS

Привет, я немного новичок в Android, и меня хотели разработать приложение для Android, которое должно показывать текущее местоположение пользователя на карте, такой как карта Google, в автономном режиме. Могу ли я показать местоположение с помощью только GPS и без подключения к Интернету? Надо ли говорить, что эта офлайн-штука для меня жизненно важна. Любая помощь будет оценена по достоинству. Tnx заранее


person Pedram Yazdipoor    schedule 05.12.2017    source источник
comment
Can I show the location with just GPS and without Internet connection. Ну конечно; естественно. GPS не требует интернета. И автономная карта тоже не работает.   -  person greenapps    schedule 05.12.2017
comment
Но Google Maps по умолчанию не работает в автономном режиме и может загружать только небольшие фрагменты карты по запросу пользователя (и даже не может быть использован внешним API карт afaik ...) :-(   -  person Kelevandos    schedule 05.12.2017
comment
Затем используйте Openstreetmap и OsmDroid.   -  person greenapps    schedule 05.12.2017
comment
Tnx @greenapps. Эти карты, которые вы упомянули, так же точны и хороши, как карты Google? Легко ли с ними работать?   -  person Pedram Yazdipoor    schedule 05.12.2017
comment
Вы не знаете openstreetmap? Посмотрите: openstreetmap. org /   -  person greenapps    schedule 05.12.2017
comment
Установите OsmAnd и Maps.me на свое устройство. Они используют openstreetmap в автономном режиме. Есть еще. Затем создайте собственное приложение. Ты можешь лучше. И используйте те же карты, которые они уже скачали.   -  person greenapps    schedule 05.12.2017
comment
Да, GPS может работать сам по себе, чтобы получить исправление, однако для этого требуется прямая видимость, вам нужно находиться на относительно открытой местности, если это холодный старт, а не на открытой местности, GPS может занять некоторое время для исправление.   -  person elmorabea    schedule 05.12.2017


Ответы (2)


Вы можете получить местоположение по GPS (хотя без определения местоположения вышки GSM оно будет менее точным). Однако часть карты может быть сложной. Вы можете использовать Google Maps API в своем приложении, например MapActivity, но Сама карта должна быть загружена из Интернета.

Поэтому для этого вам понадобится какое-то индивидуальное решение, возможно, от другого поставщика карт, чем Google Maps.

Возможно, вы сможете сделать это немного по-другому - получить местоположение в своем приложении, а затем открыть Google Maps с намерением, передав полученные координаты. Это должно позволить пользователю использовать любые хранящиеся в автономном режиме карты, которые у него могут быть.

person Kelevandos    schedule 05.12.2017
comment
Tnx. Не могли бы вы назвать некоторых поставщиков карт? - person Pedram Yazdipoor; 05.12.2017
comment
Не совсем, я работал только с Google Maps, вам нужно будет провести здесь небольшое исследование - person Kelevandos; 05.12.2017
comment
Это, например, выглядит многообещающим: github.com/mapsme/api-android - person Kelevandos; 05.12.2017
comment
(although it will be less precise without GSM tower localisation). Нет, совсем нет. GSM Tower очень неточен. Лучше обойтись без. Ничто не сравнится с gps. - person greenapps; 05.12.2017
comment
Даже слышали о триангуляции GSM? Конечно, для точного определения местоположения требуется GPS, но GSM очень помогает - person Kelevandos; 05.12.2017
comment
Да, я слышал, что триангуляция GSM изначально не точна. И я это понимаю. - person greenapps; 05.12.2017
comment
Google Maps API не работает без подключения к Интернету: как проверить API KEY? Пользователь увидит пустой белый экран без фрагментов карты. Также использование загруженных плиток Google Maps нарушает лицензионное соглашение. - person Andrii Omelchenko; 05.12.2017
comment
Хорошее обновление. Но Google Maps в автономном режиме не может предоставить карту всей Земли, только регион, как снимок экрана. - person Andrii Omelchenko; 05.12.2017

Вы можете получить необработанные данные NMEA с GPS через NmeaListener или лучше OnNmeaMessageListener (IMHO это более сложный) и проанализируйте Предложение RMC, подобное этому:

public class CustomNmeaListener implements GpsStatus.NmeaListener{

    private GoogleMap mGoogleMap;
    private Marker mMarkerPosition = null;
    private BitmapDescriptor mMarkerMoveDescriptor;
    private BitmapDescriptor mMarkerStopDescriptor;

    public CustomNmeaListener(GoogleMap googleMap, int markerMoveResource, int markerStopResource){
        this.mGoogleMap = googleMap;

        mMarkerMoveDescriptor = BitmapDescriptorFactory.fromResource(markerMoveResource);
        mMarkerStopDescriptor = BitmapDescriptorFactory.fromResource(markerStopResource);
    }

    @Override
    public void onNmeaReceived(long timestamp, String nmea) {
        double latitude;
        double longitude;
        float speed;
        float angle;

        // parse NMEA RMC sentence
        // Example $GPRMC,123519,A,4807.038,N,01131.000,E,022.4,084.4,230394,003.1,W*6A
        //   nmea    [0]   [1]  [2]  [3]   [4]   [5]   [6] [7]   [8]   [9]   [10]  [11]
        if (nmea.startsWith("$GPRMC")) {

            String[] nmeaParts = nmea.split(",");

            // if RMC data valid ("active")
            if (nmeaParts[2].equals("A")) {
                latitude = parseLatitude(nmeaParts[3], nmeaParts[4]);
                longitude = parseLongitude(nmeaParts[5], nmeaParts[6]);
                speed = parseSpeed(nmeaParts[7]);
                angle = parseAngle(nmeaParts[8]);

                // remove marker on "old" position
                if (mMarkerPosition != null) {
                    mMarkerPosition.remove();
                }

                MarkerOptions positionMarkerOptions;

                if (speed > 0) {
                    positionMarkerOptions = new MarkerOptions()
                            .position(new LatLng(latitude, longitude))
                            .icon(mMarkerMoveDescriptor)
                            .anchor(0.5f, 0.5f)
                            .rotation(angle);
                } else {
                    positionMarkerOptions = new MarkerOptions()
                            .position(new LatLng(latitude, longitude))
                            .icon(mMarkerStopDescriptor)
                            .anchor(0.5f, 0.5f)
                            .rotation(0);
                }
                mMarkerPosition = mGoogleMap.addMarker(positionMarkerOptions);
            }
        }

    }

    static float parseLatitude(String lat, String sign) {
        float latitude = Float.parseFloat(lat.substring(2)) / 60.0f;
        latitude +=  Float.parseFloat(lat.substring(0, 2));
        if(sign.startsWith("S")) {
            latitude = -latitude;
        }
        return latitude;
    }

    static float parseLongitude(String lon, String sign) {
        float longitude = Float.parseFloat(lon.substring(3)) / 60.0f;
        longitude +=  Float.parseFloat(lon.substring(0, 3));
        if(sign.startsWith("W")) {
            longitude = -longitude;
        }
        return longitude;
    }

    static float parseSpeed(String knots) {
        float speed;
        try {
            speed = Float.parseFloat(knots);
        } catch (Exception e) {
            speed = 0;
        }
        return speed;
    }

    static float parseAngle(String ang) {
        float angle;
        try {
            angle = Float.parseFloat(ang);
        } catch (Exception e) {
            angle = 0;
        }
        return angle;
    }
}

и установить интервал предложения RMC на requestLocationUpdates() вызове

try {
    mLocationManager.requestLocationUpdates(
            LocationManager.GPS_PROVIDER,
            <your_update_interval>,
            LOCATION_DISTANCE,
            this
    );
 } catch (java.lang.SecurityException ex) {
    Log.d(TAG, "fail to request location update, ignore", ex);
 }

А для картографического сервиса вам следует использовать индивидуальное решение, потому что даже для автономных карт Google Maps требуется подключение к Интернету, по крайней мере, для проверки MAPS API KEY. В качестве первого подхода вы можете использовать простой ImageView со снимком экрана карты.

person Andrii Omelchenko    schedule 05.12.2017
comment
Это позволяет вам получить местоположение, но не отобразит его на карте, если оно находится в автономном режиме, так как карта не будет загружена. - person Kelevandos; 05.12.2017
comment
@Kelevandos Просто используйте ImageView со снимком экрана карты. - person Andrii Omelchenko; 05.12.2017
comment
Чего ждать? Какой скриншот? Со всей земли в увеличенном масштабе? Какого разрешения вы ожидаете от этого? Целое.MAX_VALUE: Целое.MAX_VALUE? - person Kelevandos; 05.12.2017
comment
скриншоты мне не помогут. Мне нужна полная карта - person Pedram Yazdipoor; 05.12.2017
comment
@Kelevandos Скриншот целевого региона, конечно. У вас не может быть мозаичная карта всей Земли с соответствующими уровнями масштабирования на вашем мобильном устройстве. - person Andrii Omelchenko; 05.12.2017
comment
@PedramYazdipoor Мне нужна полная карта - что такое полная карта? - person Andrii Omelchenko; 05.12.2017
comment
Оффлайн карта земли. Не снимок экрана, а как ты хочешь сделать снимок целевой локации, @AndriiOmelchenko? Заранее? Как узнать, где будет находиться пользователь? - person Kelevandos; 05.12.2017
comment
tnx, но этот снимок экрана вообще не является решением. Мне нужно показать текущее местоположение на карте с GPS и без подключения к Интернету - person Pedram Yazdipoor; 05.12.2017
comment
@ Андрей Омельченко. полная карта означает настоящую карту, а не некоторые изображения - person Pedram Yazdipoor; 05.12.2017
comment
@PedramYazdipoor Итак, эта карта вам нужна уже на вашем мобильном устройстве. Есть только один способ добиться этого: использовать векторные карты (например, MapInfo .mif), но бесплатных векторных карт для всей Земли не существует. И вам нужно отобразить формат векторной карты на растровом мобильном экране. - person Andrii Omelchenko; 05.12.2017
comment
Человек ... Пользователь загрузит приложение из Интернета, затем войдет в глубокий лес, и желаемое поведение состоит в том, что он сможет проверить, где он находится, без подключения к Интернету. Насколько сложно это понять? Мобильные устройства не должны быть постоянно подключены к Интернету (хотя это значительно упростит жизнь разработчикам). - person Kelevandos; 05.12.2017