拽拽
管理员组

PHP MYSQL 搜索给定坐标附近xx米内,并计算两个坐标点之间的距离

搜索附近地点,例如,坐标(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);

}


#1楼
发帖时间:2016-5-29   |   查看数:0   |   回复数:0
游客组