坐标常用函数 发表于 2018-03-10 | 分类于 PHP 百度/高德计算两经纬度坐标的距离和某个经纬度坐标的周边 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758/** * 计算两点之前距离 * * @param string $long1 出发地经度 * @param string $lat1 出发地纬度 * @param string $long2 目的地经度 * @param string $lat2 目的地纬度 * @param int $type 1:公里,2:米 * * @return int */function getLatLngDistance($long1, $lat1, $long2, $lat2, $type = 1){ $PI = 3.1415926535898; $EARTH_RADIUS = 6378.137; $radLat1 = $lat1 * ($PI / 180); $radLat2 = $lat2 * ($PI / 180); $a = $radLat1 - $radLat2; $b = ($long1 * ($PI / 180)) - ($long2 * ($PI / 180)); $s = 2 * asin(sqrt(pow(sin($a / 2), 2) + cos($radLat1) * cos($radLat2) * pow(sin($b / 2), 2))); $s = $s * $EARTH_RADIUS; $s = round($s * 1000); return $type == 1 ? ($s / 1000) : $s;}/** * 计算范围 * * @param string $long 中心点经度 * @param string $lat 中心点纬度 * @param double $radius 范围[单位:米] */function getLatLngRange($long, $lat, $radius){ $PI = 3.1415926535898; // 计算纬度 $degree = (24901 * 1609) / 360.0; $dpmLat = 1 / $degree; $radiusLat = $dpmLat * $radius; $minLat = $lat - $radiusLat; // 得到最小纬度 $maxLat = $lat + $radiusLat; // 得到最大纬度 // 计算经度 $mpdLong = $degree * cos($lat * ($PI / 180)); $dpmLong = 1 / $mpdLong; $radiusLong = $dpmLong * $radius; $minLong = $long - $radiusLong; // 得到最小经度 $maxLong = $long + $radiusLong; // 得到最大经度 // 范围 $range = [ 'minLat' => $minLat, 'maxLat' => $maxLat, 'minLong' => $minLong, 'maxLong' => $maxLong ]; return $range;} 火星[高德]坐标与百度坐标的相互转换 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152/** * 火星坐标系(GCJ-02) 转换 百度坐标系(BD-09) */function gcj02_to_bd09($long, $lat){ $xPi = 3.14159265358979324 * 3000.0 / 180.0; $z = sqrt($long * $long + $lat * $lat) + 0.00002 * sin($lat * $xPi); $theta = atan2($lat, $long) + 0.000003 * cos($long * $xPi); return [ 'lat' => $z * sin($theta) + 0.006, 'lng' => $z * cos($theta) + 0.0065, ];}/** * 百度坐标系(BD-09) 转 火星坐标系(GCJ-02) * * @param string $long 经度 * @param string $lat 纬度 * @return array */function bd09_to_gcj02($long, $lat){ $xPi = 3.14159265358979324 * 3000.0 / 180.0; $x = $long - 0.0065; $y = $lat - 0.006; $z = sqrt($x * $x + $y * $y) - 0.00002 * sin($y * $xPi); $theta = atan2($y, $x) - 0.000003 * cos($x * $xPi); return [ 'long' => $z * sin($theta), 'lat' => $z * cos($theta), ];}// 火星坐标$gcj02 = [ 'long' => '118.996547', 'lat' => '25.418467',];echo '火星[高德]坐标:';print_r($gcj02);echo '<br />';echo '火星坐标转百度坐标:';$bd09 = gcj02_to_bd09($gcj02['long'], $gcj02['lat']);print_r($bd09);echo '<br />';echo '百度坐标转火星坐标:';print_r(bd09_to_gcj02($bd09['long'], $bd09['lat'])); 本文作者:Mr 本文链接: http://sevming.github.io/PHP/longitude-latitude-functions.html 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 许可协议。转载请注明出处!