Я использую базу данных SQLITE для хранения широт и долготы местоположений.Android 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? Если не единственный вариант, о котором я могу думать, это добавить лишний столбец, перебирать строки, выполняющие указанную выше функцию в каждой строке, и заполнять дополнительный столбец в строке, а затем сортировать по этому столбцу?
Хорошо, поэтому для тестирования я создал ArrayList> и заполнил его всеми требуются детали. Я также создал простой класс, который расширяет объект, ArrayList . Я прокручиваю курсор и помещаю данные, в настоящее время, в оба списка, так как я выполняю расчет расстояний и добавляю это. Как я мог бы выполнить сортировку? Класс: класс locationRowDist extends Объект { Публичный заголовок String; общественный двойной лат; общественный двойной лон; public double dist; } –
Scoobler
Если «locationRowDist» - это класс, попробуйте реализовать интерфейс Comparable, а затем используйте Arrays.sort() для его сортировки. – CommonsWare