PHP 地图坐标wgs84ToGcj02, 检测两点距离 Haversine公式

文章介绍了如何使用PHP进行WGS84坐标系统到GCJ02坐标系统的转换,并提供了经纬度之间的精确距离计算方法,特别关注了米级误差的处理。
摘要由CSDN通过智能技术生成

地图坐标,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); // 返回结果并四舍五入到最近的整数
}

周边, 附近测距 直线距离, 米级误差

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

世界方块

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值