Подтвердить что ты не робот

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

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

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

Спасибо.

4b9b3361

Ответ 1

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

  • Преобразование в представление битов для его сохранения:

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

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

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

Ответ 2

Исправьте меня, если я ошибаюсь, но лучше было бы преобразовать двойные значения в строки, а затем всякий раз, когда вы вызываете их, они возвращают их в двойные. Звучит как боль, но сайт оракула (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);

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

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

Ответ 3

Используйте 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);
}

Ответ 4

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

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

1 > На событии Click на карте вам нужно показать широту и долготу этой точки. здесь я m есть код, как вы можете найти 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, value.  здесь вам нужно принимать значение1 как lat и значение 2 как можно дольше. и передать объект  значение (значение1, значение2) к ключу, паре значений.

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

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

Ответ 5

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

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

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