【问题标题】:MySQL Function for calculating Haversine Distance用于计算半正弦距离的 MySQL 函数
【发布时间】:2014-03-10 13:16:34
【问题描述】:

全部。

我想创建一个 mysql 函数来计算两个地理代码之间的半正弦距离。

 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 行的 '' 附近

有人有想法吗?

提前谢谢你。

【问题讨论】:

  • 如果我们知道第 4 行是什么,我们会为您提供帮助。

标签: mysql function distance haversine


【解决方案1】:

好的。

解决了。

 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

【讨论】:

    【解决方案2】:

    现在,由于分号字符作为行分隔符出现在您的函数中,您遇到了错误。

    进一步解释,直接引用MySQL documentation

    默认情况下,mysql将分号识别为语句分隔符, 所以必须临时重新定义分隔符才能让mysql通过 整个存储的程序定义到服务器。

    这意味着您必须临时覆盖默认分隔符才能编译程序。在

    之间封装你的程序
    DELIMITER $$
       your code for function
    $$
    

    然后试一试。

    编辑: 您可以通过再次指定默认分隔符来更改分隔符

    mysql> DELIMITER ;
    

    【讨论】:

    • 谢谢!您的解决方案解决了我的问题。
    猜你喜欢
    • 1970-01-01
    • 2022-10-21
    • 2022-10-21
    • 2022-07-19
    • 2018-09-20
    • 2015-07-14
    • 1970-01-01
    • 2011-04-24
    • 1970-01-01
    相关资源
    最近更新 更多