¿Dónde guardar los puntos GPS de Android (latitud, longitud)?

En evento onLocationChanged quiero guardar mi ruta GPS (latitud, longitud). Posteriormente quiero cargar estos datos y dibujar la ruta.

¿Quién es la mejor manera de hacer esto, utilizando algún tipo de matriz (y guardar o cargar mediante la base de datos) o archivos XML o algo más?

Gracias.

La mejor manera de almacenar valores dobles en SharedPreferences sin perder precisión es:

  • Transformación en representación de bits para almacenarla durante tanto tiempo:

    prefsEditor.putLong("Latitude", Double.doubleToLongBits(location.getLatitude())); 
  • Para recuperar, transfrom de representación de bits a doble:

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

Sin embargo, creo que si quieres almacenar una gran cantidad de puntos es mejor usar una base de datos SQLite que guardar cada coordenada en un par clave-valor en SharedPreferences o serializar la matriz en XML y escribirla en un archivo o SharedPreferences. La base de datos le ofrece la ventaja de cargar en la memoria sólo los puntos dentro del área que está mostrando en el mapa, por lo que puede ahorrar memoria.

Corregirme si estoy equivocado, pero podría ser mejor convertir los valores dobles en cadenas y, a continuación, cada vez que los llame convertirlos de nuevo a dobles. Suena como un dolor, pero el sitio web de oracle ( http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html ) dice:

"Utilizar un float (en lugar de doble) si necesita guardar memoria en grandes matrices de números de punto flotante Este tipo de datos nunca debe utilizarse para valores precisos, como moneda"

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

Entonces, para llamar al valor

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

Definitivamente parece más de una molestia, pero también parece más probable que devuelva el valor exacto que guardó, también, en lugar de algo ligeramente. Y supongo que eso dependerá de lo completamente preciso que necesite los valores a ser.

Aunque, en lo que respecta al uso de una matriz, no tengo ni idea porque nunca he tenido que usarlos y no tengo experiencia con ellos.

Utilice SharedPreferences y Editor.

Echa un vistazo a este código abierto, que probablemente le ayudará mucho: OsmandSettings.java

Voy a explicar las partes importantes del código:

 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"; 

Para escribir en 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(); } 

Para leer de 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); } 

También tuve el mismo problema mientras estaba haciendo la aplicación en el mapa. De hecho, buena pregunta que diría.

Usted puede hacer de esta manera.

1> En evento Click en Map u tiene que mostrar la latitud y longitud de ese punto. Aquí im adjuntar código cómo u puede encontrar lat y largo.

 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> Ahora u puede almacenar este lat y largo en KEY, par de valores. Aquí u tiene que tomar value1 como lat y valor 2 como largo. Y pasar el objeto de
Valor (valor1, valor2) a clave, par de valores.

3> Ahora u tiene la lista de todo el lat y largo a través de los cuales usted ha pasado. Luego dibujar la ruta desde el primer índice hasta el último índice.

Esto es lo que creo que la mejor manera de implementar esta aplicación.

Piense en la precisión (no en la exactitud) que necesita para representar los datos. ¿Un par de pulgadas sería lo suficientemente cerca? La mayoría de los receptores GPS de mano tienen la suerte de ser buenos a un par de metros. Un grado-segundo de longitud en el ecuador te mueve alrededor de 100 pies. Si utiliza un entero de 32 bits firmado para representar sus latitudes y longitudes, LatE6 & LonE6, podría almacenar la longitud más grande que hay como +/- 180.000.000 y el dígito menos significativo es:

(1 / 1E6) * (3600 seg / grados) * (100 pies / s) = 0,36 pies o 4 pulgadas.

Tengo que imaginar mi Garmin utiliza algo como esto, no un flotador con sólo 24 bits de precisión y ciertamente no un doble de 64 bits. La conversión entre el entero y el doble no debería costar mucho. Incluso podría empacar un lat / lon par en un largo.

  • OnStatusChanged situaciones
  • No se puede resolver Manifest.permission.ACCESS_FINE_LOCATION
  • Búsqueda de ubicación mediante MCC, MNC, LAC y ID de celda
  • Detectar o impedir si el usuario utiliza una ubicación falsa
  • Filtro de Kalman para el androide del GPS
  • Cálculo de la distancia dentro de un edificio
  • Android emulador geo arreglo no puede establecer la ubicación GPS
  • ¿Cómo obtener la cantidad de satélites utilizados en gps en android?
  • ¿Cómo puedo comprobar si el teléfono tiene un dispositivo GPS o no?
  • Utilizar el cuadro de diálogo de configuración predeterminada de Android en ON de mi aplicación
  • A-GPS, restablecimiento de GPS y sendExtraCommand
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.