有张医院的表如下
id longitude latitude
1 13.565 25.321
2 25.6658 25.365
里面有每个医院都有经纬度
现在是已知用户的经纬度,想查找用户附近500米范围内的医院 这个sql怎么写?有大神知道么?
有张医院的表如下
id longitude latitude
1 13.565 25.321
2 25.6658 25.365
里面有每个医院都有经纬度
现在是已知用户的经纬度,想查找用户附近500米范围内的医院 这个sql怎么写?有大神知道么?
如果数据不是很多,可以用函数算
#定义函数的sql
DELIMITER $$
CREATE DEFINER = CURRENT_USER FUNCTION `get_distance`(`lon1` float,`lat1` float,`lon2` float,`lat2` float)
RETURNS double
begin
declare d double;
declare radius int;
set radius = 6378140; #假设地球为正球形,直径为6378140米
set d = (2*ATAN2(SQRT(SIN((lat1-lat2)*PI()/180/2)
*SIN((lat1-lat2)*PI()/180/2)+
COS(lat2*PI()/180)*COS(lat1*PI()/180)
*SIN((lon1-lon2)*PI()/180/2)
*SIN((lon1-lon2)*PI()/180/2)),
SQRT(1-SIN((lat1-lat2)*PI()/180/2)
*SIN((lat1-lat2)*PI()/180/2)
+COS(lat2*PI()/180)*COS(lat1*PI()/180)
*SIN((lon1-lon2)*PI()/180/2)
*SIN((lon1-lon2)*PI()/180/2))))*radius;
return d;
END $$
DELIMITER $$;
使用的话直接传参数就行了
select ... from ... where get_distance(114.06667,22.61667,longitude,latitude)<500;
在赤道上经度差1度对应的实际距离是111千米;
在经线上纬度差1度对应的实际距离是111千米;
在除赤道外的其他纬线上,经度差1度对应的实际距离是111*cos纬度。
所以你只要简单的计算一下就能获得对应经纬度的上下限。
5 回答3.2k 阅读✓ 已解决
3 回答3.6k 阅读✓ 已解决
1 回答4k 阅读✓ 已解决
3 回答1.8k 阅读✓ 已解决
2 回答2.2k 阅读✓ 已解决
2 回答2.8k 阅读✓ 已解决
5 回答1.4k 阅读
给你贴一个yii的写法
$model=(new yiidbQuery())