天天看点

百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换(JS版代码)coordtransform 坐标转换

记录js地图经纬度坐标的转换

coordtransform 坐标转换

/**
 * Created by Wandergis on 2015/7/8.
 * 提供了百度坐标(BD09)、国测局坐标(火星坐标,GCJ02)、和WGS84坐标系之间的转换
 */

//定义一些常量
var x_PI =  *  / ;
var PI = ;
var a = ;
var ee = ;

/**
 * 百度坐标系 (BD-09) 与 火星坐标系 (GCJ-02)的转换
 * 即 百度 转 谷歌、高德
 * @param bd_lon
 * @param bd_lat
 * @returns {*[]}
 */
function bd09togcj02(bd_lon, bd_lat) {
    var x_pi =  *  / ;
    var x = bd_lon - ;
    var y = bd_lat - ;
    var z = Math.sqrt(x * x + y * y) -  * Math.sin(y * x_pi);
    var theta = Math.atan2(y, x) -  * Math.cos(x * x_pi);
    var gg_lng = z * Math.cos(theta);
    var gg_lat = z * Math.sin(theta);
    return [gg_lng, gg_lat]
}

/**
 * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换
 * 即谷歌、高德 转 百度
 * @param lng
 * @param lat
 * @returns {*[]}
 */
function gcj02tobd09(lng, lat) {
    var z = Math.sqrt(lng * lng + lat * lat) +  * Math.sin(lat * x_PI);
    var theta = Math.atan2(lat, lng) +  * Math.cos(lng * x_PI);
    var bd_lng = z * Math.cos(theta) + ;
    var bd_lat = z * Math.sin(theta) + ;
    return [bd_lng, bd_lat]
}

/**
 * WGS84转GCj02
 * @param lng
 * @param lat
 * @returns {*[]}
 */
function wgs84togcj02(lng, lat) {
    if (out_of_china(lng, lat)) {
        return [lng, lat]
    }
    else {
        var dlat = transformlat(lng - , lat - );
        var dlng = transformlng(lng - , lat - );
        var radlat = lat /  * PI;
        var magic = Math.sin(radlat);
        magic =  - ee * magic * magic;
        var sqrtmagic = Math.sqrt(magic);
        dlat = (dlat * ) / ((a * ( - ee)) / (magic * sqrtmagic) * PI);
        dlng = (dlng * ) / (a / sqrtmagic * Math.cos(radlat) * PI);
        var mglat = lat + dlat;
        var mglng = lng + dlng;
        return [mglng, mglat]
    }
}

/**
 * GCJ02 转换为 WGS84
 * @param lng
 * @param lat
 * @returns {*[]}
 */
function gcj02towgs84(lng, lat) {
    if (out_of_china(lng, lat)) {
        return [lng, lat]
    }
    else {
        var dlat = transformlat(lng - , lat - );
        var dlng = transformlng(lng - , lat - );
        var radlat = lat /  * PI;
        var magic = Math.sin(radlat);
        magic =  - ee * magic * magic;
        var sqrtmagic = Math.sqrt(magic);
        dlat = (dlat * ) / ((a * ( - ee)) / (magic * sqrtmagic) * PI);
        dlng = (dlng * ) / (a / sqrtmagic * Math.cos(radlat) * PI);
        mglat = lat + dlat;
        mglng = lng + dlng;
        return [lng *  - mglng, lat *  - mglat]
    }
}

function transformlat(lng, lat) {
    var ret = - +  * lng +  * lat +  * lat * lat +  * lng * lat +  * Math.sqrt(Math.abs(lng));
    ret += ( * Math.sin( * lng * PI) +  * Math.sin( * lng * PI)) *  / ;
    ret += ( * Math.sin(lat * PI) +  * Math.sin(lat /  * PI)) *  / ;
    ret += ( * Math.sin(lat /  * PI) +  * Math.sin(lat * PI / )) *  / ;
    return ret
}

function transformlng(lng, lat) {
    var ret =  + lng +  * lat +  * lng * lng +  * lng * lat +  * Math.sqrt(Math.abs(lng));
    ret += ( * Math.sin( * lng * PI) +  * Math.sin( * lng * PI)) *  / ;
    ret += ( * Math.sin(lng * PI) +  * Math.sin(lng /  * PI)) *  / ;
    ret += ( * Math.sin(lng /  * PI) +  * Math.sin(lng /  * PI)) *  / ;
    return ret
}

/**
 * 判断是否在国内,不在国内则不做偏移
 * @param lng
 * @param lat
 * @returns {boolean}
 */
function out_of_china(lng, lat) {
    return (lng <  || lng > ) || ((lat <  || lat > ) || false);
}
           

继续阅读