• PHP MYSQL 搜索周边坐标,并计算两个点之间的距离


    搜索附近地点,例如,坐标(39.91, 116.37)附近500米内的人,首先算出“给定坐标附近500米”这个范围的坐标范围。 虽然它是个圆,但我们可以先求出该圆的外接正方形,然后拿正方形的经纬度范围去搜索数据库。红色部分为要求的搜索范围,绿色部分为实际搜索范围。

    /**
     * 获取周围坐标
     * Enter description here ...
     * @param unknown_type $lng  固定坐标经度
     * @param unknown_type $lat  固定坐标纬度
     * @param unknown_type $distance  搜索周边距离,单位KM
     * @return multitype:multitype:number
     */
    function returnSquarePoint($lng, $lat,$distance = 1){
        $earthRadius = 6378.138; //地球半径,单位KM
        $dlng =  2 * asin(sin($distance / (2 * $earthRadius)) / cos(deg2rad($lat)));
        $dlng = rad2deg($dlng);
        $dlat = $distance/$earthRadius;
        $dlat = rad2deg($dlat);
        return array(
            'left-top'=>array('lat'=>$lat + $dlat,'lng'=>$lng-$dlng),
            'right-top'=>array('lat'=>$lat + $dlat, 'lng'=>$lng + $dlng),
            'left-bottom'=>array('lat'=>$lat - $dlat, 'lng'=>$lng - $dlng),
            'right-bottom'=>array('lat'=>$lat - $dlat, 'lng'=>$lng + $dlng)
        );
        
        //使用此函数计算得到结果后,带入sql查询。
    //    $squares = returnSquarePoint($lng, $lat);
    //    $info_sql = "select id,locateinfo,lat,lng from `lbs_info` where lat<>0 and lat>{$squares['right-bottom']['lat']} and lat<{$squares['left-top']['lat']} and lng>{$squares['left-top']['lng']} and lng<{$squares['right-bottom']['lng']} "; 
    }
    
    /**
     * 计算两个坐标的直线距离 
     * Enter description here ...
     * @param unknown_type $lat1  
     * @param unknown_type $lng1
     * @param unknown_type $lat2
     * @param unknown_type $lng2
     */
    function getDistance($lat1, $lng1, $lat2, $lng2){      
        $earthRadius = 6378.138; //近似地球半径千米
        // 转换为弧度
        $lat1 = ($lat1 * pi()) / 180;
        $lng1 = ($lng1 * pi()) / 180;
        $lat2 = ($lat2 * pi()) / 180;
        $lng2 = ($lng2 * pi()) / 180;
        // 使用半正矢公式  用尺规来计算
        $calcLongitude = $lng2 - $lng1;
        $calcLatitude = $lat2 - $lat1;
        $stepOne = pow(sin($calcLatitude / 2), 2) + cos($lat1) * cos($lat2) * pow(sin($calcLongitude / 2), 2);  
        $stepTwo = 2 * asin(min(1, sqrt($stepOne)));
        $calculatedDistance = $earthRadius * $stepTwo;
        return round($calculatedDistance);
    }
  • 相关阅读:
    Bootstrap_警示框
    Bootstrap_标签
    Bootstrap_分页
    Bootstrap_导航条
    Bootstrap_导航
    Bootstrap_按钮工具栏
    Bootstrap_下拉菜单
    Bootstrap_网格系统
    Bootstrap_表单_图标
    统计学习方法 李航---第12章 统计学习方法总结
  • 原文地址:https://www.cnblogs.com/rnckty/p/5407484.html
Copyright © 2020-2023  润新知