Resource.php
2.9 KB
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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
<?php
namespace app\common\controller;
use think\Controller;
class Resource extends Controller
{
/**
*
* @param $latitude 纬度
* @param $longitude 经度
* @param $raidus 半径范围(单位:米)
* @return multitype:number
*/
function getAround($latitude, $longitude, $raidus)
{
$PI = 3.14159265;
$degree = (24901 * 1609) / 360.0;
$dpmLat = 1 / $degree;
$radiusLat = $dpmLat * $raidus;
$minLat = $latitude - $radiusLat;
$maxLat = $latitude + $radiusLat;
$mpdLng = $degree * cos($latitude * ($PI / 180));
$dpmLng = 1 / $mpdLng;
$radiusLng = $dpmLng * $raidus;
$minLng = $longitude - $radiusLng;
$maxLng = $longitude + $radiusLng;
return array('minLat' => $minLat,'maxLat' => $maxLat, 'minLng' => $minLng, 'maxLng' => $maxLng);
}
/**
* 计算两点地理坐标之间的距离
* @param Decimal $longitude1 起点经度
* @param Decimal $latitude1 起点纬度
* @param Decimal $longitude2 终点经度
* @param Decimal $latitude2 终点纬度
* @param Int $unit 单位 1:米 2:公里
* @param Int $decimal 精度 保留小数位数
* @return Decimal
*/
public static function getDistance($longitude1, $latitude1, $longitude2, $latitude2, $unit=1, $decimal=2){
$EARTH_RADIUS = 6370.996; // 地球半径系数
$PI = 3.1415926;
$radLat1 = $latitude1 * $PI / 180.0;
$radLat2 = $latitude2 * $PI / 180.0;
$radLng1 = $longitude1 * $PI / 180.0;
$radLng2 = $longitude2 * $PI /180.0;
$a = $radLat1 - $radLat2;
$b = $radLng1 - $radLng2;
$distance = 2 * asin(sqrt(pow(sin($a/2),2) + cos($radLat1) * cos($radLat2) * pow(sin($b/2),2)));
$distance = $distance * $EARTH_RADIUS * 1000;
if($unit==2){
$distance = $distance / 1000;
}
return round($distance, $decimal);
}
/**
*计算某个经纬度的周围某段距离的正方形的四个点
*@param lng float 经度
*@param lat float 纬度
*@param distance float 该点所在圆的半径,该圆与此正方形内切,默认值为2千米
*@return array 正方形的四个点的经纬度坐标
*/
function returnSquarePoint($lng, $lat, $distance)
{
$earthdata=6371;//地球半径,平均半径为6371km
$dlng = 2 * asin(sin($distance / (2 * $earthdata)) / cos(deg2rad($lat)));
$dlng = rad2deg($dlng);
$dlat = $distance/$earthdata;
$dlat = rad2deg($dlat);
$data=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)
);
return $data;
}
}