4

私は場所の緯度と経度を保存するために SQLITE データベースを使用しています。

現在地からの大まかな距離で結果をソートできるようにしたい。私はすでにデバイスの現在の位置を double (lat, lng) として持っています。データベースの lat と lng も double です。

私が欲しいのは、結果を並べ替えることができる仮想列を作成するクエリです。

現在、選択したレコードの距離を表示する関数を使用しています。

float pk = (float) (180/3.14159);
float a1 = (float) (db_lat / pk);
float a2 = (float) (db_lon / pk);
float b1 = (float) (current_lat / pk);
float b2 = (float) (current_lon / pk);
float t1 = FloatMath.cos(a1)*FloatMath.cos(a2)*FloatMath.cos(b1)*FloatMath.cos(b2);
float t2 = FloatMath.cos(a1)*FloatMath.sin(a2)*FloatMath.cos(b1)*FloatMath.sin(b2);
float t3 = FloatMath.sin(a1)*FloatMath.sin(b1);
double tt = Math.acos(t1 + t2 + t3);
double dist = (6366000*tt);

たとえば、MySQL の select は次のようになります (www.movable-type.co.uk から取得):

Select Lat, Lon, acos(sin($lat)*sin(radians(Lat)) + cos($lat)*cos(radians(Lat))cos(radians(Lon)-$lon))$R As dist From MyTable ORDER BY dist DESC

現在、次を使用して場所を選択しています。

public Cursor locationGetAllRows(long groupid) { try { return db.query(LOCATION_DATABASE_TABLE, new String[] { "_id", "lat","lon","groupid"}, "groupid="+groupid, null, null, null, null); } catch (SQLException e) { Log.e("Exception on query: ", e.toString()); return null; } }

では、この方法で SQLITE データベースを使用することは可能ですか? 私が考えることができる唯一のオプションが余分な列を持つことではない場合、各行で上記の関数を実行し、行の余分な列に記入してから、その列でソートしますか?

4

4 に答える 4

4

これは完全には役に立ちませんが、このような状況では、rawQuery()代わりに を使用することを真剣に検討しquery()てください。そうすれば、完全な SQL ステートメントを渡すことができ、細かく切り刻む必要がなくなります。


あなたのより大きな問題は、SQLite に三角関数があることがわかりません。

Cursorクエリから戻ってきたのをどのように使用しているかを示していません。たとえば、Cursorをある種の に入れる場合、次のCursorAdapterことができます。

  • をに変換Cursorします。 は、データArrayList<Position>Position定義した Java クラスです。
  • を閉じてCursor、使用している RAM を解放します
  • ArrayList<Position>を使用して並べ替えるArrays.sort()
  • で包み、ArrayList<Position>使用ArrayAdapter<Position>していた場所で使用します。CursorAdapter
于 2010-01-09T19:08:22.147 に答える
3

私のアプリ BostonBusMap では、近似を使用して、ポイントに最も近いオブジェクトの計算を高速化しました。経度をスケーリングしcos(latitude)、ピタゴラスの式を使用して並べ替え距離を計算できます (比較距離には必要ないため、正方形のルートは省略します)。短い距離ではかなりうまく機能します。

出典: http://en.wikipedia.org/wiki/Geographical_distance#Spherical_Earth_projected_to_a_plane

于 2012-09-17T00:48:40.650 に答える
3

ええ、それは完全に機能します。

次のようにストアド プロシージャにすることができます。

http://www.thismuchiknow.co.uk/?p=71 [sqliteの距離関数]

また、優れたAndroid 用の Perst 空間データベースと、アプリでリンクできる優れたSpatiaLite空間データベースもあります。

特殊なライブラリを使用せずに、いくつかの方法で距離を概算できます (平面 (長方形) であるかのように計算し、Haversine 式を使用して後でサブセットを並べ替え、cos、sin などを概算するルックアップ テーブルを使用します)。 、場所を 5 平方マイルのゾーンにグループ化し、近隣のセルを最大まで検索するなど...)

于 2010-01-09T18:16:54.683 に答える
0

距離に基づいて一連の座標を並べ替える必要があるアプリを作成しました。私がしたことは、ID と距離の配列を作成し、それらを Java 内でソートすることでした。次に、最寄りの場所を見つけて、データベースから選択することができました。もちろん、ポイントの数やデータベースへのアクセス方法によっては、このアプローチがうまくいかない場合があります。私のNando's Finderアプリでは、これは〜350ポイントでうまくいきました。

さらに、SDK の Location.distanceBetween(..) を使用して距離を計算しました。このメソッドが確実に高速になるように C で実装されることを願っていますが、SDK ソースをざっと見てみると、Java で記述されていることがわかります :(.

于 2010-01-09T19:52:49.247 に答える