Где сохранить точки Android GPS (широта, долгота)?

В onLocationChanged я хочу сохранить свой GPS-маршрут (широта, долгота). Позже я хочу загрузить эти данные и нарисовать маршрут.

Кто лучший способ сделать это, используя некоторый тип массива (и сохранить или загрузить с помощью базы данных) или XML-файлы или что-то еще?

Благодарю.

    Лучший способ хранения двойных значений в SharedPreferences без потери точности:

    • Преобразовать в представление битов, чтобы хранить его как можно дольше:

      prefsEditor.putLong("Latitude", Double.doubleToLongBits(location.getLatitude())); 
    • Чтобы получить, перевести из представления бит в double:

       double latitude = Double.longBitsToDouble(prefs.getLong("Latitude", 0); 

    Тем не менее, я думаю, что если вы хотите сохранить большое количество баллов, лучше использовать базу данных SQLite, чем сохранять каждую координату в паре Key-Value в SharedPreferences или сериализовать массив в XML и записать его в файл или в SharedPreferences. База данных предлагает вам преимущество загрузки в память только точек в области, отображаемой на карте, поэтому вы можете сохранить память.

    Исправьте меня, если я ошибаюсь, но лучше было бы преобразовать двойные значения в строки, а затем всякий раз, когда вы вызываете их, они возвращают их в двойные. Звучит как боль, но сайт оракула ( http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html ) говорит:

    «используйте float (вместо double), если вам нужно сохранить память в больших массивах чисел с плавающей запятой. Этот тип данных никогда не должен использоваться для точных значений, таких как валюта"

     prefEditor.putString("Latitude", Double.valueOf(loc.getLatitude()).toString()); 

    Затем, чтобы вызвать значение

     String latitudeString = pref.getString("Latitude", "0"); double latitude = Double.parseDouble(latitudeString); 

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

    Хотя, что касается использования массива, я не знаю, потому что мне никогда не приходилось использовать их и не иметь опыта с ними.

    Используйте SharedPreferences и Editor.

    Проверьте этот открытый исходный код, это, вероятно, поможет вам многое: OsmandSettings.java

    Я объясню важные части кода:

     import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; // These settings are stored in SharedPreferences, replace com.osmand.settings // with your own package name, or whatever String you want. public static final String SHARED_PREFERENCES_NAME = "com.osmand.settings"; public static final String LATITUDE = "latitude"; public static final String LONGITUDE = "longitude"; 

    Чтобы написать в SharedPreferences:

     public void onLocationChanged(Location location){ SharedPreferences prefs = Context.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_WORLD_READABLE); Editor editor = prefs.edit(); //Save it as a float since SharedPreferences can't deal with doubles edit.putFloat(LATITUDE, (float) Location.getLatitude()); edit.putFloat(LONGITUDE, (float) Location.getLongitude()); edit.commit(); } 

    Чтобы прочитать из SharedPreferences:

     public void onLocationChanged(Location location){ SharedPreferences prefs = Context.getSharedPreferences(SHARED_PREFERENCES_NAME, Context.MODE_WORLD_READABLE); double lat = (double)prefs.getFloat(LATITUDE, 0); double lon = (double)prefs.getFloat(LONGITUDE, 0); } 

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

    вы можете сделать это.

    1> В событии Click на карте вам нужно показать широту и долготу этой точки. здесь im есть код, как вы можете найти lat и long.

     public boolean onTouchEvent(MotionEvent event, MapView mapView) { //---when user lifts his finger--- if (event.getAction() == 1) { GeoPoint p = mapView.getProjection().fromPixels( (int) event.getX(), (int) event.getY()); Toast.makeText(getBaseContext(), p.getLatitudeE6() / 1E6 + "," + p.getLongitudeE6() /1E6 , Toast.LENGTH_SHORT).show(); } return false; } 

    2> Теперь u может хранить этот lat и long в KEY, пара значений. здесь вам нужно принимать значение1 как lat и значение 2 как можно дольше. и передать объект
    value (value1, value2) к ключу, паре значений.

    3> Теперь у вас есть список всех латов и длинный, через который вы прошли. затем нарисуйте маршрут от 1-го индекса до последнего индекса.

    Это то, что я считаю лучшим способом реализовать это приложение.

    Подумайте о точности (не точности), которую вам нужно представить. Будет ли несколько дюймов достаточно близко? Большинство портативных приемников GPS счастливы быть хорошими на пару метров. Одна градус-секунда долготы на экваторе перемещает вас на 100 футов. Если вы используете подписанное 32-битное целое число для представления ваших широт и долгот, LatE6 и LonE6, вы можете сохранить наибольшую долготу, равную +/- 180 000 000, а наименьшая значащая цифра:

    (1 / 1E6) * (3600 с / град) * (100 футов / сек) = 0,36 фута или 4 дюйма.

    Я должен представить, что мой Garmin использует что-то вроде этого, а не float с точностью до 24 бит и, конечно же, не 64-битным двойным. Преобразование между целыми и двойными не должно дорого стоить. Вы даже можете упаковать пару lat / lon в длинный.

    Intereting Posts
    Студия андроида Kotlin Я пытаюсь изменить текст кнопки, но получаю сообщение «exepected a value of boolean» Kotlin – Функция ожидания Kotlin Один аргумент типа, ожидаемый для класса для абстрактного общего владельца представления Подавить жалобы Dokka о «Нет документации для com.foo.Bar $ toString ()»? Является ли `foo as? Foo` полный эквивалент `foo as Foo?` В kotlin? Ссылка за закрытым классом в Котлине? Kotlin – Настройка проекта IntelliJ Использование объекта-компаньона для возврата экземпляра класса в Котлин Как установитьOnNavigationItemListener в BottomNavigationView в android с помощью Kotlin? Kotlin ": некоторые файлы JAR в пути к классам имеют библиотеку Runtime Kotlin, вложенную в них" Правильно ли написана документация Котлина? Как установить CallBack в Котлин? Функция инициализации массива Котлина При создании интерфейса в Kotlin имеет значение, если свойства get / set? Как использовать тип перечисления Postgresql через Kotlin Exposed ORM?