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 创建一个以latlng 为弧度的视图非常简单,并且使最终查询也更好(而不是radians(nn.mmm),您只有latlng) .但是,如果您愿意,也可以为弧度函数创建一个 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 公式的主要内容,如果未能解决你的问题,请参考以下文章

Firebird 中是不是有详细的调试功能?

Firebird与MySQL:一个使用者的体会

Firebird 是适用于 ASP.NET 的良好嵌入式数据库吗?还有哪个?

为Haversine距离准备数据

FireDac Firebird和Android

firebird数据库的问题么? FlameRobin 如何使用?