经纬志
首页 / three.js / 使用示例

地球球体

一个带经纬网的球体,纹理由 Canvas 逐像素生成,北京、上海、广州三个坐标按经纬度落在球面上。 这个示例把「经纬度 → 三维坐标」讲完整。

three.js 0.160.0 · 更新 2026-10-27
源码与运行效果
运行效果

说明

纹理是一张 1024 × 512 的 Canvas,横轴对应经度 −180° 到 180°,纵轴对应纬度 90° 到 −90°。 每个像素用三组正弦叠加判断陆地与海洋,再叠上每 30 度一条的经纬网。 这张图只用于演示材质与坐标换算,形状并不对应真实大陆。

城市标记用同一个换算函数得到球面位置:经度决定绕 Y 轴的角度,纬度决定从北极向下的极角。 标记由球面点、外挑的细杆与顶端小球组成,侧视时更容易辨认。

设置取值说明
球体半径1.6场景单位,不代表真实比例
球体分段96 × 64近看仍平滑,顶点数可控
纹理尺寸1024 × 5122:1 的等经纬度展开
标记半径1.608 / 1.728底部贴球面,顶端抬高约 8%
初始朝向绕 Y 轴 180°让东经 100° 附近正对镜头
各向异性硬件上限斜看球面时纹理更清晰

经纬度换算的关键

换算核心只有三行:极角 phi = (90 − lat) × π / 180, 方位角 theta = (lon + 180) × π / 180,半径是球半径加高度。 球面坐标转直角坐标时,三个分量的正负号必须与纹理的经度方向一致, 否则标记会左右镜像,看起来「在北京的位置出现了广州的点」。

示例里把整个地球组绕 Y 轴转了 180 度,只是调整初始观察面,不改变换算公式。 如果换成自己提供的底图,需要检查纹理的经度零点与公式是否匹配; 不匹配时,可以整体旋转组来修正,而不是逐个改坐标。

标记为什么抬高

标记球心正好落在球面上时,一半在里一半在外,远看只是一个点。 把它抬到半径的 1.005 倍,再向外拉一根细杆到 1.08 倍, 既不会穿模,又能让标记在球体轮廓之外被看清。

换成真实底图

把 Canvas 换成一张等经纬度的地球影像即可,例如带版权许可的 Natural Earth 或 NASA 蓝色弹珠。 纹理的 colorSpace 要设为 sRGB,经度零点在图片左边。 如果要显示国界、道路,最好在服务端按经纬度切片,而不是用一张超大图硬贴。

球面适合看全球,不适合量距离。半径 1.6 的球让你看清分布, 但屏幕上量出的长度没有地理意义。需要距离、面积时,回到局部平面并使用真实比例。