用于计算Haversine距离的MySQL函数

3

我想创建一个mysql函数,用于计算两个地理编码之间的haversine距离。

 CREATE FUNCTION haversineDistance
                 (
                  lat1 VARCHAR(256), 
                  long1 VARCHAR(256), 
                  lat2 VARCHAR(256), 
                  long2 VARCHAR(256)
                 )
 RETURNS FLOAT DETERMINISTIC
 BEGIN

      DECLARE radLat1 FLOAT;
      DECLARE radLong1 FLOAT;
      DECLARE radLat2 FLOAT;
      DECLARE radLong2 FLOAT;
      DECLARE dLat FLOAT;
      DECLARE dLong FLOAT;
      DECLARE cordLength FLOAT;
      DECLARE centralAngle FLOAT;
      DECLARE distance FLOAT;

      SET radLat1 = CAST(lat1 AS FLOAT) * PI() / 180;
      SET radLong1 = CAST(long1 AS FLOAT) * PI() / 180;
      SET radLat2 = CAST(lat2 AS FLOAT) * PI() / 180;
      SET radLong2 = CAST(long2 AS FLOAT) * PI() / 180;
      SET dLat = radLat2 - radLat1;
      SET dLong = radLong2 - radLong2;
      SET cordLength = POW(SIN(dLat/2),2)+COS(lat1)*COS(lat2)*POW(SIN(dLon/2),2);
      SET centralAngle = 2 * ATAN2(SQRT(cordLength), SQRT(1-cordLength));
      SET distance = 6367 * centralAngle;

      RETURN distance;
 END

但是我遇到了这样的错误:

1064 - SQL 语法错误;请查看与您的 MySQL 服务器版本对应的手册以获取正确的语法,第 4 行附近有问题

是否有任何想法?

提前感谢您。


如果我们知道第四行是什么,那将有助于我们帮助您。 - david strachan
2个回答

2

好的。

问题已解决。

 DELIMITER $$
 CREATE FUNCTION haversineDistance
                 (
                  lat1 VARCHAR(256), 
                  long1 VARCHAR(256), 
                  lat2 VARCHAR(256), 
                  long2 VARCHAR(256))
 RETURNS FLOAT DETERMINISTIC
 BEGIN

      DECLARE radLat1 FLOAT;
      DECLARE radLong1 FLOAT;
      DECLARE radLat2 FLOAT;
      DECLARE radLong2 FLOAT;
      DECLARE dLat FLOAT;
      DECLARE dLong FLOAT;
      DECLARE cordLength FLOAT;
      DECLARE centralAngle FLOAT;
      DECLARE distance FLOAT;

      SET radLat1 = CAST(lat1 AS DECIMAL(10,10)) * PI() / 180;
      SET radLong1 = CAST(long1 AS DECIMAL(10,10)) * PI() / 180;
      SET radLat2 = CAST(lat2 AS DECIMAL(10,10)) * PI() / 180;
      SET radLong2 = CAST(long2 AS DECIMAL(10,10)) * PI() / 180;
      SET dLat = radLat2 - radLat1;
      SET dLong = radLong2 - radLong2;
      SET cordLength = POW(SIN(dLat/2),2)+COS(lat1)*COS(lat2)*POW(SIN(dLon/2),2);
      SET centralAngle = 2 * ATAN2(SQRT(cordLength), SQRT(1-cordLength));
      SET distance = 6367 * centralAngle;

      RETURN distance;
 END

0

现在,你遇到了一个错误,这是因为分号字符作为函数的行分隔符存在。

更进一步解释,直接引用MySQL文档

默认情况下,mysql将分号识别为语句分隔符, 因此您必须临时重新定义分隔符,以使mysql将整个存储的程序定义传递给服务器。

这意味着您必须暂时覆盖默认分隔符才能编译您的程序。将您的程序封装在以下代码之间:

DELIMITER $$
   your code for function
$$

然后试一下。

编辑: 您可以通过重新指定默认分隔符来更改分隔符。

mysql> DELIMITER ;

谢谢!你的解决方案修复了我的问题。 - adeltahir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接