Pergunta

Como eu entendo, SQLite não tem as funções matemáticas para implementar correctamente a fórmula Haversine em SQL reta. Estou pensando isso deve ser possível usar um externo função , com a implementação de estar em C .

O objetivo é ter um banco de dados SQLite em um iPhone, e para ser capaz de resolver com a distância a localização atual do usuário. Eu procurei, mas não consigo encontrar um exemplo de algum exemplo de este ser feito. Eu acho que as partes difíceis estaria recebendo a função declarações corrigir. O resultado final Estou esperando, é ser capaz de executar uma instrução SQL como:

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

Eu tenho uma fórmula C Haversine. A definição da função é a seguinte:

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

Alguém sabe se isso é possível e / ou ter algum código de exemplo para começar?

Foi útil?

Solução

Eu apenas tive sorte com este post: http://www.thismuchiknow.co .uk /? p = 71

Outras dicas

Isso demonstra uma função sqlite que leva em um parâmetro de cadeia e devolve um resultado string.

No seu caso, você precisaria de uma função que lê quatro carros alegóricos e retorna um float, mas o princípio é o mesmo (você iria substituir sqlite3_value_text com sqlite3_value_double e sqlite3_result_text com 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);
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top