- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个关于 SQLite 查询的问题。我需要执行这样的 sqlite 查询:
SELECT
id, (
6371 * acos (
cos ( radians(78.3232) )
* cos( radians( lat ) )
* cos( radians( lng ) - radians(65.3234) )
+ sin ( radians(78.3232) )
* sin( radians( lat ) )
)
) AS distance
FROM markers
HAVING distance < 30
ORDER BY distance
LIMIT 0 , 20;
但是我收到错误,因为 Sqlite 不支持像 acos
这样的函数。有没有办法在 Sqlite 中执行我的查询?我需要在 iOS 上使用这个。欢迎任何实用的建议。
最佳答案
您可以在 SQLite 中实现自己的函数。例如,为 acos
编写一个 SQLite C 函数包装器:
void sqlite_acos(sqlite3_context *context, int argc, sqlite3_value **argv)
{
int dataType = sqlite3_value_numeric_type(argv[0]);
if (dataType == SQLITE_INTEGER || dataType == SQLITE_FLOAT) {
double value = sqlite3_value_double(argv[0]);
sqlite3_result_double(context, acos(value));
} else {
sqlite3_result_null(context);
}
}
您可以对所需的每个三角函数重复此过程。
然后调用sqlite3_create_function
将此C函数映射到SQL表达式:
- (BOOL)createFunctions:(sqlite3 *)db
{
int rc;
if ((rc = sqlite3_create_function(db, "acos", 1, SQLITE_ANY, NULL, sqlite_acos, NULL, NULL)) != SQLITE_OK) {
NSLog(@"%s: sqlite3_create_function acos error: %s (%d)", __FUNCTION__, sqlite3_errmsg(db), rc);
}
// repeat this for all of the other functions you define
return rc;
}
<小时/>
坦率地说,我不会编写这些单独的三角函数,而是编写一个进行更高级别距离计算的函数。这样效率会高一些。这可能看起来像:
double radians(double degrees)
{
return degrees * M_PI / 180.0;
}
void sqlite_distance(sqlite3_context *context, int argc, sqlite3_value **argv)
{
double values[4];
// get the double values for the four arguments
for (int i = 0; i < 4; i++) {
int dataType = sqlite3_value_numeric_type(argv[i]);
if (dataType == SQLITE_INTEGER || dataType == SQLITE_FLOAT) {
values[i] = sqlite3_value_double(argv[i]);
} else {
sqlite3_result_null(context);
return;
}
}
// let's give those values meaningful variable names
double lat = radians(values[0]);
double lng = radians(values[1]);
double lat2 = radians(values[2]);
double lng2 = radians(values[3]);
// calculate the distance
double result = 6371.0 * acos(cos(lat2) * cos(lat) * cos(lng - lng2) + sin(lat2) * sin(lat));
sqlite3_result_double(context, result);
}
然后您可以在 SQLite 中定义一个 distance
函数,如下所示:
int rc;
if ((rc = sqlite3_create_function(db, "distance", 4, SQLITE_ANY, NULL, sqlite_distance, NULL, NULL)) != SQLITE_OK) {
NSLog(@"%s: sqlite3_create_function distance error: %s (%d)", __FUNCTION__, sqlite3_errmsg(db), rc);
}
因此,您打开数据库,为这个 distance
函数调用 sqlite3_create_function
,然后您可以编写使用这个新 distance
函数的 SQL :
const char *sql = "SELECT "
"id, distance(lat, lng, 65.3234, 78.3232) AS distance "
"FROM markers "
"WHERE distance < 30 "
"ORDER BY distance";
if (sqlite3_prepare_v2(db, sql, -1, &statement, NULL) != SQLITE_OK)
NSLog(@"prepare failed: %s", sqlite3_errmsg(db));
while (sqlite3_step(statement) == SQLITE_ROW) {
sqlite3_int64 rowid = sqlite3_column_int64(statement, 0);
double distance = sqlite3_column_double(statement, 1);
NSLog(@"%lld %f", rowid, distance);
}
sqlite3_finalize(statement);
该distance
函数在您关闭数据库之前一直有效,因此请确保每次打开数据库时都调用sqlite3_create_function
。
关于ios - Sqlite 中的 acos 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23612538/
我在工作和家里都有一台运行 Mac OS X Leopard 的 Mac,在工作中也有一台 PC。 我在所有 3 台计算机上都设置了当前正在处理的项目,它在我的工作计算机上运行良好,但在我的家用 Ma
我有一个程序,它有一个余弦值。我希望使用这个值来找到它对应的角度。然而,acos 实际上并没有给我一个角度值(arcos 通常是这样工作的)。相反,我得到了这个(见下文)。为什么会出现这种情况,aco
因此,我正在开发一个 Web 应用程序,以便能够更轻松地将使用 Photoshop 创建的 *.ACO 或 *.ASE 格式的调色板分发给没有这些程序的同事。我在设置基础方面已经走了很长一段路,但现在
我需要一个 acos()在计算着色器中使用 double 函数。由于acos()没有内置函数在具有 double 的 GLSL 中,我尝试实现我自己的。 起初,我实现了一个泰勒级数,就像 Wiki -
这个问题已经有答案了: 已关闭11 年前。 Possible Duplicate: Query to get records based on Radius in SQLite? 我正在使用 sqli
我有点困惑。这是我的问题 mysql> select acos(cos( radians(37.09024) ) * cos( radians(37.09024) ) * cos(radians(-9
我需要找到一个平面上只有三个坐标点的三角形的角度。在等式末尾的正则三角函数中,我将使用: cos = (a ** 2) - (b ** 2) - (c ** 2) / -2 * b * c 我使用了
所以我正在编写一个程序来进行一些计算,但我注意到我没有得到我预期的结果。 我正在使用 Math.acos() 和 Math.sqrt() 函数,当我期望得到零答案时,我得到的答案非常小,几乎为零。 >
当我运行我的程序时,我试图使用余弦反函数。所以我使用 Math.Acos()。 我愿意: Console.WriteLine(Math.Acos(0.8).ToString()); 我想得到的值大约是
我正在尝试实现随机蚁群优化算法,但我在弄清楚如何根据概率实现移动选择时遇到了问题。 到目前为止我实现的标准(贪心)版本是在图 G = (V,E ) 其中E是边的集合(i, j),将根据以下标准选择下一
我有一个经度和纬度值的列表,我试图找到它们之间的距离。使用标准的大圆方法,我需要找到: acos(sin(lat1)*sin(lat2) + cos(lat1)*cos(lat2) * cos(lon
我有一个关于 SQLite 查询的问题。我需要执行这样的 sqlite 查询: SELECT id, ( 6371 * acos ( cos ( radians(78.
这是我的代码:
我的距离计算函数有一点问题,这是一个 Playground 的截图,当 tsum == 1 时,我们看到距离变量 == NaN(而不是 0) 实际上在运行时(在我的真实应用程序中,在模拟器中),t1
我正在尝试编写代码来回答包含 Acos“Cos-1(A)”的数学函数,其中 A 是 double -10.0000 <= A <= 10.0000,我已经尝试了该范围内的几个数字,其中大部分都给我一个
我正在创建一个函数,该函数使用两点的纬度/经度(以度数而非弧度为单位)和余弦球面定律来计算两点的距离。我遇到的问题是,由于函数 acos() 中的舍入误差,当两点彼此非常接近时,我获得的结果远非如此。
我试图在本地开发环境中禁用 ACL/ACO 检查,因为每次创建新方法或 Controller 时同步 ACO 表非常耗时。我在弄清楚如何有条件地执行此操作时遇到问题。我在 AppController
我试图在本地开发环境中禁用 ACL/ACO 检查,因为每次创建新方法或 Controller 时同步 ACO 表非常耗时。我在弄清楚如何有条件地执行此操作时遇到问题。我在 AppController
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 8 年前关闭。 Improve this
嘿,我从以下函数中得到“不是数字”的返回值: void Spider::setAngles(double x,double y, double l1, double l2){ double theta
我是一名优秀的程序员,十分优秀!