【问题标题】:Is it possible to implement the Haversine formula in Objective-C and call it from SQLite?是否可以在 Objective-C 中实现 Haversine 公式并从 SQLite 调用它?
【发布时间】:2010-12-14 07:16:29
【问题描述】:

据我了解,SQLite 没有数学函数来在直接 SQL 中正确实现 Haversine 公式。我认为这应该可以使用external function 实现,并在 C 中实现。

目标是在 iPhone 中拥有一个 SQLite 数据库,并能够按与用户当前位置的距离进行排序。我已经搜索过了,但我找不到任何这样做的例子。我认为困难的部分是让函数声明正确。我希望的最终结果是能够执行如下 SQL 语句:

SELECT * FROM LOCATION loc ORDER BY distance(loc.lat, loc.long, ?, ?)

我有一个 C Haversine 公式。函数定义如下:

float distance( float nLat1, float nLon1, float nLat2, float nLon2 );

有人知道这是否可行和/或有一些示例代码可以开始吗?

【问题讨论】:

    标签: iphone objective-c sqlite haversine great-circle


    【解决方案1】:

    这演示了一个 sqlite 函数,它接受一个字符串参数并返回一个字符串结果。

    在您的情况下,您需要一个读取四个浮点数并返回一个浮点数的函数,但原理是相同的(您可以将 sqlite3_value_text 替换为 sqlite3_value_double 和 sqlite3_result_text 与 sqlite3_result_double):

    #include <stdlib.h>
    #include <sqlite3.h>
    #include <stdio.h>
    
    
    void haver(sqlite3_context* ctx,int cnt,sqlite3_value** val)
    {
        printf("In SQLite haver implementation, called for value: %s\n", sqlite3_value_text(*val));
    
        char * resultOfCall = "Result of function call"; //this would call the distance function
        sqlite3_result_text(ctx, resultOfCall, strlen(resultOfCall), NULL);
    }
    int cback (void* udata,int ncol,char** value,char** colname)
    {
        int i=0;
        for(;i<ncol;i++)
        printf("Result column: %s value: %s   \n", colname[i], value[i]);
        return 0;
    }
    int main()
    {
    
        sqlite3 * handle;
        int res = sqlite3_open("./test.sql", &handle);
    
        res = sqlite3_create_function(handle, "haver", 1, SQLITE_UTF8, NULL, &haver, NULL, NULL);
    
        char * errmsg = NULL;   
        res = sqlite3_exec(handle, "select haver(w) from t", &cback, NULL, &errmsg);
        printf("sqlite3_exec result: %d %s\n", res, errmsg != NULL ? errmsg : "No error");
    
        sqlite3_close(handle);
    }
    

    【讨论】:

      【解决方案2】:

      我刚刚好运发了这个帖子:http://www.thismuchiknow.co.uk/?p=71

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-20
        • 2023-03-06
        • 2013-01-11
        相关资源
        最近更新 更多