on onLocationChanged事件我想保存我的GPS路线(纬度,经度)。后来我想加载这些数据并绘制路线。
通过使用某种数组类型(以及使用数据库保存或加载)或XML文件或其他方式,最好的方法是什么?
感谢。
答案 0 :(得分:71)
在SharedPreferences中存储双值而不会丢失精度的最佳方法是:
转换为位表示以将其存储为long:
prefsEditor.putLong("Latitude", Double.doubleToLongBits(location.getLatitude()));
要检索,从位表示转换为double:
double latitude = Double.longBitsToDouble(prefs.getLong("Latitude", 0);
但是,我认为如果你想存储大量的点比使用SQLite数据库更好,而不是保存SharedPreferences中的键值对中的每个坐标,或者用XML序列化数组并将其写入文件或者SharedPreferences。数据库为您提供的优势是只在内存中加载您在地图中显示的区域内的点,这样您就可以节省内存。
答案 1 :(得分:11)
如果我错了,请纠正我,但将双值转换为字符串可能会更好,然后无论何时调用它们都会将它们转换回双精度数。听起来很痛苦,但是oracle的网站(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);
这看起来似乎更令人讨厌,但似乎也更有可能返回您保存的确切值,而不是略微偏离。而且我想这取决于你需要多么准确的数值。
虽然,就使用数组而言,我很无能为力,因为我从来不需要使用它们,也没有经验。
答案 2 :(得分:0)
使用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);
}
答案 3 :(得分:0)
当我在地图上做app时,我也有同样的问题。 事实上我会说很好的问题。
你可以这样做。
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,value对中。
这里你必须将value1作为lat,将value 2作为long。并传递
的对象
值(value1,value2)到键,值对。
3>现在你已经通过了所有lat和long的列表。 然后从第一个索引到最后一个索引绘制路线。
这是我认为实现此应用程序的最佳方式。
答案 4 :(得分:0)
考虑表示数据所需的精度(而不是准确性)。几英寸会不够接近?大多数手持式GPS接收器很幸运能够达到几米。赤道经度的一度二分之一可以让你移动大约100英尺。如果使用带符号的32位整数来表示纬度和经度,LatE6& LonE6,您可以存储最大经度为+/- 180,000,000,最低有效数字为:
(1 / 1E6)*(3600秒/度)*(100英尺/秒)= 0.36英尺或4英寸。
我必须想象我的Garmin使用这样的东西,而不是只有24位精度的浮点数,当然不是64位双精度浮点数。整数和双精度之间的转换不应该花费太多。你甚至可以把一个纬度/经度对包装成一个长的。