在我的iphone应用程序中,我有一个sqlite表,其纬度和经度为USA(All weather stations of USA)。什么是sqlite查询来检查给定的纬度和经度是否在sqlite中的一组lat / lon中?
我的意思是我将纽约的纬度/经度设置为(42.75,73.80),(37,-122)但我正在寻找纽约附近的纬度/经度,如(42.10,73.20)
如何找到(42.10,73.20)是否在纽约附近?
SQLITE中的自定义函数(Eg.ACOS)
//Include this code in your project
static void ACOSFunc(sqlite3_context *context, int argc, sqlite3_value **argv)
{
assert(argc == 1);
if (sqlite3_value_type(argv[0]) == SQLITE_NULL) {
sqlite3_result_null(context);
return;
}
double input = sqlite3_value_double(argv[0]);
sqlite3_result_double(context, acos(input) );
}
在创建数据库连接后添加它。
sqlite3_create_function(db.sqliteHandle, "ACOS", 1, SQLITE_UTF8, NULL, &ACOSFunc, NULL, NULL);
答案 0 :(得分:4)
我之前没有使用过这个,但请尝试以下查询:
SELECT id,(3959 * acos(cos(radians(37))* cos(弧度(lat))* cos(弧度(lng) - 弧度(-122))+ sin(弧度(37))* sin (弧度(纬度))))AS距离 来自距离<标记的标记。 25 ORDER BY距离LIMIT 0,20;
这个查询在SQL中运行正常,所以试试吧..希望它能在SQLite中运行。
干杯, Pragnesh
答案 1 :(得分:2)
为了提高性能,您可能还需要考虑存储表示每个实际纬度/经度点周围的边界框的纬度/长度对,它们在中心有兴趣点。
然后你只是做一个简单的检查,看看感兴趣的纬度/长度是否在一个方框内。
找到命中后,你可以做一个更复杂的循环计算,看看它是否真的“接近”,而不是那个近似值。这些对可以计算到您认为“接近”的任何粗略距离。
答案 2 :(得分:1)
伟大的Pragnesh。它工作得很好。看来你对iphone问题有很好的帮助。
答案 3 :(得分:0)
假设你的表看起来像这样:
stations:
id | name | lat | lng
1617760 | Hilo, HI | 19.7303 | -155.0558
查询将是
SELECT COUNT(*) FROM stations WHERE lat=? AND lng=?
(“?”是参数)
如果没有匹配,你将获得0,否则为1(假设你在一个点上没有多个站点;)