Three经纬度转世界坐标算法

一、简介

用Three创建三维地球(sphere),将经纬度转换为笛卡尔坐标在球面进行展示。

二、流程

1、SphereGeometry 生成

SphereGeometry的构造函数如下

SphereGeometry(radius : Float, widthSegments : Integer, heightSegments : Integer, phiStart : Float, phiLength : Float, thetaStart : Float, thetaLength : Float)
radius — 球体半径,默认为1。
widthSegments — 水平分段数(沿着经线分段),最小值为3,默认值为8。
heightSegments — 垂直分段数(沿着纬线分段),最小值为2,默认值为6。
phiStart — 指定水平(经线)起始角度,默认值为0。。
phiLength — 指定水平(经线)扫描角度的大小,默认值为 Math.PI * 2。
thetaStart — 指定垂直(纬线)起始角度,默认值为0。
thetaLength — 指定垂直(纬线)扫描角度大小,默认值为 Math.PI。

主要看 phiStart 和 thetaStart,分别是球体横向的起点,与纵向的起点。其中横向的起点是X轴的负半轴,纵向的起点是Y轴正半轴,如图所示,也就是说如果对球体进行贴图,那么贴图的左半边是起点对应的X轴的负半轴,贴图的上边对应的是Y轴的正半轴,知道这一点后就可以对球面进行贴图了

2、球面贴图

贴图用的是墨卡托投影的世界地图

地图贴上去后展示左半边对应的是球体的x轴负半轴,如图所示,此处需要注意本初子午线(即墨卡托零度线)的位置

3、经纬度转世界坐标(笛卡尔坐标)

在计算之前,需要先理解经纬度的含义,如下图所示

经度以子午线为起点,向右转动A(50)度,到达东经50度,然后以赤道为期起点,向上转动B(40)度,到达北纬40度,理解经纬度如何计算之后,就可以开始推导公式了,设球体的半径为 R,R *  sin(B)便可以计算出点位的Y轴坐标。R * cos(B) 将点位投影到ZX轴构成的平面得到点位A1,A1 * COS(A)则可以得到Z轴坐标,A1 * sin(A)则可以得到X轴的坐标。代码如下

function getPosition(longitude, latitude, radius) {
    var lg = THREE.Math.degToRad(longitude);
    var lt = THREE.Math.degToRad(latitude);
    var temp = radius * Math.cos(lt);
    var x = temp * Math.sin(lg);
    var y = radius * Math.sin(lt);
    var z = temp * Math.cos(lg);
    return {
        x: x,
        y: y,
        z: z
    }
}

输入经纬度坐标(50,40),结果如图,可能会有人有疑问,点位实际效果与上面的示例图有着很大的差距,这个问题就需要回看上面的图中特地标出的本初子午线的位置了,算法计算的时候是以Z轴的正半轴为起点计算的,而实际上贴图之后的本初子午线是在X轴的正半轴,之间差了90度,所以在计算之前需要把经度加上90在进行计算。

输入(140,40),输出的结果如图,现在的点位就是正确的点位了

猜你喜欢

转载自blog.csdn.net/oneKnow/article/details/106891238