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