/** * 坐标计算 * date :Nove 11,2011--- 光棍节 * author:snuser */ /** 示例: $lat = 0.1; $lng = 116.085239; $lat2 = 0.2; $lng2 = 116.085239; $data = Coordinate::getDisCoord($lng, $lat, 1000); $distance = Coordinate::getDistance($lng, $lat, $lng2, $lat2); */ class Coordinate{ /** * 地球半径 单位(m) * 常量 */ const EARTH_RADIUS = 6378137.0; /** * 得到某坐标发散后的距离的坐标 * @lng 经度 floor (11,7) * @lat 纬度 floor (11,7) * @distance 单位(m) * return array */ static function getDisCoord($lng,$lat,$distance){ //纬度偏移 $dlat = 2*asin(sin($distance/(2*self::EARTH_RADIUS))/cos($lat)); $dlat = rad2deg(abs($dlat)); //经度偏移 $dlng = $distance/self::EARTH_RADIUS ; $dlng = rad2deg( abs( $dlng ) ); return array( 'lat1'=>sprintf('%.7f', ($lat+$dlat)), 'lat2'=>sprintf('%.7f', ($lat-$dlat)), 'lng1'=>sprintf('%.7f', ($lng+$dlng)), 'lng2'=>sprintf('%.7f', ($lng-$dlng)), ); } /** * 计算两点之间的球面距离 * return floot */ static function getDistance($lng0, $lat0, $lng1, $lat1){ $x = ($lng1-$lng0)*M_PI*self::EARTH_RADIUS*cos(($lat0+$lat1)/2*M_PI/180)/180; $y = ($lat1-$lat0)*M_PI*self::EARTH_RADIUS/180; $distance = self::hav($x, $y); return $distance; } /** * 开平方 * 根号下(x2+y2) * @param unknown_type $x * @param unknown_type $y * @return unknown */ static function hav($x, $y){ return sqrt($x*$x+$y*$y); } }
一点坐标发散后得到范围, map寻找
猜你喜欢
转载自lanlansnss.iteye.com/blog/1405562
今日推荐
周排行