【问题标题】:MySQL Function to calculate distance between two latitudes and longitudes [closed]MySQL函数计算两个纬度和经度之间的距离
【发布时间】:2012-11-22 20:53:24
【问题描述】:

如果您的数据库中存储了纬度和经度,并且需要计算两个坐标之间的距离。如何使用 MySQL 函数计算它?

【问题讨论】:

  • 可以回答您自己的问题,但您需要提出问题。您还需要解释您所做的假设。例如,您可能用英里而不是公里来表示距离。看起来您的坐标以度数表示。您的功能文档应该这样说。您还假设一个球形地球而不是球形地球。
  • @SashiKant 我将帖子编辑为我要回答的问题。
  • @JonathanLeffler 我用我的回答将它改成了一个问题并添加了文档。

标签: mysql geolocation


【解决方案1】:

找了好久,放弃了,自己写了。我能够将一些其他代码改编为以下 MySQL 函数。

DELIMITER $$
/*
Takes two latitudes and longitudes in degrees. You could comment out the conversion if you want to pass as radians.
Calculate the distance in miles, change the radius to the earth's radius in km to get km.
*/

DROP FUNCTION IF EXISTS GETDISTANCE$$
CREATE FUNCTION GETDISTANCE 
  (deg_lat1 FLOAT, deg_lng1 FLOAT, deg_lat2 FLOAT, deg_lng2 FLOAT) 
  RETURNS FLOAT 
  DETERMINISTIC 
BEGIN 
  DECLARE distance FLOAT;
  DECLARE delta_lat FLOAT; 
  DECLARE delta_lng FLOAT; 
  DECLARE lat1 FLOAT; 
  DECLARE lat2 FLOAT;
  DECLARE a FLOAT;

  SET distance = 0;

  /*Convert degrees to radians and get the variables I need.*/
  SET delta_lat = radians(deg_lat2 - deg_lat1); 
  SET delta_lng = radians(deg_lng2 - deg_lng1); 
  SET lat1 = radians(deg_lat1); 
  SET lat2 = radians(deg_lat2); 

  /*Formula found here: http://www.movable-type.co.uk/scripts/latlong.html*/
  SET a = sin(delta_lat/2.0) * sin(delta_lat/2.0) + sin(delta_lng/2.0) * sin(delta_lng/2.0) * cos(lat1) * cos(lat2); 
  SET distance = 3956.6 * 2 * atan2(sqrt(a),  sqrt(1-a)); 

  RETURN distance;
END$$
DELIMITER ;

【讨论】: