【问题标题】:check whether given latitude and longitude is in a set of lat/lon in sqlite检查给定的纬度和经度是否在sqlite中的一组纬度/经度中
【发布时间】:2011-03-10 14:14:50
【问题描述】:

在我的 iphone 应用程序中,我有一个带有美国纬度和经度的 sqlite 表(All weather stations of USA)。什么是sqlite查询来检查给定的纬度和经度是否在sqlite的一组纬度/经度中?

我的意思是我将纽约的纬度/经度设置为 (42.75,73.80),(37,-122),但我正在搜索纽约附近的纬度/经度,例如 (42.10,73.20)

如何确定这个 (42.10,73.20) 是否在纽约附近?

  • mtoepper 的答案

SQLITE 中的自定义函数(例如 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);

【问题讨论】:

    标签: iphone objective-c sqlite


    【解决方案1】:

    我以前没用过这个,但是试试下面的查询:

    SELECT id, ( 3959 * acos( cos( 弧度(37) ) * cos( 弧度( lat ) ) * cos( 弧度( lng ) - 弧度(-122) ) + sin( 弧度(37) ) * sin ( 弧度( lat ) ) ) ) AS 距离 FROM 标记 HAVING distance

    这个查询在 SQL 中运行良好,所以试试这个。希望它在 SQLite 中也能运行。

    干杯, 普拉格尼什

    【讨论】:

    • SELECT *, ( 3959 * ACOS( COS( RADIANS(37) ) * COS( RADIANS( 纬度 ) ) * COS( RADIANS( 经度 ) - RADIANS(-122) ) + SIN( RADIANS( 37) ) * SIN( RADIANS( Latitude ) ) ) ) 作为距离邮政编码的距离
    • 必须完成函数定义函数,如 ACOS、COS、RADIANS、SIN,因为它们在 sqlite 中不可用。感谢这个美妙的 sqlite 查询
    【解决方案2】:

    为了提高性能,您可能还需要考虑存储代表每个真实纬度/经度点周围的边界框的纬度/经度对,其中兴趣点位于中心。

    然后你只是做一个简单的检查,看看感兴趣的纬度/经度是否在一个盒子里。

    找到命中后,您可以进行更复杂的循环计算,以查看它是否真的“接近”,而不是那个近似值。这些对可以计算到您认为“接近”的任何粗略距离。

    【讨论】:

      【解决方案3】:

      伟大的Pragnesh。它工作得很好。看来您在 iphone 问题上掌握得很好。

      【讨论】:

        【解决方案4】:

        假设你的表看起来有点像这样:

        stations:
        id      | name     | lat     | lng
        1617760 | Hilo, HI | 19.7303 | -155.0558
        

        查询将是

        SELECT COUNT(*) FROM stations WHERE lat=? AND lng=?
        

        (其中“?”是参数)

        如果没有匹配,你会得到一个 0,否则一个 1(假设你在一个点上没有多个站点;))

        【讨论】:

        • 对不起..我写问题的方式是错误的。我已经编辑过了。谢谢你回答我。
        • @Sijo:啊哈,现在更有意义了 :)
        猜你喜欢
        • 2021-09-04
        • 2013-09-09
        • 1970-01-01
        • 2014-03-30
        • 2017-01-07
        • 1970-01-01
        • 1970-01-01
        • 2013-06-06
        • 2021-10-05
        相关资源
        最近更新 更多