Где сохранить Android GPS (широта, долгота) точек? - PullRequest
16 голосов
/ 31 августа 2010

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

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

Спасибо.

Ответы [ 5 ]

71 голосов
/ 21 мая 2012

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

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

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

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

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

11 голосов
/ 30 июня 2011

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

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

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

Затем для вызова значения

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

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

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

0 голосов
/ 21 июня 2015

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

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

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

0 голосов
/ 31 августа 2010

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

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

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

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

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

0 голосов
/ 31 августа 2010

Используйте 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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...