¿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?
- Android - trazado de gps coordinar en mapa personalizado
- ¿Necesito solicitar actualizaciones de ubicación al utilizar Geofences de ubicación fusionada?
- Compatible en lenovo a369i
- Asistencia de inyección de datos en GPS
- Obtención de velocidad mediante el API de ubicación de Google Play
Gracias.
- ¿Por qué el GPS no funciona en ciertos dispositivos si la pantalla está apagada?
- Calcular la dirección de la luz solar de acuerdo con la hora actual y la posición en la tierra
- Mover marcador con gps en google map android
- ¿Por qué el servicio de aplicaciones se reinicia y no puede reiniciarlo?
- Android gps postion precisión círculo
- Mi algoritmo para calcular la posición del teléfono inteligente - GPS y sensores
- Android escribe EXIF Latitude y Longitud GPS en JPEG falló
- No se puede resolver el símbolo ACCESS_FINE_LOCATION
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.
- Android libvlc problemas de superficie múltiples
- Cómo configurar el color desactivado del botón con AppCompat?