我就直接把我整理的模块摆上去吧!有需要的可以直接复制过去导入就可以用了。
/**
* 采用百度地图的转换方法,向百度地图服务器请求转换结果,
* 普通用户有次数限制,另外异步转换,改方法可以无限转换,
* 转换完成调用回调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,
}