百度地图标注数据转为WGS84格式

2026-01-25 浏览:10
百度地图标注数据转为WGS84格式
评论:(0)复制地址

因为百度使用的BD09,是在GCJ02基础上进行的加密。我们需要先把BD09转化为GCJ02,然后再将GCJ02转化为WGS84。我的运行环境是php5.4.45,特意写了一个conver.php文件进行转换(我百度的数据存储在BaiduJosn.js)代码如下:


<?php
/**
 * 百度坐标转换程序 (PHP 5.4.45 兼容版)
 */

error_reporting(E_ALL);
ini_set('display_errors', 1);
ini_set('memory_limit', '512M');

header('Content-Type: application/javascript; charset=utf-8');

class CoordConverter {
    const PI = 3.1415926535897932384626;
    const X_PI = 52.35987755982988; 
    const A = 6378245.0;
    const EE = 0.00669342162296594323;

    public static function bd09ToWgs84($bd_lon, $bd_lat) {
        $x = $bd_lon - 0.0065;
        $y = $bd_lat - 0.006;
        $z = sqrt($x * $x + $y * $y) - 0.00002 * sin($y * self::X_PI);
        $theta = atan2($y, $x) - 0.000003 * cos($x * self::X_PI);
        $gcj_lon = $z * cos($theta);
        $gcj_lat = $z * sin($theta);
        return self::gcj02ToWgs84($gcj_lon, $gcj_lat);
    }

    private static function gcj02ToWgs84($lng, $lat) {
        $dlat = self::transformLat($lng - 105.0, $lat - 35.0);
        $dlng = self::transformLng($lng - 105.0, $lat - 35.0);
        $radlat = $lat / 180.0 * self::PI;
        $magic = sin($radlat);
        $magic = 1 - self::EE * $magic * $magic;
        $sqrtmagic = sqrt($magic);
        $dlat = ($dlat * 180.0) / ((self::A * (1 - self::EE)) / ($magic * $sqrtmagic) * self::PI);
        $dlng = ($dlng * 180.0) / (self::A / $sqrtmagic * cos($radlat) * self::PI);
        return array($lng * 2 - ($lng + $dlng), $lat * 2 - ($lat + $dlat));
    }

    private static function transformLat($x, $y) {
        $ret = -100.0 + 2.0 * $x + 3.0 * $y + 0.2 * $y * $y + 0.1 * $x * $y + 0.2 * sqrt(abs($x));
        $ret += (20.0 * sin(6.0 * $x * self::PI) + 20.0 * sin(2.0 * $x * self::PI)) * 2.0 / 3.0;
        $ret += (20.0 * sin($y * self::PI) + 40.0 * sin($y / 3.0 * self::PI)) * 2.0 / 3.0;
        $ret += (160.0 * sin($y / 12.0 * self::PI) + 320 * sin($y * self::PI / 30.0)) * 2.0 / 3.0;
        return $ret;
    }

    private static function transformLng($x, $y) {
        $ret = 300.0 + $x + 2.0 * $y + 0.1 * $x * $x + 0.1 * $x * $y + 0.1 * sqrt(abs($x));
        $ret += (20.0 * sin(6.0 * $x * self::PI) + 20.0 * sin(2.0 * $x * self::PI)) * 2.0 / 3.0;
        $ret += (20.0 * sin($x * self::PI) + 40.0 * sin($x / 3.0 * self::PI)) * 2.0 / 3.0;
        $ret += (150.0 * sin($x / 12.0 * self::PI) + 300.0 * sin($x / 30.0 * self::PI)) * 2.0 / 3.0;
        return $ret;
    }
}

// --- 读取数据 ---
$jsFile = 'BaiduJosn.js';
if (!file_exists($jsFile)) die("Error: BaiduJosn.js not found.");
$content = file_get_contents($jsFile);

// 使用回调函数,正则匹配每一行包含经纬度的数据块
// 匹配模式:lng: 123.456, lat: 12.34
$pattern = '/lng:\s*([0-9\.]+),\s*lat:\s*([0-9\.]+)/';

$newContent = preg_replace_callback($pattern, function($matches) {
    $bd_lng = floatval($matches[1]);
    $bd_lat = floatval($matches[2]);
    
    // 执行高精度转换
    $wgs = CoordConverter::bd09ToWgs84($bd_lng, $bd_lat);
    
    $wgs_lng = round($wgs[0], 6);
    $wgs_lat = round($wgs[1], 6);
    
    return "lng: $wgs_lng, lat: $wgs_lat";
}, $content);

// 直接输出转换后的 JS 内容
echo $newContent;
?>


评论:(0)复制地址
发布:苗景云 | 分类:IT技术&设计 | Tags:百度地图

相关文章

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。