【发布时间】:2011-08-15 23:16:08
【问题描述】:
我希望能够使用各种三角函数来使用 SQLite 数据库从 ruby 中找到纬度和经度之间的距离。 SQLite 不提供三角函数(cos、sin、pow)所以我正在寻找如何实现这些函数 - 有什么想法吗?
我知道我可以使用其他数据库(PostgreSQL、MySQL 等),但我需要使用 SQLite,因此不需要安装数据库。关于如何编译可以插入到 sqlite3 gem 中的 SQLite 扩展的任何想法?
谢谢!
【问题讨论】:
-
您确定要在数据库级别而不是在 Ruby 中执行此操作吗?为什么?
-
@Henning 如果您有大量数据集或需要大量调用此函数(例如,使用大型数据集进行实时位置搜索、跑步旅行,则在 sqlite 级别使用 C 语言执行此操作会快几个数量级)计划算法、数据分析等)虽然在这些情况下,您通常会在 C/C++ 中实现整个事物,然后将其包装在 ruby 中。我通常做的是近似距离以减少 sql 中的样本大小,然后在 ruby 中运行距离计算。这假设您已将样本量减少到足够小。任何超过 500 点,速度差异就会变得明显。
-
@Charles:是的,但看起来 OP 正在寻求将其作为 SQL 表达式来执行,而不是 C 或 Ruby。如果 OP 计划将 C/C++ 用于球面距离,那么我不明白问题是什么。 C 确实有三角函数。
-
@Henning,OP 还询问了有关为 sqlite 编译扩展的问题,所以我认为这意味着自定义 sqlite 函数sqlite.org/capi3ref.html#sqlite3_create_function,然后将其包装成一个 ruby 扩展,这是相当多的工作。
-
我对我面临的问题的理解可能并不完整——我有一个语句可以在 MySQL 中使用
sin、cos、atan2、pow等(反hasrsine 公式),我想用它来按距离某个点的升序列出我的 SQLite 数据库的所有行。此表中的行数不可能超过几千行,但我想优化速度。