2009-11-08 9 views
5

Come ho capito, SQLite non ha le funzioni matematiche per implementare correttamente la formula Haversine in SQL diretto. Sto pensando che questo dovrebbe essere possibile usando un external function, con l'implementazione in C.È possibile implementare la formula di Haversine in Objective-C e chiamarla da SQLite?

L'obiettivo è quello di avere un database SQLite in un iPhone e di essere in grado di ordinare in base alla distanza dalla posizione corrente dell'utente. Ho cercato, ma non riesco a trovare un esempio di alcun esempio di ciò che viene fatto. Penso che le parti difficili sarebbero ottenere le dichiarazioni di funzione corrette. Il risultato finale spero in, è quello di essere in grado di eseguire un'istruzione SQL come:

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

ho una formula C Haversine. La definizione di funzione è la seguente:

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

Qualcuno sa se questo è possibile e/o avere qualche codice di esempio per iniziare?

risposta

4

Ciò dimostra una funzione sqlite che accetta un parametro di stringa e restituisce un risultato di stringa.

Nel tuo caso si avrebbe bisogno di una funzione che legge quattro carri e restituisce un float, ma il principio è lo stesso (si dovrebbe sostituire sqlite3_value_text con sqlite3_value_double e sqlite3_result_text con 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); 
} 
Problemi correlati