Firebird 数据库上的 Haversine 公式
Posted
技术标签:
【中文标题】Firebird 数据库上的 Haversine 公式【英文标题】:Haversine formula on a Firebird database 【发布时间】:2016-08-03 02:20:05 【问题描述】:我为 mysql 使用了以下 sql,但我现在需要将其用于 Firebird 数据库。我已经搜索并阅读了 Firebird 文档,但似乎找不到替代方法。在 Firebird 中,不支持“弧度”和“限制”。有没有人在 Firebird 中成功做过类似的事情?
SELECT zip, ( 3959 * acos( cos( radians(38.6285426) ) * cos( radians( lat ) )
* cos( radians( lng ) - radians(-86.05296039999999) ) + sin( radians(38.6285426) ) * sin(radians(lat)) ) ) AS distance
FROM zipcodes
HAVING distance < 25
ORDER BY distance
LIMIT 0 , 20;
【问题讨论】:
【参考方案1】:mySQL 中的radians
函数“返回参数 X,从度数转换为弧度”。您不需要内置函数来执行此操作,这是相当简单的数学运算:radians = degrees × π / 180º
。您可以创建一个方便的视图,其中包含用于度到弧度转换的计算列,以使查询更易于阅读。顺便说一句,Firebird 有builtin function for retrieving π value。
而不是LIMIT
火鸟supports ROWS
syntax:
SELECT <columns> FROM ...
[WHERE ...]
[ORDER BY ...]
ROWS <m> [TO <n>]
【讨论】:
虽然我非常感谢您的回答,但我可能应该更详细地说明我的问题。是的,我理解数学,是的,这是简单的数学。 mySQL 通过一个简单的查询返回 25 英里内的所有邮政编码。我想我的问题应该是 firebird 是否有类似的选择,而无需执行一些单独的附加功能和计算,并使事情变得比获得相同结果所需的更复杂。 IMO 创建一个以lat
和lng
为弧度的视图非常简单,并且使最终查询也更好(而不是radians(nn.mmm)
,您只有lat
或lng
) .但是,如果您愿意,也可以为弧度函数创建一个 UDF……但您不能像在 Firebird 中那样使用 MySQL 查询,不。
旁注:如果您使用 Firebird 3,您也可以创建 UDF,而无需创建原生库来提供该功能。【参考方案2】:
对于遇到类似问题的任何人,这是我的 Firebird 解决方案,它在一个查询中返回纬度/经度(大圆)一定英里半径内的所有邮政编码。
select zipcode from(
SELECT zipcode, ( 3959 * acos( cos( 38.6285426/57.2958 ) * cos( lat/57.2958 )
* cos( lon/57.2958 - -86.05296039999999/57.2958 ) + sin( 38.6285426/57.2958 ) * sin(lat/57.2958) ) ) AS distance
FROM zip_codes)
where distance < 20
ORDER BY distance
【讨论】:
以上是关于Firebird 数据库上的 Haversine 公式的主要内容,如果未能解决你的问题,请参考以下文章