🌏 趣味学习Cesium坐标转换 🚀
📍 坐标系统的"平行宇宙"
想象一下,Cesium中的坐标系就像不同的平行宇宙,每个宇宙都用自己的"语言"来描述同一个位置:
⭐ 重点: Cesium中存在3种主要坐标系统,需要在它们之间自由转换
🗺️ 坐标系统的"身份证"
坐标系统 | 说明 | 形式 | 应用场景 |
---|---|---|---|
🌐 WGS84 | 地球的"经纬度语言" | (经度,纬度,高度) | 定位、导航、地理信息 |
📊 笛卡尔坐标 | 3D空间的"数学语言" | (x,y,z) | 三维计算、动画、渲染 |
🖥️ 屏幕坐标 | 屏幕的"像素语言" | (x,y) | 交互、UI显示、鼠标事件 |
🔄 坐标转换"魔法咒语"
1️⃣ 从WGS84到笛卡尔的魔法 🧙♂️
魔法咒语:
// 单点转换
const position = Cesium.Cartesian3.fromDegrees(longitude, latitude, height);// 多点转换
const positions = Cesium.Cartesian3.fromDegreesArray([lon1, lat1, lon2, lat2]);
2️⃣ 从笛卡尔到WGS84的魔法 🔮
魔法咒语:
const cartographic = viewer.scene.globe.ellipsoid.cartesianToCartographic(cartesian);
const longitude = Cesium.Math.toDegrees(cartographic.longitude);
const latitude = Cesium.Math.toDegrees(cartographic.latitude);
const height = cartographic.height;
3️⃣ 屏幕与世界的穿越 🌌
魔法咒语:
// 屏幕→世界
const worldPosition = viewer.scene.pickPosition(new Cesium.Cartesian2(x, y));// 世界→屏幕
const windowPosition = Cesium.SceneTransforms.worldToWindowCoordinates(scene, position);
🎮 坐标转换冒险游戏
想象你是一名空间魔法师,要完成以下任务:
任务1:📱 触摸屏幕获取地理位置
// 1. 获取屏幕点击位置
const screenPosition = new Cesium.Cartesian2(clickX, clickY);// 2. 转换为世界坐标
const worldPosition = viewer.scene.pickPosition(screenPosition);// 3. 世界坐标转为地理坐标
const geographicPosition = Cesium.Cartographic.fromCartesian(worldPosition);
const longitude = Cesium.Math.toDegrees(geographicPosition.longitude);
const latitude = Cesium.Math.toDegrees(geographicPosition.latitude);// 恭喜!你找到了宝藏的位置:(longitude, latitude)
任务2:📏 测量两点距离
// 1. 将两个经纬度点转为笛卡尔坐标
const position1 = Cesium.Cartesian3.fromDegrees(lon1, lat1, height1);
const position2 = Cesium.Cartesian3.fromDegrees(lon2, lat2, height2);// 2. 计算两点间距离
const distance = Cesium.Cartesian3.distance(position1, position2);// 恭喜!两点间距离为:distance 米
📝 实用坐标转换"食谱"
🍳 "经纬度转笛卡尔"食谱
function 经纬度转笛卡尔(经度, 纬度, 高度=0) {return Cesium.Cartesian3.fromDegrees(经度, 纬度, 高度);
}
🥘 "笛卡尔转经纬度"食谱
function 笛卡尔转经纬度(cartesian) {// 1. 获取弧度形式的坐标const cartographic = Cesium.Cartographic.fromCartesian(cartesian);// 2. 转换为角度return {经度: Cesium.Math.toDegrees(cartographic.longitude),纬度: Cesium.Math.toDegrees(cartographic.latitude),高度: cartographic.height};
}
🍲 "屏幕转地理位置"食谱
function 屏幕点击转地理位置(屏幕X, 屏幕Y) {// 1. 屏幕坐标→射线const ray = viewer.camera.getPickRay(new Cesium.Cartesian2(屏幕X, 屏幕Y));// 2. 射线与地球相交const position = viewer.scene.globe.pick(ray, viewer.scene);// 3. 转为经纬度return 笛卡尔转经纬度(position);
}
💡 坐标转换的"过三关"
⭐ 重点提示:
- 坐标转换的核心是明确起始坐标系和目标坐标系
- 笛卡尔坐标是Cesium内部计算的基础
- 所有从屏幕到真实世界的交互都需要坐标转换
🎭 坐标系角色扮演
想象三个坐标系是三种不同的人:
- WGS84: 一位地理学家,喜欢用"东经120度,北纬30度"这样的方式描述位置
- 笛卡尔: 一位数学家,总是用"X=100, Y=200, Z=300"的方式思考
- 屏幕坐标: 一位像素艺术家,只认识"左边500像素,顶部300像素"的语言
要让这三个人相互理解,你需要不断进行"翻译"——这就是坐标转换!
📚 学习小贴士
- 先理解概念,再记忆API
- 画出坐标转换关系图,帮助记忆
- 编写工具函数,简化常用转换
- 从实际项目中学习现有的转换方法
记住:坐标转换就像语言翻译,掌握了它,你就能在Cesium的不同"国度"间自由旅行!🚀