android SQlite查找,关于android:在SQLite数据库中查找最接近的经纬度

谈渊
2023-12-01

本问题已经有最佳答案,请猛点这里访问。

我有一个由四列组成的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 long字符串的值引起问题,则可以在我的数据库中将它们转换为double。

任何帮助将不胜感激,因为我是真正的泡菜

香港专业教育学院寻找类似的问题的高和低,很多提到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子句,以免崩溃。 另外,请尝试靠近数据库中现有位置的位置。

不知道为什么它不起作用,我正在使用的位置是数据库中已经存在的位置,因此它应该找到它。 顺便说一句,您一直在提供帮助,我感谢您到目前为止所做的一切

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

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

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

我建议缩小数据库结果,然后找到最近的点。 要缩小结果范围,您可以首先找到用户位置"附近"的子集。 就像是

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

row_id=d.getString(0);

wind_speed=d.getString(1);

}

}

return wind_speed;

所以我猜这将是一个排序顺序?

是。 一旦将点放置在用户位置附近,则应按与用户位置的距离对它们进行排序。

我怎么能用我的代码实现这一点,我有点困惑TBH

您的问题有运气吗?

 类似资料: