在SQLite数据库中查找最接近的lat和long

时间:2014-08-04 00:30:42

标签: android database sqlite

我有一个由四列组成的SQLite数据库--ID,WindSpeed,Longitude和Latitude。

我正在做的是,使用GPS使用Android位置服务获取用户的纬度和经度,然后使用数据库查询该位置的纬度和经度,以查找该位置的风速。

但是正如香港专业教育学院提到的,我遇到了一些问题,如果我在表格中使用正确的纬度和长度,我的查询工作但我需要做的是找到最近的纬度和长度以及由此产生的风速用户当前位置。

因此,如果lat和long为51.652161和-3.0567927,它会在我的数据库中找到最接近这两个值的值,并返回该行返回的合成风速。

所以我放入我当前的纬度,并且在表格中找到最接近它们的两个相遇的值,然后给出它们相遇的风速值。

这是我的代码

public class MyDatabase extends SQLiteAssetHelper {

private static final String DATABASE_NAME = "WindSpeed.sqlite";
private static final int DATABASE_VERSION = 1;
private static final String LAT_VAL = "Latitude";
private static final String LONG_VAL = "Longitude";
private static final String WIND_SPEED= "Windspeed";
private static final String ROW_ID=     " _id";

public MyDatabase(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}
 public Double getWindSpeed2(){

    double Long = postcodeInput.getlng();  
    double Lat = postcodeInput.getlat();

    SQLiteDatabase db = getReadableDatabase();
    SQLiteQueryBuilder qb = new SQLiteQueryBuilder();

    String [] sqlSelect = {ROW_ID,WIND_SPEED,LAT_VAL,LONG_VAL}; 
    String sqlTables = "WindSpeed";
    String whereClause = LAT_VAL+" = ? AND "+ LONG_VAL +" = ?";
    String[] whereArgs = new String[] {
            String.valueOf(Lat),
            String.valueOf(Long)
        };
    qb.setTables(sqlTables);
    Cursor d = qb.query(db, sqlSelect, whereClause, whereArgs,
            null, null, null);
   if (d != null ){
       d.moveToFirst();

    String Windd = d.getString(1);

    double win_d = 0.0;

    win_d= Double.parseDouble(Windd);


    return win_d;
   }
   return null;
}
 }

如果lat和long是字符串的值导致问题,这些可以在我的数据库中转换为double。

任何帮助都会得到批评,因为我是一个真正的泡菜

我搜索过类似问题的高低,并提到havernsine forumla,但我不确定如何实现与我的相同。 谢谢

修改

所以我试图实现什么是laborno,但是我无法让它在这里工作就是我正在使用的代码!

我必须使用两个游标或更改我的数据库吗?

public class MyDatabase扩展了SQLiteAssetHelper {

private static final String DATABASE_NAME = "WindSpeed.sqlite";
private static final int DATABASE_VERSION = 1;
private static final String LAT_VAL = "Latitude";
private static final String LONG_VAL = "Longitude";
private static final String WIND_SPEED= "Windspeed";
private static final String ROW_ID=     " _id";
private static final double Lat=   58.0745976;
private static final double Long=  -5.3846407;
public MyDatabase(Context context) {
    super(context, DATABASE_NAME, null, DATABASE_VERSION);
}

public Double getWindSpeed2(){

    double fudge = Math.pow(Math.cos(Math.toRadians(Lat)),2);

    SQLiteDatabase db = getReadableDatabase();
    SQLiteQueryBuilder qb = new SQLiteQueryBuilder();


    String wind_speed=null;
    double min_distance=99999999;

    String [] sqlSelect = {WIND_SPEED,LAT_VAL,LONG_VAL}; 
    String sqlTables = "WindSpeed";
    String whereClause = " ? between "+LAT_VAL+"- 0.1 and "+LAT_VAL+" + 0.1 and ?     between "+LONG_VAL+" - 0.1 and "+LONG_VAL+" + 0.1";
    String[] whereArgs = new String[] {
            String.valueOf(Lat),
            String.valueOf(Long)};
    qb.setTables(sqlTables);
    Cursor d = qb.query(db, sqlSelect, whereClause, whereArgs,
            null, null, null);
   if (d != null ){
 d.moveToFirst();
  double lat_v =Double.parseDouble(d.getString(3));
    double long_v=Double.parseDouble(d.getString(2));
     double dis = (Math.sqrt(lat_v-Lat)*(lat_v-Lat) + (long_v-Long)*(long_v-Long) );
     if (dis < min_distance){
     wind_speed=d.getString(1);
      double windd = Double.parseDouble(wind_speed);

   return windd;
   }
     }
   return null;
}
}

