mysql 根据已知的经纬度查找附近500米范围内的其他点

有张医院的表如下
id longitude latitude
1 13.565 25.321
2 25.6658 25.365

里面有每个医院都有经纬度
现在是已知用户的经纬度,想查找用户附近500米范围内的医院 这个sql怎么写?有大神知道么?

阅读 7.6k
4 个回答

给你贴一个yii的写法

$model=(new yiidbQuery())

        ->select('seek_id,sos_type_id,title,imgs,lose_pick_time,sos_lng,sos_lat,pet_imgs,user.grade,user.foster,user.officer')
        ->addSelect(["(POWER(MOD(ABS(sos_lng - ".$lng."),360),2) + POWER(ABS(sos_lng - ".$lat."),2)) AS distance"])
        ->from('sos')
        ->where('lng is not null')
        ->andWhere(['sos.is_show'=>1])
        ->leftJoin('user','user.id=sos.create_user_id')
        ->orderBy(['distance'=>SORT_ASC])
        ->limit(10)
        ->all();

如果数据不是很多,可以用函数算

#定义函数的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纬度。

b8389b504fc2d56285606466e21190ef77c66cd4.jpg

所以你只要简单的计算一下就能获得对应经纬度的上下限。

经纬度 是可以转化为距离的

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题