web-dev-qa-db-ja.com

どこに保存するかAndroid GPS(緯度、経度)ポイント?

OnLocationChangedイベントで、GPSルート(緯度、経度)を保存したいと思います。後でこのデータをロードしてルートを描きたいと思います。

配列タイプ(およびデータベースを使用して保存またはロード)またはXMLファイルなどを使用してこれを行うための最良の方法は誰ですか?

ありがとう。

17
Jovan

精度を失うことなくSharedPreferencesにdouble値を格納する最良の方法は次のとおりです。

  • ビット表現に変換して、それを長く保存します。

    prefsEditor.putLong("Latitude", Double.doubleToLongBits(location.getLatitude()));
    
  • 取得するには、ビット表現からダブルに変換します。

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

ただし、大量のポイントを保存する場合は、SharedPreferencesのKey-Valueペアで各座標を保存したり、XMLで配列をシリアル化してファイルまたはSharedPreferencesに書き込むよりも、SQLiteデータベースを使用する方がよいと思います。データベースには、マップに表示しているエリア内のポイントのみをメモリにロードするという利点があるため、メモリを節約できます。

72
Juan T

私が間違っている場合は訂正してください。ただし、double値を文字列に変換してから、呼び出すたびにdoubleに戻す方がよい場合があります。苦痛のように聞こえますが、OracleのWebサイト( http://download.Oracle.com/javase/tutorial/Java/nutsandbolts/datatypes.html )は次のように述べています。

「浮動小数点数の大きな配列でメモリを節約する必要がある場合は、(doubleではなく)floatを使用してください。このデータ型は、通貨などの正確な値には使用しないでください。」

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

次に、値を呼び出すには

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

それは間違いなく厄介なように思えますが、少しずれているのではなく、保存した正確な値を返す可能性も高いようです。そして、それはあなたが値をどれだけ完全に正確にする必要があるかに依存すると思います。

しかし、配列を使用する限り、私はそれらを使用する必要がなく、それらの経験がないので、私は無知です。

11
Reed

マップでアプリを実行しているときにも同じ問題が発生しました。実際、良い質問だと思います。

あなたはこのようにすることができます。

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をKEYと値のペアに格納できます。ここで、値1を緯度、値2を長さとする必要があります。のオブジェクトを渡します
value(value1、value2)からキーと値のペア。

3>これで、通過したすべての緯度と経度のリストが表示されます。次に、最初のインデックスから最後のインデックスへのルートを描画します。

これは私がこのアプリを実装するための最良の方法だと思うものです。

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);
}
0
magicman

データを表すために必要な精度(精度ではない)について考えてください。数インチは十分に近いでしょうか?ほとんどのハンドヘルドGPS受信機は、数メートルの距離にあるのは幸運です。赤道での経度1度秒は、約100フィート移動します。緯度と経度を表す符号付き32ビット整数LatE6とLonE6を使用する場合、最大の経度を+/- 180,000,000として格納でき、最下位桁は次のとおりです。

(1/1E6)*(3600秒/度)*(100フィート/秒)= 0.36フィートまたは4インチ。

私のGarminがこのようなものを使用していると想像する必要があります。精度が24ビットしかないフロートではなく、64ビットの倍精度ではありません。整数と倍精度の変換はそれほどコストがかからないはずです。 lat/lonペアをlongにパックすることもできます。

0
Charles Mack