坐标常用函数

百度/高德计算两经纬度坐标的距离和某个经纬度坐标的周边

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
/**
* 计算两点之前距离
*
* @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;
}

火星[高德]坐标与百度坐标的相互转换

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
/**
* 火星坐标系(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']));
0%