私は場所の緯度と経度を保存するために 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 データベースを使用することは可能ですか? 私が考えることができる唯一のオプションが余分な列を持つことではない場合、各行で上記の関数を実行し、行の余分な列に記入してから、その列でソートしますか?