Android SQLite根据计算列(坐标距离)进行排序

4
我正在使用 SQLITE 数据库存储位置的纬度和经度。
我想要能够按当前位置与各个位置的大致距离排序结果。我已经有设备当前位置的双精度 (lat, lng),数据库中的纬度和经度也是双精度。
我需要的是一个查询,它将创建一个虚拟列,我可以通过这个列对结果进行排序。
我目前使用一个函数来显示所选记录的距离:
例如,MySQL 的选择可以是 (摘自: www.movable-type.co.uk):
当前我使用以下方法选择位置:
那么,是否可能以这种方式使用 SQLITE 数据库?如果不行,我唯一能想到的选择就是添加一个额外的列,迭代遍历每一行,在每一行上运行上面的函数并填写该行的额外列,然后对该列进行排序?
4个回答

4

这并不能完全帮助你,但对于像这样的情况,严肃考虑使用rawQuery()而不是query(),这样你可以传入完整的SQL语句而不必将其分成几部分。


你更大的问题是我没有看到SQLite有三角函数。

你没有说明如何使用从查询返回的Cursor。例如,如果你将Cursor放入某种CursorAdapter中,则可以执行以下操作:

  • Cursor转换为ArrayList<Position>,其中Position是你定义的包含数据的Java类
  • 关闭Cursor以释放它占用的RAM
  • 使用Arrays.sort()ArrayList<Position>进行排序
  • ArrayList<Position>包装在ArrayAdapter<Position>中,并在原来使用CursorAdapter的地方使用它

好的,为了测试,我创建了一个ArrayList <HashMap <String,String >>并填充了所有所需的详细信息。我还创建了一个简单的类,它扩展了对象,ArrayList<locationRowDist>。 我遍历游标并将数据放入两个列表中,同时执行距离计算并添加该值。然后我该如何进行排序呢?该类为:class locationRowDist extends Object { public String title; public double lat; public double lon; public double dist; } - Scoobler
如果“locationRowDist”是一个类,则让它实现Comparable接口,然后使用Arrays.sort()来对其进行排序。 - CommonsWare

3

是的,这个完美地运作。

它可以制作成存储过程,如下所示:

http://www.thismuchiknow.co.uk/?p=71 [sqlite的距离函数]

还有Perst空间数据库适用于android,非常好用,以及SpatiaLite 空间数据库也很棒,你可以在你的应用中链接到它们。

如果不使用专门的库,你可以通过几种方法来近似距离(将其计算为平面矩形,然后使用Haversine公式对子集进行排序,使用近似cos、sin等的查找表,将位置分组成5平方英里的区域,并搜索相邻的单元格直到最大值等)。


3
您所描述的技术似乎不适用于 Android,因为 Android 无法使用 sqlite3_create_function()。 - CommonsWare
使用一个大型位置数据库时,最好使用自己的sqlite/perst/spatialite而不是Android内置的。 - jspcal

3

0

我刚刚编写了一个应用程序,需要根据距离对一组坐标进行排序。我的做法是创建一个ID和距离的数组,并在Java中对它们进行排序。然后,我可以从数据库中查找最近的位置并选择这些位置。当然,这种方法可能不适用于您,具体取决于您有多少点以及如何访问数据库。在我的Nando's Finder应用程序中,对大约350个点非常有效。

此外,我使用了SDK中的Location.distanceBetween(..)来计算距离。我希望这种方法能够在C中实现,以确保速度快,但是,快速查看SDK源代码显示它是用Java编写的:(。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接