哪里可以节省Android的GPS(经度,纬度)点?

在onLocationChanged事件我想保存我的GPS路线(经度,纬度)。 稍后我想加载这些数据并绘制路线。

通过使用某种数组类型(以及使用数据库进行保存或加载)或XML文件或其他方法,谁是最好的方法呢?

谢谢。

在SharedPreferences中存储double值的最佳方式不会丢失精度:

  • 转换为位表示来存储它:

    prefsEditor.putLong("Latitude", Double.doubleToLongBits(location.getLatitude())); 
  • 从位表示转换为double:

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

不过,我认为如果要存储大量的点,最好使用SQLite数据库,而不是将每个坐标保存在SharedPreferences中的Key-Value对中,或者使用XML序列化数组,然后将其写入文件或SharedPreferences中。 数据库为您提供了在内存中只加载地图中显示区域内的点的优势,因此您可以节省内存。

纠正我,如果我错了,但它可能会更好地将双重值转换为字符串,然后每当你打电话给他们转换成双打。 听起来像一个痛苦,但甲骨文的网站( http://download.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html )说:

“如果您需要将内存保存在浮点数的大数组中,请使用浮点数(而不是double),而不应将此数据类型用于精确值,如货币”

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

然后,调用该值

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

这看起来更像是一个讨厌的东西,但似乎也更有可能返回你保存的确切值,而不是稍微偏离。 我想这将取决于你需要的值是多么完全准确。

虽然,就使用数组而言,我很笨,因为我从来不需要使用它们,也没有经验。

使用SharedPreferences和编辑器。

看看这个开源代码,它可能会帮助你很多: 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); } 

当我在Map上做应用时,我也遇到同样的问题。 其实我会说的很好的问题。

你可以这样做。

1>点击地图上的事件你必须显示经纬度的那一点。 这里即时通讯代码如何找到经纬度。

 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>现在你可以将这个经纬度存储在KEY,值对中。 在这里你必须取值为1经纬度和值2长。 并传递对象
值(值1,值2)键,值对。

3>现在你已经列出了所有经过的经纬度。 然后画第一个索引到最后一个索引的路线。

这是我认为实现这个应用程序的最佳方式。

考虑你需要代表数据的精度(不准确)。 几英寸就够了吗? 大多数手持式GPS接收器幸运地可以达到几米。 赤道经度为1度,移动100英尺。 如果使用一个有符号的32位整数来表示纬度和经度LatE6和LonE6,那么可以存储最大的经度为+/- 180,000,000,最不重要的数字是:

(1 / 1E6)*(3600秒/度)*(100英尺/秒)= 0.36英尺或4英寸。

我必须想象我的Garmin使用这样的东西,而不是一个只有24位精度的浮点数,当然不是64位双精度浮点数。 整数和double之间的转换不应该花费太多。 你甚至可以把一个经纬度长长的一对。