mysql中计算两点经纬度之间距离

  • baagee 发布于 2016-08-13 16:53:30
  • 分类:MySQL
  • 1672 人围观
  • 4 人喜欢

以前做的商圈,查询数据库中的商铺,根据用户地理位置,查询出他周围3000米内的商户,并且在地图上显示出每个商铺的详细信息,怎么查询用户到每个商铺的距离呢?

首先获取用户的地址,这个用百度地图api就行,或者其他的地图。

如何计算两经纬度之距离呢?这里有个小实例(demo):

<!DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>经纬度距离计算</title>
    <script language="JavaScript">
        function rad(d){
            return d * Math.PI / 180.0;
        }
        function GetDistance( lat1,  lng1,  lat2,  lng2){
            var radLat1 = rad(lat1);
            var radLat2 = rad(lat2);
            var a = radLat1 - radLat2;
            var  b = rad(lng1) - rad(lng2);
            var s = 2 * Math.asin(Math.sqrt(Math.pow(Math.sin(a/2),2) +
            Math.cos(radLat1)*Math.cos(radLat2)*Math.pow(Math.sin(b/2),2)));
            s = s *6378.137 ;
            s = Math.round(s * 10000) / 10000;
            return s;
        }
        function calDis(){
            var lat1 = document.getElementById( "lat1").value * 1;
            var lat2 = document.getElementById( "lat2").value * 1;
            var lng1 = document.getElementById( "lng1").value * 1;
            var lng2 = document.getElementById( "lng2").value * 1;
            var dis =  GetDistance(lat1, lng1, lat2, lng2);
            document.getElementById( "distance").value = dis;
        }
    </script>
</head>
<body>
    <h2>经纬度距离计算</h2>
    <div>
        A:纬度<input value="40.056890127931279" name="lat1" id="lat1" onkeyup="calDis()" type="text">
        经度<input value="116.30815063007148" name="lng1" id="lng1" onkeyup="calDis()" type="text">
        B:纬度<input value="35.48871262220911" name="lat2" id="lat2" onkeyup="calDis()" type="text">
        经度<input value="116.30815063007148" name="lng2" id="lng2" onkeyup="calDis()" type="text">
        A-B:距离=<input value="508.5272" name="distance" id="distance" type="text"> Km 
    </div>
</body>
</html>
结合本次要实现的查询功能,详细查询SQL如下:
select * from 
     (select 
         s.name,s.address,s.deposit,s.longitude,s.latitude,s.shopfront,a.bottom,a.maxlottery,
         ROUND(6378.138*2*ASIN(SQRT(POW(SIN((".$lat."*PI()/180-s.latitude*PI()/180)/2),2)+
         COS(".$lat."*PI()/180)*COS(s.latitude*PI()/180)*POW(SIN((".$lng."*PI()/180-s.longitude*PI()/180)/2)
         ,2)))*1000) AS distance 
     from".tablename('ly_jhb_shops')." s left join ".tablename('ly_jhb_advs')." a ON 
     s.uniacid=:uniacid and a.shopid=s.id and a.type=5 order by distance
     )as d 
where d.distance<=3000

s.longitude,s.latitude#为数据库中存商户经纬度的字段

$lng,$lat#为用户自己的经纬度坐标

这样就查到想要的距离信息了


标签: MySQL

评论

点击图片切换
还没有评论,快来抢沙发吧!