5

据我了解,SQLite 没有数学函数来在直接 SQL 中正确实现Haversine公式。我认为这应该可以使用外部函数,实现在 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 );

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

4

2 回答 2

4

这演示了一个 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);
}
于 2009-11-08T10:55:09.887 回答
4

我刚刚在这篇文章中祝你好运:http ://www.thissuchiknow.co.uk/?p=71

于 2010-01-16T21:30:52.073 回答