基于lat/lon android查找附近的最佳实践?

基于lat/lon android查找附近的最佳实践?,android,performance,sqlite,Android,Performance,Sqlite,我的Sql Lite数据库中有16000个位置 我将所有内容都提取到游标中,并将每个内容设置到LOCATION对象中,我使用LOCATION类的distaneTo()方法 有没有最好的方法根据用户的位置找到最近的位置 我的代码::: Location userLocation = new Location("Point A"); userLocation.setLatitude(latitude); userLocation.setLongitude(longit

我的Sql Lite数据库中有16000个位置

我将所有内容都提取到游标中,并将每个内容设置到LOCATION对象中,我使用LOCATION类的distaneTo()方法

有没有最好的方法根据用户的位置找到最近的位置

我的代码:::

Location userLocation = new Location("Point A");
        userLocation.setLatitude(latitude);
        userLocation.setLongitude(longitude);

        Location stopLocation = new Location("Point B");

        List<FavouriteStop> allFavourites = new ArrayList<FavouriteStop>();

        SQLiteDatabase db = this.getReadableDatabase();
        Cursor c = db.rawQuery(
                "Select * from tbl_stop order by routeName desc", null);

        FavouriteStop stop = new FavouriteStop();
        // looping through all rows and adding to list
        if (c.moveToFirst()) {
            do {
                if (c.getString(c.getColumnIndex("stopId")) != null) {

                    // Setting Stop Location for Distance
                    stopLocation.setLatitude(c.getDouble(c
                            .getColumnIndex("lat")));
                    stopLocation.setLongitude(c.getDouble(c
                            .getColumnIndex("lon")));

                    float distance = userLocation.distanceTo(stopLocation);
                    if (distance < radius) {

                        if (allStopsHash.containsKey(c.getString(c
                                .getColumnIndex("routeName")))) {
                            // Contains
                        } else {
                            // Not Contain
                            stop.setFirstElement(true);
                            allStopsHash.put(
                                    c.getString(c.getColumnIndex("routeName")),
                                    c.getString(c.getColumnIndex("routeName")));
                        }

                        stop.settag(c.getString(c.getColumnIndex("tag")));
                        stop.settitle(c.getString(c.getColumnIndex("title")));
                        stop.setlat(c.getDouble(c.getColumnIndex("lat")));
                        stop.setlon(c.getDouble(c.getColumnIndex("lon")));
                        stop.setstopId(c.getString(c.getColumnIndex("stopId")));
                        stop.setDirection(c.getString(c
                                .getColumnIndex("towards")));
                        stop.setRouteName(c.getString(c
                                .getColumnIndex("routeName")));
                        stop.setDistance((distance / 1000));

                        allFavourites.add(stop);
                        // }
                    }// Distance Radius Over
                }// If StopId != Null Over
            } while (c.moveToNext());
        }
        db.close();
Location userLocation=新位置(“点A”);
userLocation.setLatitude(纬度);
setLongitude(经度);
位置停止位置=新位置(“B点”);
列出所有收藏夹=新建ArrayList();
SQLiteDatabase db=this.getReadableDatabase();
游标c=db.rawQuery(
“通过routeName desc从tbl_停止订单中选择*”,空);
FavoriteStop=新的FavoriteStop();
//循环遍历所有行并添加到列表
if(c.moveToFirst()){
做{
if(c.getString(c.getColumnIndex(“stopId”)!=null){
//设置距离的停止位置
stopLocation.setLatitude(c.getDouble(c
.getColumnIndex(“lat”);
stopLocation.setLength(c.getDouble(c
.getColumnIndex(“lon”);
浮动距离=userLocation.distanceTo(停止位置);
if(距离<半径){
if(allStopsHash.containsKey)(c.getString(c
.getColumnIndex(“routeName”)){
//包含
}否则{
//不包含
stop.setFirstElement(true);
全部停止(
c、 getString(c.getColumnIndex(“routeName”),
c、 getString(c.getColumnIndex(“routeName”));
}
settag(c.getString(c.getColumnIndex(“tag”));
settitle(c.getString(c.getColumnIndex(“title”));
stop.setlat(c.getDouble(c.getColumnIndex(“lat”)));
stop.setlon(c.getDouble(c.getColumnIndex(“lon”)));
setstopId(c.getString(c.getColumnIndex(“stopId”));
stop.setDirection(c.getString(c
.getColumnIndex(“走向”);
stop.setRouteName(c.getString(c
.getColumnIndex(“routeName”);
停止。设置距离((距离/1000));
所有收藏夹。添加(停止);
// }
}//距离半径超过
}//如果StopId!=空值超过
}而(c.moveToNext());
}
db.close();

SQLite无法执行基于坐标按距离排序的查询。在这种情况下,迭代点是正确的解决方案。但是,可以通过缓存列索引来改进实现。例如,不必多次调用getColumnIndex(“lat”),您可以

int latIndex = getColumnIndex("lat");

而不是总是使用拉丁索引。我从未做过检查性能改进的测试,但这肯定是更好的方法。

窗口已满:请求分配36字节,可用空间4字节,窗口大小2097152字节我有此警告…任何解决方案