SQL根据当前经纬度计算周围n公里内数据

两种方式,网上查的,不知道原理,计算出来的数未验证哪个更加精确。有心者发现哪个精确度高请告知。

、、第一种

String sql = "select * from ( " +
                "SELECT city,cell_name,cgi,score,lon,lat,amzith, " +
                "  sqrt( " +
                "  ( " +
                "  ( " +
                "  (  "+busineAssessment.getLon()+"- lon ) * PI( ) * 12656 * cos( ( (  "+busineAssessment.getLat()+"+ lat ) / 2 ) * PI( ) / 180 ) / 180  " +
                "  ) * ( " +
                "  (  "+busineAssessment.getLon()+"- lon ) * PI( ) * 12656 * cos ( ( (  "+busineAssessment.getLat()+"+ lat ) / 2 ) * PI( ) / 180 ) / 180  " +
                "  )  " +
                "  ) + ( " +
                "  ( (  "+busineAssessment.getLat()+"- lat ) * PI( ) * 12656 / 180 ) * ( (  "+busineAssessment.getLat()+"- lat ) * PI( ) * 12656 / 180 )  " +
                "  )  " +
                "  )  as distance " +
                "FROM " +
                "  busine_assessment  " +
                "WHERE " +
                "  sqrt( " +
                "  ( " +
                "  ( " +
                "  (  "+busineAssessment.getLon()+"- lon ) * PI( ) * 12656 * cos( ( (  "+busineAssessment.getLat()+"+ lat ) / 2 ) * PI( ) / 180 ) / 180  " +
                "  ) * ( " +
                "  (  "+busineAssessment.getLon()+"- lon ) * PI( ) * 12656 * cos ( ( (  "+busineAssessment.getLat()+"+ lat ) / 2 ) * PI( ) / 180 ) / 180  " +
                "  )  " +
                "  ) + ( " +
                "  ( (  "+busineAssessment.getLat()+"- lat ) * PI( ) * 12656 / 180 ) * ( (  "+busineAssessment.getLat()+"- lat ) * PI( ) * 12656 / 180 )  " +
                "  )  " +
                "  ) <2 " +
                "  and lon <>  "+busineAssessment.getLon()+" order by distance limit 10 ) a " +
                "  order by a.score  " +
                "  ";

、、第二种 @a 是传入的经度  @b是纬度 @是地球半径

select *,sqrt(  
    (  
     ((@a-longitude)*PI()*@c*cos(((@b+latitude)/2)*PI()/180)/180)  
     *  
     ((@a-longitude)*PI()*@c*cos (((@b+latitude)/2)*PI()/180)/180)  
    )  
    +  
    (  
     ((@b-latitude)*PI()*@c/180)  
     *  
     ((@b-latitude)*PI()*@c/180)  
    )  
) as JL from [TableName] where sqrt(  
    (  
     ((@a-longitude)*PI()*@c*cos(((@b+latitude)/2)*PI()/180)/180)  
     *  
     ((@a-longitude)*PI()*@c*cos (((@b+latitude)/2)*PI()/180)/180)  
    )  
    +  
    (  
     ((@b-latitude)*PI()*@c/180)  
     *  
     ((@b-latitude)*PI()*@c/180)  
    )  
)<1  (1公里范围内)
————————————————
版权声明:本文为CSDN博主「Rex_IT」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/liuxiaoshuang002/article/details/71122153/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值