Я использую базу данных SQLITE для хранения широт и долгот местоположений.
Я хочу иметь возможность сортировать результаты по приблизительному расстоянию от текущего местоположения. У меня уже есть текущее местоположение устройства как double (lat, lng), lat и lng в базе данных также удваиваются.
Мне нужен запрос, который создаст виртуальный столбец, по которому я могу отсортировать результаты.
В настоящее время я использую функцию для отображения расстояния для выбранной записи:
float pk = (float) (180/3.14159);<br>
float a1 = (float) (db_lat / pk);<br>
float a2 = (float) (db_lon / pk);<br>
float b1 = (float) (current_lat / pk);<br>
float b2 = (float) (current_lon / pk);<br>
float t1 = FloatMath.cos(a1)*FloatMath.cos(a2)*FloatMath.cos(b1)*FloatMath.cos(b2);<br>
float t2 = FloatMath.cos(a1)*FloatMath.sin(a2)*FloatMath.cos(b1)*FloatMath.sin(b2);<br>
float t3 = FloatMath.sin(a1)*FloatMath.sin(b1);<br>
double tt = Math.acos(t1 + t2 + t3);<br>
double dist = (6366000*tt);
Например, выбор MySQL может быть (взят из: www.movable-type.co.uk):
Select Lat, Lon, acos(sin($lat)*sin(radians(Lat)) + cos($lat)*cos(radians(Lat))<em>cos(radians(Lon)-$lon))</em>$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? Если не единственный вариант, о котором я могу подумать, это иметь дополнительный столбец, перебирать строки, выполняющие вышеуказанную функцию в каждой строке и заполняя дополнительный столбец в строке, затем сортировать по этому столбцу?