检查给定的纬度和经度是否在sqlite中的一组lat / lon中

时间:2010-07-01 11:24:52

标签: iphone objective-c sqlite

在我的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)是否在纽约附近?

  • 回答mtoepper

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);

4 个答案:

答案 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(假设你在一个点上没有多个站点;)