自定义MySQL函数来计算Haversine距离?

时间:2011-06-17 12:01:32

标签: mysql

我正在构建一个“找到我最近的”脚本,我的客户已经向我提供了他们的位置列表。经过一些研究,我确定这样做的方法是对用户给出的地址/邮政编码进行地理编码,并使用Haversine公式来计算距离。

公式明智,我从this question得到了我想要的答案(对你们这些人而言)。所以我不会在这里重复冗长的查询/公式。

作为一个例子,我希望能够做到的是:

SELECT address, haversine(@myLat,@myLong,db_lat,db_long,'MILES') .....

这将更容易记住,以后更容易阅读,并且通过将功能复制到未来的项目中而不必重新学习/重新集成大公式,可以更加重复使用。此外,最后一个参数可以帮助我们以不同的单位返回距离。

是否可以创建用户MySQL函数/过程来执行此操作,我将如何进行此操作? (我认为这就是它们的用途,但我从来不需要使用它们!)

它会在长版本上提供任何速度差异(无论哪种方式)?

1 个答案:

答案 0 :(得分:3)

是的,您可以为此创建一个存储的函数。像这样:

DELIMITER //
  DROP FUNCTION IF EXISTS Haversine //
  CREATE FUNCTION Haversine
    ( myLat FLOAT
    , myLong FLOAT
    , db_lat FLOAT
    , db_long FLOAT
    , unit VARCHAR(20)
    )
    RETURNS FLOAT
      DETERMINISTIC
    BEGIN
      DECLARE haver FLOAT ;

      IF unit = 'MILES'                    --- calculations
        SET haver = ...                --- calculations

      RETURN haver ;
    END  //
DELIMITER ;

我认为它没有提供任何速度增益,但它对你提到的所有其他原因都有好处:可读性,可重用性,易于维护(想象你在2年后发现错误,你必须编辑代码(几百个地方)。