地图坐标,PHP源码函数 坐标转
//wgs84换算到gcj02
private function wgs84ToGcj02(float $lng, float $lat){
$d_lat = $this->transformlat($lng - 105.0, $lat - 35.0);
$d_lng = $this->transformlng($lng - 105.0, $lat - 35.0);
$rad_lat = $lat / 180.0 * self::pi;
$magic = sin($rad_lat);
$magic = 1 - self::ee * $magic * $magic;
$sqrt_magic = sqrt($magic);
$d_lat = ($d_lat * 180.0) / ((self::a * (1 - self::ee)) / ($magic * $sqrt_magic) * self::pi);
$d_lng = ($d_lng * 180.0) / (self::a / $sqrt_magic * cos($rad_lat) * self::pi);
$mg_lat = $lat + $d_lat;
$mg_lng = $lng + $d_lng;
return [$mg_lng, $mg_lat];
}
private function transFormLat (float $lng, float $lat) {
$ret = -100.0 + 2.0 * $lng + 3.0 * $lat + 0.2 * $lat * $lat + 0.1 * $lng * $lat + 0.2 * sqrt(abs($lng));
$ret += (20.0 * sin(6.0 * $lng * self::pi) + 20.0 * sin(2.0 * $lng * self::pi)) * 2.0 / 3.0;
$ret += (20.0 * sin($lat * self::pi) + 40.0 * sin($lat / 3.0 * self::pi)) * 2.0 / 3.0;
$ret += (160.0 * sin($lat / 12.0 * self::pi) + 320 * sin($lat * self::pi / 30.0)) * 2.0 / 3.0;
return $ret;
}
/**
* 经度转换
* @param float $lng
* @param float $lat
* @return float
*/
private function transFormLng (float $lng, float $lat) {
$ret = 300.0 + $lng + 2.0 * $lat + 0.1 * $lng * $lng + 0.1 * $lng * $lat + 0.1 * sqrt(abs($lng));
$ret += (20.0 * sin(6.0 * $lng * self::pi) + 20.0 * sin(2.0 * $lng * self::pi)) * 2.0 / 3.0;
$ret += (20.0 * sin($lng * self::pi) + 40.0 * sin($lng / 3.0 * self::pi)) * 2.0 / 3.0;
$ret += (150.0 * sin($lng / 12.0 * self::pi) + 300.0 * sin($lng / 30.0 * self::pi)) * 2.0 / 3.0;
return $ret;
}
public static function calculateDistance($lat1, $lon1, $lat2, $lon2) {
// 将角度转换成弧度
$degToRad = M_PI / 180;
// 地球平均半径(单位:千米)
$earthRadius = 6371.0;
// 将经纬度从十进制度数转换为弧度
$radLat1 = $lat1 * $degToRad;
$radLon1 = $lon1 * $degToRad;
$radLat2 = $lat2 * $degToRad;
$radLon2 = $lon2 * $degToRad;
// 计算两点之间的差值
$differenceLongitude = abs($radLon2 - $radLon1);
$differenceLatitude = abs($radLat2 - $radLat1);
// Haversine公式计算大圆上两点之间的距离
$a = sin($differenceLatitude/2) * sin($differenceLatitude/2) + cos($radLat1) * cos($radLat2) * sin($differenceLongitude/2) * sin($differenceLongitude/2);
$c = 2 * atan2(sqrt($a), sqrt(1-$a));
$distanceInKilometers = $earthRadius * $c;
return round($distanceInKilometers * 1000); // 返回结果并四舍五入到最近的整数
}
周边, 附近测距 直线距离, 米级误差