1、WGS84

WGS84与WGS84 Web Mercator

WGS84属于地理坐标系(GCS),是经纬度单位的椭球坐标系;WGS84 Web Mercator是投影坐标系(PCS),是平面直角坐标系

WGS84坐标系
1、WGS84是地心坐标系,空间直角坐标系,原点与地球质心重合,以经纬度高程为坐标系的坐标系统,其中B为纬度,L为经度,H为高程(海拔);
2、我国由于历史的原因,之前的数据均以北京1954或西安1980坐标系下的坐标,按照国家要求最新的测量以CGCS2000坐标系为主;
WGS84 Web Mercator:
1、谷歌地图(WGS_1984_Pseudo_mercator)、Virtual Earth、Bing Maps、百度地图、Mapabc、ArcGIS Online等采用Web Mercator或Spherical Mercator坐标系;
2、Web Mercator与常规墨卡托投影的主要区别就是把地球模拟为球体而非椭球体;
3、为什么选择墨卡托投影?等角正轴圆柱投影,等角保证了对象的形状不变形,也保证了方向和相互位置的正确性,等角的代价是面积的变形,特别是在两极地区;

2、笛卡尔坐标

三维地球中常使用球面坐标系,以地球质心为原点(0,0,0)的笛卡尔坐标系统

3、CGCS2000

WGS新标准下的地理坐标系,详细介绍可以看百度百科

