SQLITE得到最近的位置(有纬度和经度)

SQLITE得到最近的位置(有纬度和经度)

我将纬度和经度的数据存储在SQLite数据库中,我希望获得与我输入的参数(例如)最近的位置。我现在的位置-lat/lng,等等。

我知道在MySQL中这是可能的,而且我已经做了相当多的研究,SQLite需要为Haversine公式定制一个外部函数(计算球面上的距离),但是我还没有找到用Java编写和工作的任何东西。

另外,如果我想添加自定义函数,我需要org.sqlite.jar(用于org.sqlite.Function),这给应用程序增加了不必要的大小。

另一方面,我需要SQL中的ORDERBY函数,因为仅显示距离并不是什么大问题-我已经在自定义SimpleCursorAdapter中这样做了,但是我无法对数据进行排序,因为我的数据库中没有Range列。这意味着每次位置变化时都会更新数据库,这是对电池和性能的浪费。因此,如果有人想用不在数据库中的列对游标进行排序,我也会非常感激的!

我知道有很多Android应用程序都在使用这个功能,但是谁能解释一下这个神奇之处呢?

顺便说一句,我发现了另一种选择:查询基于SQLite中的Radius获取记录?

它建议为lat和lng的cos和sin值设置4个新列,但是还有其他的,没有多余的方法吗?


宝慕林4294392
浏览 997回答 3
3回答

慕妹3242003

只有在使用直线坐标(例如UTM或OS网格引用)时才能工作。如果对LAT/LNG使用度(如WGS 84),则上述仅在赤道工作。在其他纬度,你需要减少经度对排序顺序的影响。(想象一下你离北极很近.纬度和任何地方都是一样的,但经度可能只有几英尺。这将意味着排序顺序不正确)。如果您不在赤道,根据您当前的纬度预先计算软糖因子:<fudge> = Math.pow(Math.cos(Math.toRadians(<lat>)),2);然后按:((<lat> - LAT_COLUMN) * (<lat> - LAT_COLUMN) +     (<lng> - LNG_COLUMN) * (<lng> - LNG_COLUMN) * <fudge>)它仍然只是一个近似,但比第一个要好得多,所以排序顺序的不准确会更加罕见。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java
Android