使用mysql中的纬度和经度查找两点之间的距离

Ent*_*ast 26 mysql latitude-longitude

嗨,我有下表

 --------------------------------------------
 |  id  |  city  |  Latitude  |  Longitude  |
 --------------------------------------------
 |  1   |   3    |   34.44444 |   84.3434   |
 --------------------------------------------
 |  2   |   4    | 42.4666667 | 1.4666667   |
 --------------------------------------------
 |  3   |   5    |  32.534167 | 66.078056   |
 --------------------------------------------
 |  4   |   6    |  36.948889 | 66.328611   |
 --------------------------------------------
 |  5   |   7    |  35.088056 | 69.046389   |
 --------------------------------------------
 |  6   |   8    |  36.083056 |   69.0525   |
 --------------------------------------------
 |  7   |   9    |  31.015833 | 61.860278   |
 --------------------------------------------
Run Code Online (Sandbox Code Playgroud)

现在我希望得到两点之间的距离.假设一个用户正在拥有一个城市3并且一个用户正在拥有一个城市7.我的场景是一个用户拥有一个城市,而latracy和longitude正在搜索其他用户与他的城市的距离.例如,具有城市3的用户正在搜索.他想让任何其他城市的用户距离说它是7.我搜索并发现以下查询

SELECT `locations`.`city`, ( 3959 * acos ( cos ( radians(31.589167) ) * cos( radians( Latitude ) ) * cos( radians( Longitude ) - radians(64.363333) ) + sin ( radians(31.589167) ) * sin( radians( Latitude ) ) ) ) AS `distance` FROM `locations` HAVING (distance < 50)
Run Code Online (Sandbox Code Playgroud)

至于我知道这个查询找到从一个点到所有其他点的距离.现在我希望从一个点到另一个点的距离.

任何指南都将非常感谢.

O. *_*nes 71

我认为你的问题是你有city两个城市的值,你想要计算距离.

此查询将为您完成工作,产生以km为单位的距离.它使用球面余弦定律公式.

请注意,您将表连接到自身,以便可以检索计算的两个坐标对.

SELECT a.city AS from_city, b.city AS to_city, 
   111.111 *
    DEGREES(ACOS(LEAST(1.0, COS(RADIANS(a.Latitude))
         * COS(RADIANS(b.Latitude))
         * COS(RADIANS(a.Longitude - b.Longitude))
         + SIN(RADIANS(a.Latitude))
         * SIN(RADIANS(b.Latitude))))) AS distance_in_km
  FROM city AS a
  JOIN city AS b ON a.id <> b.id
 WHERE a.city = 3 AND b.city = 7
Run Code Online (Sandbox Code Playgroud)

请注意,常数111.1111是每度纬度的公里数,基于旧的拿破仑定义的仪表,是从赤道到极点的距离的万分之一.这个定义足够接近定位器工作.

如果您想要法定里程而不是公里,请69.0改用.

http://sqlfiddle.com/#!2/abcc8/4/0

如果你正在寻找附近的点,你可能会想要使用这样的句子:

   HAVING distance_in_km < 10.0    /* slow ! */
    ORDER BY distance_in_km DESC
Run Code Online (Sandbox Code Playgroud)

那就是(正如我们在美国波士顿附近所说的那样)邪恶缓慢.

在这种情况下,您需要使用边界框计算.请参阅此文章,了解如何执行此操作. http://www.plumislandmedia.net/mysql/haversine-mysql-nearest-loc/

  • 在mysql中使用此公式时,我获得了非常近距离的空值.我的灵魂是添加一个"最少"的功能来防止越界数字.DEGREES(ACOS(LEAST(COS(RADIANS(lat))*COS(RADIANS(google_lat))*COS(RADIANS(lng - google_lng))+ SIN(RADIANS(lat))*SIN(RADIANS(google_lat)),1.0) ))AS distance_in_km, (5认同)
  • 您需要使用Robert的修复更新查询! (3认同)
  • 使用代码查询2个坐标的最近位置。工作得很好! (2认同)

Nar*_*mar 25

您可以使用ST_Distance_Sphere MySql 内置函数。它以米为单位更有效地计算距离。

自 MySql 5.7 及以上版本支持。

select ST_Distance_Sphere(longs, lats)
Run Code Online (Sandbox Code Playgroud)
    select ST_Distance_Sphere(
    point(-87.6770458, 41.9631174),
    point(-73.9898293, 40.7628267)) 
Run Code Online (Sandbox Code Playgroud)

引用自使用 MySQL 计算距离

  • 请注意,结果以米为单位,因此您可能需要对其进行转换。 (2认同)
  • 在我的测试中,ST_Distance_Sphere 比接受的长 COS 项答案慢 3-5 倍。要计算我的 16480 邮政编码与我的位置的距离,使用 ST_Distance_Sphere 方法需要 160 毫秒,而使用 cos 项只需要 63 毫秒。 (2认同)

Ume*_*Jee 8

这是MySQL查询和函数,用于获取两个纬度和经度之间的距离,距离将以KM返回。

MySQL查询:-

SELECT (6371 * acos( 
                cos( radians(lat2) ) 
              * cos( radians( lat1 ) ) 
              * cos( radians( lng1 ) - radians(lng2) ) 
              + sin( radians(lat2) ) 
              * sin( radians( lat1 ) )
                ) ) as distance from your_table
Run Code Online (Sandbox Code Playgroud)

Mysql功能:-

DELIMITER $$
CREATE FUNCTION `getDistance`(`lat1` VARCHAR(200), `lng1` VARCHAR(200), `lat2` VARCHAR(200), `lng2` VARCHAR(200)) RETURNS varchar(10) CHARSET utf8
begin
declare distance varchar(10);

set distance = (select (6371 * acos( 
                cos( radians(lat2) ) 
              * cos( radians( lat1 ) ) 
              * cos( radians( lng1 ) - radians(lng2) ) 
              + sin( radians(lat2) ) 
              * sin( radians( lat1 ) )
                ) ) as distance); 

if(distance is null)
then
 return '';
else 
return distance;
end if;
end$$
DELIMITER ;
Run Code Online (Sandbox Code Playgroud)

如何在您的PHP代码中使用

SELECT getDistance(lat1,lng1,$lat2,$lng2) as distance 
FROM your_table.
Run Code Online (Sandbox Code Playgroud)

  • 差不多十年后,这个函数给出了与谷歌地图距离测量相同的结果。谢谢你! (2认同)

Slo*_*her 5

这是一个MySQL函数,它将采用两个纬度/经度对,并为您提供两点之间的距离(以度为单位)。它使用Haversine公式计算距离。由于地球不是一个完美的球体,因此在两极和赤道附近会有一些误差。

  • 要转换为英里,请乘以3961。
  • 要转换为公里,请乘6373。
  • 要转换为米,请乘以6373000。
  • 要转换为英尺,请乘以(3961 * 5280)20914080。
DELIMITER $$

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. To get miles, multiply by 3961, and km by 6373'

BEGIN

    RETURN DEGREES(ACOS(
              COS(RADIANS(lat1)) *
              COS(RADIANS(lat2)) *
              COS(RADIANS(lon2) - RADIANS(lon1)) +
              SIN(RADIANS(lat1)) * SIN(RADIANS(lat2))
            ));

END;

DELIMITER;
Run Code Online (Sandbox Code Playgroud)