建国以来,中国于上世纪50年代和80年代分别建立了1954年北京坐标系和1980西安坐标系,测制了各种比例尺地形图,在国民经济、社会发展和科学研究中发挥了重要作用,限于当时的技术条件,中国大地坐标系基本上是依赖于传统技术手段实现的。54坐标系采用的是克拉索夫斯基椭球体。该椭球在计算和定位的过程中,没有采用中国的数据,该系统在中国范围内符合得不好,不能满足高精度定位以及地球科学、空间科学和战略武器发展的需要。上世纪70年代,中国大地测量工作者经过二十多年的艰巨努力,终于完成了全国一、二等天文大地网的布测。经过整体平差,采用1975年IUGG第十六届大会推荐的参考椭球参数,中国建立了1980西安坐标系,1980西安坐标系在中国经济建设、国防建设和科学研究中发挥了巨大作用。
随着社会的进步,国民经济建设、国防建设和社会发展、科学研究等对国家大地坐标系提出了新的要求,迫切需要采用原点位于地球质量中心的坐标系统(以下简称地心坐标系)作为国家大地坐标系。采用地心坐标系,有利于采用现代空间技术对坐标系进行维护和快速更新,测定高精度大地控制点三维坐标,并提高测图工作效率。
2008年3月,由国土资源部正式上报国务院《关于中国采用2000国家大地坐标系的请示》,并于2008年4月获得国务院批准。自2008年7月1日起,中国将全面启用2000国家大地坐标系,国家测绘局授权组织实施。 [

几大坐标系的相互转换:

1、BLH->Cartesian3


Cesium.Cartesian3.fromDegrees(
    lonlathei.lon,
    lonlathei.lat,
    lonlathei.hei || 0,
    Cesium.Ellipsoid.WGS84
);


2、Cartesian3->BLH


function cartesian2BLH(cartesian) {
    let ellipsoid = Cesium.Ellipsoid.WGS84;
    let cartographic = ellipsoid.cartesianToCartographic(cartesian);
    let longitudeString = Cesium.Math.toDegrees(cartographic.longitude);
    let latitudeString = Cesium.Math.toDegrees(cartographic.latitude);
    let height = cartographic.height;
    let retObj = {};
    retObj.lonlat = [longitudeString, latitudeString];
    retObj.height = height;
    return retObj;
}


3、经纬度转墨卡托


//经纬度转墨卡托
function lngLatToMercator(poi) {
    let mercator = {};
    let earthRad = 6378137.0;
    // console.log("mercator-poi",poi);
    mercator.x = poi.lng * Math.PI / 180 * earthRad;
    let a = poi.lat * Math.PI / 180;
    mercator.y = earthRad / 2 * Math.log((1.0 + Math.sin(a)) / (1.0 - Math.sin(a)));
    // console.log("mercator",mercator);
    return mercator; //[12727039.383734727, 3579066.6894065146]
}


4、XYToBLH(工程坐标转经纬度)


function  XYtoBL(xyTemp) {
    cgcs2000参数:a = 6378137,f=1 / 298.257222101;wgs84参数为:a=6378137.0;f=1/298.257223565

    let xy = {
        X: xyTemp.X,
        Y: xyTemp.Y,
        mid_longitude: xyTemp.mid_longitude - 0,
        projLatitude: 0,
        projHeight: xyTemp.projHeight - 0,
        eastOffset: xyTemp.eastOffset - 0,
        northOffset: xyTemp.northOffset - 0
    };

    if (xy.mid_longitude === undefined) {
        xy.mid_longitude = 0;
    }
    if (xy.projHeight === undefined) {
        xy.projHeight = 0;
    }

    //东偏与北偏
    xy.eastOffset = (common.isNullEmpty(xy.eastOffset) || isNaN(xy.eastOffset) || xy.eastOffset == 0) ? 500000 : xy.eastOffset;
    xy.northOffset = (common.isNullEmpty(xy.northOffset) || isNaN(xy.northOffset)) ? 0 : xy.northOffset;

    let bl = {};
    let output = [];
    let longitude1, latitude1, longitude0, latitude0, xval, yval, Xd, Yd, prj_Hd, Xg, Yg, prj_Hg, X0, Y0;// latitude0,
    let e1, e2, f, a, ee, NN, T, C, M, D, R, u, fai, iPI, W, B;
    iPI = Math.PI / 180;
    let temp = (1 / Math.PI) / 2;
    a = 6378137;
    f = 1 / 298.257223565;
    e2 = 2 * f - f * f;
    e1 = (1.0 - Math.sqrt(1 - e2)) / (1.0 + Math.sqrt(1 - e2));
    ee = e2 / (1 - e2);
    longitude0 = xy.mid_longitude;

    latitude0 = xy.projLatitude;

    // 将独立坐标系Xd,Yd,prj_Hd转为标准3度分带高斯坐标系Xg,Yg,prj_Hg
    // R-投影区域地球平球曲率半径,与所在平均纬度相关,默认30度
    // prj_Hg-标准3度分带高斯坐标系投影面高程
    // prj_Hd-独立坐标系投影面高程
    // 标准3度分带高斯坐标系投影原点坐标X0,Y0
    //  (Xd-X0)/(R+prj_Hd)=(Xg-X0)/(R+prj_Hg)
    //  Xg=X0+(R+prj_Hg)*(Xd-X0)/(R+prj_Hd)
    // Yg=Y0+(R+prj_Hg)*(Yd-Y0)/(R+prj_Hd)
    W = Math.sqrt(1 - e2 * Math.sin((Math.PI * latitude0) / 180) * Math.sin((Math.PI * latitude0) / 180));
    R = a * Math.sqrt(1 - e2) / (W * W);
    X0 = xy.northOffset;
    Y0 = xy.eastOffset;
    prj_Hg = 0;
    prj_Hd = xy.projHeight;
    Xd = xy.X;
    Yd = xy.Y;
    Xg = X0 + (R + prj_Hg) * (Xd - X0) / (R + prj_Hd);
    Yg = Y0 + (R + prj_Hg) * (Yd - Y0) / (R + prj_Hd);
    yval = Yg - Y0;
    xval = Xg; // 带内大地坐标
    M = xval;
    u = M / (a * (1 - e2 / 4 - 3 * e2 * e2 / 64 - 5 * e2 * e2 * e2 / 256));
    fai = u + (3 * e1 / 2 - 27 * e1 * e1 * e1 / 32) * Math.sin(2 * u) + (21 * e1 * e1 / 16 - 55 * e1 * e1 * e1 * e1 / 32) * Math.sin(4 * u) + (151 * e1 * e1 * e1 / 96) * Math.sin(6 * u) + (1097 * e1 * e1 * e1 * e1 / 512) * Math.sin(8 * u);
    C = ee * Math.cos(fai) * Math.cos(fai);
    T = Math.tan(fai) * Math.tan(fai);
    NN = a / Math.sqrt(1.0 - e2 * Math.sin(fai) * Math.sin(fai));
    R = a * (1 - e2) / Math.sqrt((1 - e2 * Math.sin(fai) * Math.sin(fai)) * (1 - e2 * Math.sin(fai) * Math.sin(fai)) * (1 - e2 * Math.sin(fai) * Math.sin(fai)));
    D = yval / NN;
    // 计算经度(Longitude) 纬度(Latitude)
    longitude1 = (D - (1 + 2 * T + C) * D * D * D / 6 + (5 - 2 * C + 28 * T - 3 * C * C + 8 * ee + 24 * T * T) * D * D * D * D * D / 120) / Math.cos(fai);
    latitude1 = fai - (NN * Math.tan(fai) / R) * (D * D / 2 - (5 + 3 * T + 10 * C - 4 * C * C - 9 * ee) * D * D * D * D / 24 + (61 + 90 * T + 298 * C + 45 * T * T - 256 * ee - 3 * C * C) * D * D * D * D * D * D / 720);
    // 转换为度 DD
    output[0] = longitude0 + longitude1 / iPI;
    output[1] = latitude1 / iPI;
    bl.B = output[1];
    bl.L = output[0];
    return bl;
}