gpt4 book ai didi

mysql - 使用 SQL 使用 2 个全局点计算距离

转载 作者:太空宇宙 更新时间:2023-11-03 11:54:53 24 4
gpt4 key购买 nike

我正在尝试从 2 个全局点(纬度/经度)获取以米为单位的距离

我找到了一些对 haversine 公式的引用 herehere .根据给定的公式,我做了一个sql脚本(mysql)

DELIMITER $$
CREATE FUNCTION get_geo_distance (lat1 DECIMAL, lon1 DECIMAL, lat2 DECIMAL, lon2 DECIMAL)
RETURNS DECIMAL
BEGIN

DECLARE RR LONG;
DECLARE o1 DECIMAL;
DECLARE o2 DECIMAL;
DECLARE Ao DECIMAL;
DECLARE AA DECIMAL;
DECLARE a DECIMAL;
DECLARE c DECIMAL;

SET RR = 6371000;
SET o1 = RADIANS(lat1);
SET o2 = RADIANS(lat2);
SET Ao = RADIANS(lat2 - lat1);
SET AA = RADIANS(lon2 - lon1);

SET a = SIN(Ao/2) * SIN(Ao/2) +
COS(o1) * COS(o2) *
SIN(AA/2) * SIN(AA/2);
SET c = 2 * ATAN2(SQRT(a), SQRT(1-a));
RETURN RR * c;

END $$
DELIMITER ;

但是,当我调用 get_geo_distance 时,它​​将返回 0(零)有人可以帮帮我吗?

使用示例:

SELECT get_geo_distance(1,1,0,0);
SELECT get_geo_distance(10, 10, 0, 0);
SELECT get_geo_distance(-22.7514855, -47.3987318, -22.7599327, -47.3914984);

最佳答案

不要为此使用十进制数据类型。请改用 FLOAT。小数舍入因破坏这些计算而臭名昭著。

这个存储过程很好地完成了这项工作。

DELIMITER $$
DROP FUNCTION IF EXISTS haversine$$

CREATE FUNCTION haversine(
lat1 FLOAT, lon1 FLOAT,
lat2 FLOAT, lon2 FLOAT
) RETURNS FLOAT
NO SQL DETERMINISTIC
COMMENT 'Returns the distance in degrees on the Earth
between two known points of latitude and longitude'
BEGIN
RETURN DEGREES(ACOS(
COS(RADIANS(lat1)) *
COS(RADIANS(lat2)) *
COS(RADIANS(lon2) - RADIANS(lon1)) +
SIN(RADIANS(lat1)) * SIN(RADIANS(lat2))
));
END$$

DELIMITER ;

此函数返回度数。您需要将它乘以一个常数以获得更常规的距离测量值。在温带纬度,值 111.045 是计算公里的一个很好的值,69.0 可以计算法定英里数(如果您碰巧住在像美国这样的前英国殖民地,这很有用)。

这里有关于这个问题的更详尽的文章。 http://www.plumislandmedia.net/mysql/haversine-mysql-nearest-loc/

关于mysql - 使用 SQL 使用 2 个全局点计算距离,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33620523/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com