android 从SQLite存储和检索位置数据

xzlaal3s  于 2023-08-01  发布在  Android
关注(0)|答案(2)|浏览(127)

我知道Stackover流中有许多可用的解决方案,但看起来没有一个解决我的基本问题是-我有超过2500个经度/纬度数据-我想从sqlite存储/检索它们-根据用户输入查询最近的位置。寻找最佳解决方案
注意:我已经浏览了Finding the closest point to a given point
这是什么Geohashing所有关于如何使用Geohashing在我这个特殊的问题

jc3wubiy

jc3wubiy1#

地理散列是纬度、经度对的编码,使得彼此接近的点具有带有公共前缀的地理散列。然而,这并不适用于行星上的每个坐标,即存在Goehash对于邻近点显著变化的区域。根据散列算法,赤道附近的区域可以是这样的区域。更多详情请看这里:http://en.wikipedia.org/wiki/Geohash
对于一个相对较小的ca数据库。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()所做的)。在记录器(它是一个记录应用程序)检测到降落后,它足够快地找到机场。

aurhwmvo

aurhwmvo2#

考虑使用Spatialite
SpatiaLite是一个开源库,旨在扩展SQLite核心以支持完全成熟的Spatial SQL功能。可以使用空间索引和专用函数来计算几何图形(点、线、多边形)之间的距离。

相关问题