cesium1.132没有Cartesian3.fromCartographic这个方法
时间: 2025-09-04 20:05:05 AIGC 浏览: 15
非常正确!在 **Cesium 1.132** 版本中,`Cartesian3.fromCartographic()` 方法 **已经被移除**,这是因为在较新的 Cesium 版本中,`Cartographic` 和 `Cartesian3` 的转换逻辑被更明确地划分了,取而代之的是:
> ✅ 使用 `Cartesian3.fromRadians()` 或 `Cartesian3.fromDegrees()` 直接从经纬度转换为世界坐标(ECEF)。
---
## ✅ 一、问题说明
在 Cesium 1.132 中:
```javascript
Cesium.Cartesian3.fromCartographic(carto); // ❌ 已被移除
```
你需要使用:
```javascript
Cesium.Cartesian3.fromDegrees(longitude, latitude, height); // ✅ 推荐
```
或者:
```javascript
Cesium.Cartesian3.fromRadians(radianLongitude, radianLatitude, height); // ✅
```
---
## ✅ 二、解决方案:将 `Cartographic` 转换为 `Cartesian3`
如果你有一个 `Cartographic` 对象(比如从相机或拾取操作中获取),你需要手动提取其 `longitude`、`latitude` 和 `height`,然后使用 `fromDegrees` 或 `fromRadians` 转换。
### ✅ 方法 1:使用 `fromDegrees`
```javascript
const carto = Cesium.Cartographic.fromDegrees(-115.0, 32.0, 0.0);
const cartesian = Cesium.Cartesian3.fromRadians(carto.longitude, carto.latitude, carto.height);
```
### ✅ 方法 2:直接使用 `fromDegrees`
```javascript
const cartesian = Cesium.Cartesian3.fromDegrees(-115.0, 32.0, 0.0);
```
---
## ✅ 三、完整示例:构建局部坐标系并转换点(适用于 Cesium 1.132)
```javascript
// Step 1: 定义两个点的经纬度和局部坐标
const pointA = {
longitude: -115.0,
latitude: 32.0,
height: 0.0,
local: new Cesium.Cartesian3(0, 0, 0)
};
const pointB = {
longitude: -115.1,
latitude: 32.1,
height: 0.0,
local: new Cesium.Cartesian3(100, 50, 0)
};
// Step 2: 转换为世界坐标(使用 fromDegrees)
const worldA = Cesium.Cartesian3.fromDegrees(pointA.longitude, pointA.latitude, pointA.height);
const worldB = Cesium.Cartesian3.fromDegrees(pointB.longitude, pointB.latitude, pointB.height);
// Step 3: 构建局部坐标系(ENU)
// 1. 构建东方向向量(x轴)
let eastVec = Cesium.Cartesian3.subtract(worldB, worldA, new Cesium.Cartesian3());
eastVec = Cesium.Cartesian3.normalize(eastVec, new Cesium.Cartesian3());
// 2. 构建地表法线方向(z轴)
const upVec = Cesium.Cartesian3.normalize(Cesium.Cartesian3.clone(worldA), new Cesium.Cartesian3());
// 3. 构建北方向向量(y轴) = up × east
let northVec = Cesium.Cartesian3.cross(upVec, eastVec, new Cesium.Cartesian3());
northVec = Cesium.Cartesian3.normalize(northVec, new Cesium.Cartesian3());
// 4. 构建旋转矩阵(ENU)
const rotation = new Cesium.Matrix3();
Cesium.Matrix3.setColumn(rotation, 0, eastVec, rotation);
Cesium.Matrix3.setColumn(rotation, 1, northVec, rotation);
Cesium.Matrix3.setColumn(rotation, 2, upVec, rotation);
// 5. 构建局部坐标系到世界坐标的变换矩阵
const localToWorld = Cesium.Matrix4.fromRotationTranslation(rotation, worldA);
// Step 4: 将局部坐标转换为世界坐标
function localToCartesian3(localPoint) {
return Cesium.Matrix4.multiplyByPoint(localToWorld, localPoint, new Cesium.Cartesian3());
}
// 示例:将任意局部点 (50, 25, 10) 转换为世界坐标
const arbitraryPoint = new Cesium.Cartesian3(50, 25, 10);
const resultArbitrary = localToCartesian3(arbitraryPoint);
console.log('局部点 (50,25,10) 转世界坐标:', resultArbitrary);
// Step 5: 在 Cesium 中显示点
viewer.entities.add({
position: resultArbitrary,
point: {
pixelSize: 10,
color: Cesium.Color.RED
}
});
```
---
## ✅ 四、总结:Cesium 1.132 中的坐标转换方法
| 方法 | 用途 |
|------|------|
| `Cartesian3.fromDegrees(lon, lat, height)` | 将经纬度(度)转换为世界坐标(ECEF) |
| `Cartesian3.fromRadians(lon, lat, height)` | 将经纬度(弧度)转换为世界坐标 |
| `Cartographic.fromDegrees(lon, lat, height)` | 创建 Cartographic(用于其他用途) |
| `Cartesian3.subtract(a, b, result)` | 向量减法 |
| `Cartesian3.normalize(vec, result)` | 单位化向量 |
| `Cartesian3.cross(a, b, result)` | 向量叉乘 |
| `Matrix3.setColumn(matrix, index, vector, result)` | 设置旋转矩阵列 |
| `Matrix4.fromRotationTranslation(rotation, translation)` | 构建变换矩阵 |
---
##
阅读全文
相关推荐

















