GPS坐标转百度坐标总结

    我就直接把我整理的模块摆上去吧!有需要的可以直接复制过去导入就可以用了。

/**
 * 采用百度地图的转换方法,向百度地图服务器请求转换结果,
 * 普通用户有次数限制,另外异步转换,改方法可以无限转换,
 * 转换完成调用回调handler方法,并传回数据,数据顺序和之前一样
 * @param pois
 * @param handler
 */

 export function convertPoints(pois, handler){
    //百度提供的API每次最多只能将10个数据转为百度坐标
    // 所以需要分多次转换
    if(!pois || pois.length <= 0) return;
    let convertor = new BMap.Convertor();
    if(pois.length <= 10){
        //将谷歌坐标转为百度坐标,如要原始坐标转为百度坐标,下面参数变为1,5
        convertor.translate(pois, 3, 5, data =>{
            if(data.status === 0){
                handler(data.points);
            }
        });
    } else{
        //使用map是为了根据key来保证转化后组合数组的顺序
        let map = new Map();
        let start = 0;
        for(let i = 0, len = parseInt(pois.length / 10); i <= len; i++){
            let end = start + 10;
            if(end > pois.length){
                end = pois.length;
            }
            convertor.translate(pois.slice(start, end), 1, 5, data =>{
                if(data.status === 0){
                    map.set(i, data.points);
                    if(map.size === (len + 1)){
                        let point = [];
                        for(let k = 0; k < map.size; k++){
                            point = point.concat(map.get(k))
                        }
                        handler(point);
                    }
                }
            });
            start += 10;
        }


    }
}


/**
 * 本地转换,逐个转换,建议使用,速度比向百度请求快多了
 *
 */

const pi = 3.14159265358979324;      //圆周率
const ee = 0.00669342162296594323;   //椭球的偏心率
const a = 6378245.0;                 //卫星椭球坐标投影到平面地图坐标系的投影因子
const x_pi = 3.14159265358979324 * 3000.0 / 180.0;  //圆周率转换量
// 求弧度
export function radian(d){
    return d * pi / 180.0;   //角度1? = π / 180
}

export function transformLat(lat, lon)    //纬度转化
{
    let ret = -100.0 + 2.0 * lat + 3.0 * lon + 0.2 * lon * lon + 0.1 * lat * lon + 0.2 * Math.sqrt(Math.abs(lat));
    ret += (20.0 * Math.sin(6.0 * lat * pi) + 20.0 * Math.sin(2.0 * lat * pi)) * 2.0 / 3.0;
    ret += (20.0 * Math.sin(lon * pi) + 40.0 * Math.sin(lon / 3.0 * pi)) * 2.0 / 3.0;
    ret += (160.0 * Math.sin(lon / 12.0 * pi) + 320 * Math.sin(lon * pi / 30.0)) * 2.0 / 3.0;
    return ret;
}

export function transformLon(lat, lon)   //经度转化
{
    let ret = 300.0 + lat + 2.0 * lon + 0.1 * lat * lat + 0.1 * lat * lon + 0.1 * Math.sqrt(Math.abs(lat));
    ret += (20.0 * Math.sin(6.0 * lat * pi) + 20.0 * Math.sin(2.0 * lat * pi)) * 2.0 / 3.0;
    ret += (20.0 * Math.sin(lat * pi) + 40.0 * Math.sin(lat / 3.0 * pi)) * 2.0 / 3.0;
    ret += (150.0 * Math.sin(lat / 12.0 * pi) + 300.0 * Math.sin(lat / 30.0 * pi)) * 2.0 / 3.0;
    return ret;
}

/*****************************************************************************
 * WGS84(GPS坐标系) to 火星坐标系(GCJ-02)
 *
 * @param lat
 * @param lon
 * @return
 ****************************************************************************/
export function GPS84_To_GCJ02(WGS84_Lat, WGS84_Lon){
    let dLat;
    let dLon;
    let radLat;
    let magic;
    let sqrtMagic;
    dLat = transformLat(WGS84_Lon - 105.0, WGS84_Lat - 35.0);
    dLon = transformLon(WGS84_Lon - 105.0, WGS84_Lat - 35.0);
    radLat = WGS84_Lat / 180.0 * pi;
    magic = Math.sin(radLat);
    magic = 1 - ee * magic * magic;
    sqrtMagic = Math.sqrt(magic);
    dLat = (dLat * 180.0) / ((a * (1 - ee)) / (magic * sqrtMagic) * pi);
    dLon = (dLon * 180.0) / (a / sqrtMagic * Math.cos(radLat) * pi);
    let GCJ02_Lat = parseFloat(WGS84_Lat) + parseFloat(dLat);    //GCJ02_Lat是百度纬度存储变量的地址  *GCJ02_Lat就是那个值
    let GCJ02_Lon = parseFloat(WGS84_Lon) + parseFloat(dLon);    //GCJ02_Lon是百度经度存储变量的地址  *GCJ02_Lon
    return [GCJ02_Lat, GCJ02_Lon]
}

/*****************************************
 * 火星坐标系 (GCJ-02) 与百度坐标系 (BD-09) 的转换算法 将 GCJ-02 坐标转换成 BD-09 坐标
 *
 * @param gg_lat
 * @param gg_lon
 *****************************************/
//传入的参数  	GCJ02_To_BD09(*BD09_Lat,*BD09_Lon,BD09_Lat,BD09_Lon);
//(*BD09_Lat,*BD09_Lon)火星坐标,(BD09_Lat,BD09_Lon)是变量的地址
export function GCJ02_To_BD09(GCJ02_Lat, GCJ02_Lon){
    let x = GCJ02_Lon, y = GCJ02_Lat;
    let z = Math.sqrt(x * x + y * y) + 0.00002 * Math.sin(y * x_pi);
    let theta = Math.atan2(y, x) + 0.000003 * Math.cos(x * x_pi);
    let BD_09_Lon = z * Math.cos(theta) + 0.0065;
    let BD_09_Lat = z * Math.sin(theta) + 0.006;
    return [BD_09_Lon, BD_09_Lat]
}

/*************************************************************
 函数名称:GPS_transformation(double WGS84_Lat, double WGS84_Lon,double * BD_09_Lat, double * BD_09_Lon)
 函数功能:GPS坐标转百度地图坐标
 输入参数:WGS84_Lat,WGS84_Lon GPS获取到真实经纬度  储存得到的百度经纬度变量的地址 BD_09_Lat,BD_09_Lon指向那个变量
 输出参数:
 *************************************************************/
export function GPS_transformation(WGS84_Lat, WGS84_Lon){
    let Gcj02 = GPS84_To_GCJ02(WGS84_Lat, WGS84_Lon);//GPS坐标转火星坐标
    return GCJ02_To_BD09(Gcj02[0], Gcj02[1]); //火星坐标转百度坐标
}


export default {
    convertPoints,
    radian,
    transformLat,
    transformLon,
    GCJ02_To_BD09,
    GPS84_To_GCJ02,
    GPS_transformation,
}

猜你喜欢

转载自blog.csdn.net/huangyilinnuli/article/details/83303082
今日推荐