【问题标题】:Find closest lat and long in an SQLite database [duplicate]在 SQLite 数据库中查找最近的经纬度 [重复]
【发布时间】:2014-09-26 10:26:18
【问题描述】:

我有一个由四列组成的 SQLite 数据库 - ID、WindSpeed、经度和纬度。

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

但正如我提到的,我遇到了一点问题,如果我在表中使用正确的纬度和经度,我的查询就可以工作,但我需要做的是找到最近的经度和经度以及由此产生的风速用户当前位置。

因此,如果纬度和经度分别为 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 字符串的值导致问题,这些可以在我的数据库中转换为双精度值。

任何帮助将不胜感激,因为我在一个真正的泡菜中

我已经搜索过类似问题的高低搜索,并且很多人提到了havernsine forumla,但我不确定我的id是如何实现的。 谢谢

编辑

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

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

公共类 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)

【问题讨论】:

  • 这些都在使用 MySql,我不确定 id 如何将其转换为 SQLite
  • 要提出新问题,请使用“”按钮。
  • 查询似乎没有得到结果。我更改了 IF 子句,因此它不会崩溃。另外,请尝试靠近数据库中现有位置的位置。
  • 不知道为什么它不工作,我使用的位置是一个已经在数据库中的位置,所以它应该找到它。顺便说一句,您提供了很多帮助,我感谢您迄今为止所做的一切

标签: android database sqlite


【解决方案1】:

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

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

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

我建议缩小数据库结果,然后找到最近的点。要缩小结果范围,您可以首先找到“靠近”用户位置的 ponits。类似的东西

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;

【讨论】:

  • 所以我猜这将是一个排序顺序?
  • 是的。一旦您在用户位置附近获得了点,那么您应该按到用户位置的距离对它们进行排序。
  • 我怎么能用我的代码实现这个,我有点困惑 tbh
  • 你的问题好运吗?
猜你喜欢
  • 2021-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-22
  • 1970-01-01
  • 2013-05-25
  • 1970-01-01
相关资源
最近更新 更多