I am using an SQLITE database to store latitudes and longitudes of locations.
I want to be able to sort the results by rough distance from the current location. I already have the current location of the device as a double (lat, lng), the lat and lng in the database are also doubles.
What I want is a query that will create a virtual column that I am able to sort the results by.
I currently use a function to show the distance for a selected record:
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);
For example, a MySQL select could be (taken from: 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
Currently I select locations using the following:
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;
}
}
OK so is it possible to use the SQLITE database in this way? If not the only option I can think of is to have an extra column, iterate through the rows running the above function on each row and filling out an extra column on the row, then sorting on that column?
This won't completely help, but for situations like this, seriously consider using rawQuery()
instead of query()
, so you can pass in a full SQL statement vs. having to chop it into pieces.
Your bigger problem is that I don't see that SQLite has trigonometric functions.
You do not indicate how you are using the Cursor
you are getting back from your query. For example, if you are putting the Cursor
into some sort of CursorAdapter
, you could:
Cursor
into an ArrayList<Position>
, where Position
is some Java class you define with your dataCursor
, to release the RAM it takes upArrayList<Position>
using Arrays.sort()
ArrayList<Position>
in an ArrayAdapter<Position>
and use that where you had been using your CursorAdapter
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With