Cesium中高德、百度地图的偏移矫正
一、坐标系介绍
不同地图的坐标系
(1)WGS84(cesium GPS)
即GPS原始坐标系,也是当今三维开发中最普遍使用的坐标系。
(2)GCJ-02:火星坐标系(高德)
由国测局发布的加密坐标系,是国内互联网地图最广泛使用的坐标系,包括高德、腾讯。
(3)BD-09(百度地图)
百度地图所采用的坐标系,即在火星坐标系上进一步偏移得到,与高德地图相差不大。
(4)CGCS2000(天地图)
又称2000国家大地坐标系,由西安80坐标系发展而来,一般使用高斯克吕格投影,用于国内土地调查等坐标参考系。天地图采用此坐标系.
二、实现效果
底图为Cesium中默认的必应地图,上面是高德地图的注记地图。
二、实现方法
(1)添加坐标转换的js文件 CoordTransform.js;
const BD_FACTOR = (3.14159265358979324 * 3000.0) / 180.0; // 百度坐标系的修正因子
const PI = 3.1415926535897932384626; // 圆周率
const RADIUS = 6378245.0; // 地球半径
const EE = 0.00669342162296594323; // 椭球的偏心率平方
class CoordTransform {
/**
* BD-09(百度坐标系) To GCJ-02(火星坐标系) 的转换方法
* @param lng 经度
* @param lat 纬度
* @returns {number[]} 返回经纬度数组
*/
static BD09ToGCJ02(lng, lat) {
let x = +lng - 0.0065; // 经度修正
let y = +lat - 0.006; // 纬度修正
let z = Math.sqrt(x * x + y * y) - 0.00002 * Math.sin(y * BD_FACTOR); // z 值修正
let theta = Math.atan2(y, x) - 0.000003 * Math.cos(x * BD_FACTOR); // theta 值修正
let gg_lng = z * Math.cos(theta); // 修正后的经度
let gg_lat = z * Math.sin(theta); // 修正后的纬度
return [gg_lng, gg_lat];
}
/**
* GCJ-02(火星坐标系) To BD-09(百度坐标系) 的转换方法
* @param lng 经度
* @param lat 纬度
* @returns {number[]} 返回经纬度数组
*/
static GCJ02ToBD09(lng, lat) {
lat = +lat;
lng = +lng;
let z = Math.sqrt(lng * lng + lat * lat) + 0.00002 * Math.sin(lat * BD_FACTOR); // z 值修正
let theta = Math.atan2(lat, lng) + 0.000003 * Math.cos(lng * BD_FACTOR); // theta 值修正
let bd_lng = z * Math.cos(theta) + 0.0065; // 修正后的经度
let bd_lat = z