MySQL存储函数中的Haversine

Posted

技术标签:

【中文标题】MySQL存储函数中的Haversine【英文标题】:Haversine in MySQL stored function 【发布时间】:2016-05-18 14:55:47 【问题描述】:

我要创建一个存储函数来计算两点之间的距离。但是我无法让它工作。这是我目前正在使用的代码。

DROP FUNCTION `haversine`//
CREATE DEFINER=`-----`@`%` FUNCTION `haversine`(givenLat DOUBLE, givenLong DOUBLE) RETURNS double
    DETERMINISTIC
BEGIN 
  DECLARE dist double;
  DECLARE longitude varchar(255);
  DECLARE latitude varchar(255);

  SET longitude = 'Longitude';
  SET latitude = 'Latitude';


  SET dist = (6371 * acos( cos( radians
    (givenLat) ) * cos( radians
    ( latitude ) ) * cos( radians
    ( givenLong ) - radians
    (longitude) ) + sin( radians
    (givenLat) ) * sin( radians
    ( latitude ) ) ));
  RETURN dist;
END

下面的查询没有返回任何结果,但它应该返回一些东西。

SELECT id FROM location_address WHERE haversine(lat, long) < 30;

因为当我手动进行(相同?)查询时,它会返回结果:

SELECT id,  (6371 * acos( cos( radians
    (lat) ) * cos( radians
    ( Latitude ) ) * cos( radians
    ( long ) - radians
    (Longitude) ) + sin( radians
    (lat) ) * sin( radians
    ( Latitude ) ) )) AS distance 
FROM table HAVING distance < 30

我当然使用相同的坐标来尝试这两个查询,但我真的无法弄清楚为什么该函数不会产生任何结果。

我真的需要一个存储函数来执行查询。

【问题讨论】:

检查这个:***.com/questions/3640448/… 为什么要将变量设置为SET longitude = 'Longitude';等字符串?所有的值都应该是数字吗? mysql 地理空间功能有何影响? @RyanVincent 我在声明列名时遇到了问题,因为这会导致 MySQL 错误提示该列不存在。这样它就不会了。 (坐标存储在数据库中,需要与给定坐标进行比较) 【参考方案1】:

我仍然不完全知道它为什么起作用,但是将列名作为给定参数直接传递给函数是有效的,而不是在函数本身中声明它们。

【讨论】:

以上是关于MySQL存储函数中的Haversine的主要内容,如果未能解决你的问题,请参考以下文章

mysql 与oracle中的存储过程及函数有啥区别,尽可能详细哦

Mysql中的函数

如何将数据帧中的数据调用到Haversine函数中[重复]

如何将两个数据框中的列传递给 Haversine 函数?

Haversine 函数的 Python 数学库中的错误

MySQL中的存储过程和函数使用详解