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的主要内容,如果未能解决你的问题,请参考以下文章