关于地图偏移官方给出的说明:
4.3 百度坐标为何有偏移?
国际经纬度坐标标准为WGS-84,国内必须至少使用国测局制定的GCJ-02,对地理位置进行首次加密。百度坐标在此基础上,进行了BD-09二次加密措施,更加保护了个人隐私。百度对外接口的坐标系并不是GPS采集的真实经纬度,需要通过坐标转换接口进行转换。
解决办法
setZoom(json.data); //多个坐标数组
//设置中心点
function setZoom(points) {
if (points.length > 0) {
var maxLng = points[0].DV_LNG; //最大最小经纬度赋值
var minLng = points[0].DV_LNG;
var maxLat = points[0].DV_LAT;
var minLat = points[0].DV_LAT;
var res;
for (var i = points.length - 1; i >= 0; i--) {
res = points[i];
if (res.DV_LNG > maxLng) maxLng = res.DV_LNG; //取最大经度
if (res.DV_LNG < minLng) minLng = res.DV_LNG; //取最小经度
if (res.DV_LAT > maxLat) maxLat = res.DV_LAT; //取最大纬度
if (res.DV_LAT < minLat) minLat = res.DV_LAT; //取最小纬度
};
var cenLng = (parseFloat(maxLng) + parseFloat(minLng)) / 2; //通过最大最小经纬度取中心点
var cenLat = (parseFloat(maxLat) + parseFloat(minLat)) / 2;
var zoom = getZoom(maxLng, minLng, maxLat, minLat); //取缩放比例
// map.centerAndZoom(new BMap.Point(cenLng, cenLat), zoom); //设置中心点以及缩放比例
var point = new BMap.Point(cenLng , cenLat); // 创建点坐标
BMap.Convertor.translate(point,0,zoom,translateCallback); //真实经纬度转成百度坐标,解决偏移问题!!!这是重点
} else {
//没有坐标,显示全中国
map.centerAndZoom(new BMap.Point(103.388611, 35.563611), 6);
}
}
//根据经纬极值计算绽放级别。
function getZoom(maxLng, minLng, maxLat, minLat) {
var zoom = ["50", "100", "200", "500", "1000", "2000", "5000", "10000", "20000", "25000", "50000", "100000",
"200000", "500000", "1000000", "2000000"
] //级别18到3。
var pointA = new BMap.Point(maxLng, maxLat); // 创建点坐标A
var pointB = new BMap.Point(minLng, minLat); // 创建点坐标B
var distance = map.getDistance(pointA, pointB).toFixed(1); //获取两点距离,保留小数点后两位
for (var i = 0, zoomLen = zoom.length; i < zoomLen; i++) {
if (zoom[i] - distance > 0) {
return 18 - i + 3; //之所以会多3,是因为地图范围常常是比例尺距离的10倍以上。所以级别会增加3。
}
};
}
//坐标转换完之后的回调函数
function translateCallback(point1,zoom){
map.centerAndZoom(point1, zoom); //设置中心点以及缩放比例
}