我正在使用 SQLITE 数据库来存储位置的纬度和经度。
我希望能够按与当前位置的粗略距离对结果进行排序。我已经将设备的当前位置作为双精度(lat,lng),数据库中的 lat 和 lng 也是双精度的。
我想要的是一个查询,它将创建一个我能够对结果进行排序的虚拟列。
我目前使用一个函数来显示所选记录的距离:
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 选择可能是(取自: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 数据库吗?如果不是我能想到的唯一选择是有一个额外的列,遍历在每一行上运行上述函数的行并在该行上填写一个额外的列,然后对该列进行排序?