openlayers加载天地图作为底图,在网上找了公开的服务资源,要做到百度地图与天地图之间切换,同样也从网上找到百度地图的服务资源但是在地图上坐标总是有偏差,最初的代码是这样的:
var projection = ol.proj.get("EPSG:3857"); //加载百度地图采用3857坐标系
var resolutions = [];
for(var i=0; i<19; i++){
resolutions[i] = Math.pow(2, 18-i);
}
var tilegrid = new ol.tilegrid.TileGrid({
origin: [2200,23],
resolutions: resolutions
});
var baidu_source = new ol.source.TileImage({
projection: "EPSG:3857",
tileGrid: tilegrid,
tileUrlFunction: function(tileCoord, pixelRatio, proj){
if(!tileCoord){
return "";
}
var z = tileCoord[0];
var x = tileCoord[1];
var y = tileCoord[2];
console.log(x+" "+y+" "+z);
if(x<0){
x = "M"+(-x);
}
if(y<0){
y = "M"+(-y);
}
return "http://online3.map.bdimg.com/onlinelabel/?qt=tile&x="+x+"&y="+y+"&z="+z+"&styles=pl&udt=20151021&scaler=1&p=1";
}
});
var baidu = new ol.layer.Tile({
title : "百度地图卫星服务",
source : baidu_source
});
var map = new ol.Map({
layers: [
baidu
],
// 设置显示地图的视图
view: new ol.View({
center: [120.65527228569908, 31.296768058299392],
projection: 'EPSG:4326', //指定投影采用4326坐标系
zoom: 13 // 并且定义地图显示层级为13
}),
target: 'map'
});
采用上面的方式加载,百度地图能够加载出来,但是与天地图总是会存在坐标上的偏移,原因是百度地图的坐标系很特殊,采用加密之后的BD-09坐标系,因此要想在地图上正常显示出来,必须转换成3857坐标系,但是转换之后还是有偏差;经过处理方法,转换成baiduMercator 投影后发现偏差比3857坐标系小了很多,经过处理后的代码是这样的:
var forEachPoint = function(func) {
return function(input, opt_output, opt_dimension) {
var len = input.length;
var dimension = opt_dimension ? opt_dimension : 2;
var output;
if (opt_output) {
output = opt_output;
} else {
if (dimension !== 2) {
output = input.slice();
} else {
output = new Array(len);
}
}
for (var offset = 0; offset < len; offset += dimension) {
func(input, output, offset)
}
return output;
};
};
var sphericalMercator = {}
var RADIUS = 6378137;
var MAX_LATITUDE = 85.0511287798;
var RAD_PER_DEG = Math.PI / 180;
sphericalMercator.forward = forEachPoint(function(input, output, offset) {
var lat = Math.max(Math.min(MAX_LATITUDE, input[offset + 1]), -MAX_LATITUDE);
var sin = Math.sin(lat * RAD_PER_DEG);
output[offset] = RADIUS * input[offset] *