Ist es möglich, die Haversine Formel in Objective-C und nennt es von SQLite zu implementieren?
-
18-09-2019 - |
Frage
Wie ich verstehe, ist SQLite haben nicht die mathematischen Funktionen richtig die Haversine Formel in gerade SQL. Ich denke, das sollte möglich sein, ein rel="noreferrer">, mit der Implementierung in C sein .
Das Ziel ist es, eine SQLite-Datenbank in einem iPhone zu haben und den aktuellen Standort des Benutzers durch den Abstand sortieren zu können. Ich habe gesucht, aber ich kann nicht ein Beispiel von irgendwelchen Beispielen dafür getan finden. Ich denke, dass die schwierigen Teile, die die Funktionsdeklarationen immer richtig sein würde. Das Endergebnis für Ich hoffe, in der Lage sein, wie eine SQL-Anweisung auszuführen:
SELECT * FROM LOCATION loc ORDER BY distance(loc.lat, loc.long, ?, ?)
Ich habe eine C Haversine Formel. Die Funktionsdefinition lautet wie folgt:
float distance( float nLat1, float nLon1, float nLat2, float nLon2 );
Wer weiß, ob dies möglich ist und / oder einige Beispiel-Code müssen aus starten?
Lösung
Ich hatte gerade viel Glück mit diesem Beitrag: http://www.thismuchiknow.co .uk /? p = 71
Andere Tipps
Dies zeigt eine SQLite-Funktion, die in einem String-Parametern nimmt und gibt ein String Ergebnis.
In Ihrem Fall würden Sie eine Funktion benötigen, die vier Schwimmer liest und gibt einen Schwimmer, aber das Prinzip ist das gleiche (Sie würden ersetzen sqlite3_value_text mit sqlite3_value_double und sqlite3_result_text mit 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);
}