Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/181.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在哪里保存Android GPS(纬度、经度)点?_Android_Gps - Fatal编程技术网

在哪里保存Android GPS(纬度、经度)点?

在哪里保存Android GPS(纬度、经度)点?,android,gps,Android,Gps,在onLocationChanged事件中,我想保存我的GPS路线(纬度、经度)。稍后我想加载这些数据并绘制路线 通过使用某种数组类型(并使用数据库保存或加载)或XML文件或其他方式,谁是实现这一点的最佳方法 谢谢。使用SharedReferences和Editor 查看此开放源代码,它可能会对您有很大帮助: 我将解释代码的重要部分: import android.content.SharedPreferences; import android.content.SharedPreferenc

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

通过使用某种数组类型(并使用数据库保存或加载)或XML文件或其他方式,谁是实现这一点的最佳方法


谢谢。

使用SharedReferences和Editor

查看此开放源代码,它可能会对您有很大帮助:

我将解释代码的重要部分:

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";
要写入SharedReferences,请执行以下操作:

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();
}
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);
}
要读取SharedReferences,请执行以下操作:

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

我也有同样的问题,当我在地图上做应用程序。 事实上,我想说的是一个好问题

你可以这样做

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> 现在,您可以在键、值对中存储该lat和long。 在这里,你必须将值1作为lat,将值2作为long。并传递
值(值1,值2)到键,值对

3> 现在你已经有了你通过的所有经纬度和经纬度的列表。 然后绘制从第一个索引到最后一个索引的路径


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

如果我错了,请纠正我,但最好将双精度值转换为字符串,然后在调用它们时将其转换回双精度值。听起来很痛苦,但甲骨文网站()上说:

如果需要在大量浮点数数组中保存内存,请使用浮点(而不是双精度)。此数据类型不应用于精确值,如货币

然后,调用该值

String latitudeString = pref.getString("Latitude", "0");
double latitude = Double.parseDouble(latitudeString);
它看起来确实更令人讨厌,但似乎也更有可能返回您保存的确切值,而不是稍微偏离的值。我想这取决于你需要的数值有多精确


不过,就使用数组而言,我并不清楚,因为我从来没有使用过数组,也没有使用过数组的经验。

在SharedReferences中存储双值而不丢失精度的最佳方法是:

  • 转换为位表示以将其存储为长:

    prefsEditor.putLong("Latitude", Double.doubleToLongBits(location.getLatitude()));
    
  • 要检索,请将位表示转换为双精度:

    double latitude = Double.longBitsToDouble(prefs.getLong("Latitude", 0);
    
但是,我认为,如果要存储大量点,使用SQLite数据库比将每个坐标保存在SharedReferences中的键值对中要好,或者用XML序列化数组并将其写入文件或SharedReferences。数据库的优点是只在内存中加载地图中显示区域内的点,因此可以节省内存。

请考虑表示数据所需的精度(而不是精度)。几英寸够近吗?大多数手持式GPS接收机幸运的是,它们的性能可以达到几米。赤道经度的1度秒移动你大约100英尺。如果使用带符号的32位整数表示纬度和经度,LatE6和LonE6,则可以将最大经度存储为+/-180000000,最低有效位为:

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


我必须想象我的Garmin使用的是这样的东西,不是只有24位精度的浮点,当然也不是64位的双精度浮点。整数和双精度之间的转换应该不会花费太多。您甚至可以将一个lat/lon对打包成一个long。

这将只存储最后一个位置。只需将它们存储在ArrayList或其他类似的oracle
中,此数据类型[float]不应用于精确的值,例如货币。因此,如果您想要检索相同的值(我假设您是这样做的),您不应该将/get保存为float,而应该保存为String或Long。地理坐标不一定要精确,坐标必须精确。存储为float、double、int或long都有效。很明显,为什么从一个float到另一个double,你会失去“精度”-->准确性这确实很有意义,例如,如果你从某些坐标中获取地址字符串,然后将坐标保存为float,然后再次获取地址,你会得到完全不同的字符串。用户会想知道为什么。默认值必须是string,请更正pref.getString(“纬度”,0);到pref.getString(“纬度”,“0”);(我自己做不到,编辑必须至少6个字符)@Tilmanhausher谢谢。当我没有Eclipse对我发牢骚时,我错过了这些事情。这是正确的答案,被接受的答案失去了准确性,因此没有存储正确的值。