但它似乎没有计算结果而且我得到了错误。 以下是错误代码

08-04 12:51:32.007: E/AndroidRuntime(1458): FATAL EXCEPTION: main
08-04 12:51:32.007: E/AndroidRuntime(1458):         android.database.CursorIndexOutOfBoundsException: Index 0 requested, with a size of 0
08-04 12:51:32.007: E/AndroidRuntime(1458):     at android.database.AbstractCursor.checkPosition(AbstractCursor.java:424)
08-04 12:51:32.007: E/AndroidRuntime(1458):     at android.database.AbstractWindowedCursor.checkPosition(AbstractWindowedCursor.java:136)
08-04 12:51:32.007: E/AndroidRuntime(1458):     at android.database.AbstractWindowedCursor.getString(AbstractWindowedCursor.java:50)
08-04 12:51:32.007: E/AndroidRuntime(1458):     at com.example.mobilegreenenergyevaluator.MyDatabase.getWindSpeed2(MyDatabase.java:80)
08-04 12:51:32.007: E/AndroidRuntime(1458):     at com.example.mobilegreenenergyevaluator.postcodeInput$2.onClick(postcodeInput.java:67)
08-04 12:51:32.007: E/AndroidRuntime(1458):     at android.view.View.performClick(View.java:4204)
08-04 12:51:32.007: E/AndroidRuntime(1458):     at android.view.View$PerformClick.run(View.java:17355)
08-04 12:51:32.007: E/AndroidRuntime(1458):     at android.os.Handler.handleCallback(Handler.java:725)
08-04 12:51:32.007: E/AndroidRuntime(1458):     at android.os.Handler.dispatchMessage(Handler.java:92)
08-04 12:51:32.007: E/AndroidRuntime(1458):     at android.os.Looper.loop(Looper.java:137)
08-04 12:51:32.007: E/AndroidRuntime(1458):     at android.app.ActivityThread.main(ActivityThread.java:5041)
08-04 12:51:32.007: E/AndroidRuntime(1458):     at java.lang.reflect.Method.invokeNative(Native Method)
08-04 12:51:32.007: E/AndroidRuntime(1458):     at java.lang.reflect.Method.invoke(Method.java:511)
08-04 12:51:32.007: E/AndroidRuntime(1458):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
08-04 12:51:32.007: E/AndroidRuntime(1458):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
08-04 12:51:32.007: E/AndroidRuntime(1458):     at dalvik.system.NativeStart.main(Native Method)
08-04 12:51:34.327: E/Trace(1475): error opening trace file: No such file or directory (2)

1 个答案:

答案 0 :(得分:2)

要找到最近的ponit,你必须计算两个ponits之间的距离。

distance=sqrt( (x1-x0)^2 + (y1-y0)^2)

然后找到用户位置和数据库之间的最小距离d。但是,如果您的数据库中有数千或数百万的数据,这是非常昂贵的。

我建议缩小数据库结果,然后找到最近的点。为了缩小结果范围,您可以先找到ponits&#34; near&#34;到用户位置。像

这样的东西
String whereClause = " ? between "+LAT_VAL+"- 0.1 and "+LAT_VAL+" + 0.1 and ? between "+LONG_VAL+" - 0.1 and "+LONG_VAL+" + 0.1"

然后找到最小距离(未经测试):

String [] sqlSelect = {ROW_ID,WIND_SPEED,LAT_VAL,LONG_VAL}; 
...

String row_id=null;
String wind_speed=null;
double min_distance=99999999;
if (d != null && d.moveToFirst()){
  double lat_v=Double.parseDouble(d.getString(2));
  double long_v=Double.parseDouble(d.getString(3));
  double dis=sqrt( (lat_v-Lat)*(lat_v-Lat) + (long_v-Long)*(long_v-Long) )
  if (dis<min_distance){
    row_id=d.getString(0);
    wind_speed=d.getString(1);
  }
}

return wind_speed;