从SQLite存储和检索位置数据

时间:2012-02-14 14:04:36

标签: android

我知道Stackover流程中有许多可用的解决方案,但看起来没有解决我的基本问题 - 我有超过2500个lon / lat数据 - 我想从sqlite存储/检索它们 - 根据用户输入查询最近的位置。 寻找最佳解决方案

注意:我已经完成了 Finding the closest point to a given point

这个Geohashing的全部内容如何在我的特定问题中使用Geohashing

1 个答案:

答案 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()的作用)。它的速度足以在记录器(它的记录应用程序)检测到着陆后找到机场。