我知道Stackover流程中有许多可用的解决方案,但看起来没有解决我的基本问题 - 我有超过2500个lon / lat数据 - 我想从sqlite存储/检索它们 - 根据用户输入查询最近的位置。 寻找最佳解决方案
注意:我已经完成了 Finding the closest point to a given point
这个Geohashing的全部内容如何在我的特定问题中使用Geohashing
答案 0 :(得分:1)
Geohashing是纬度,经度对的编码,因此接近eaxh的点具有带共同前缀的地理位置。然而,这对于行星上的每个坐标都不起作用,即对于接近点的goehash发生显着变化的区域。根据散列算法,赤道附近的区域可能是这样的区域。 有关详细信息,请参阅此处:http://en.wikipedia.org/wiki/Geohash
对于一个相对较小的数据库。 500个位置通过搜索0.1度的间隔内的点,我能够非常快速地找到给定参考点(用户位置)的最近位置。以下是查询的代码:
/**
* Query the airfields table for airfields near the given position.
* @param dbCon DB connection
* @param ref_lat latitude
* @param ref_lon longitude
* @return Answer the airfield nearest to the given position as array
* of objects: id, designator, latitude, longitude.
* Answer <code>null</code> if their is no airfield near the
* given position plus or minus 0.1 degrees.
*/
private Object[] rangeQuery(final SQLiteDatabase dbCon, final double ref_lat, final double ref_lon) {
if( DEBUG )
Log.d( TAG, "rangeQuery lat=" + ref_lat + ", lon=" + ref_lon);
final SQLiteQueryBuilder qb = new SQLiteQueryBuilder();
qb.setTables(AirfieldsTable.TABLE_NAME);
final String[] whereArgs = new String[] {
Double.toString(ref_lat - 0.1d), Double.toString(ref_lat + 0.1d),
Double.toString(ref_lon - 0.1d), Double.toString(ref_lon + 0.1d)
};
final Cursor crsr = qb.query(dbCon, allFields(), AirfieldsTable.RANGE_CLAUSE, whereArgs, null, null, null);
final Object[] val = this.scanForNearest(crsr, ref_lat, ref_lon);
crsr.close();
if( DEBUG )
Log.d( TAG, "scanForNearest returned " + val);
return val;
}
如果选择了多行,我直接比较剩余的点(这就是scanForNearest()的作用)。它的速度足以在记录器(它的记录应用程序)检测到着陆后找到机场。