É possível implementar a fórmula Haversine em Objective-C e chamá-lo de SQLite?
-
18-09-2019 - |
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?
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);
}