你提供的代码 报错Expected latitude to be typeof number, actual typeof was undefined" name : "DeveloperError"
时间: 2025-04-03 18:06:32 浏览: 45
从错误信息来看,问题是由于传入的纬度值不是数字类型 (`number`),而是未定义 (`undefined`) 引起的。这通常发生在处理 GeoJSON 数据时,某些坐标点未能正确解析或格式不符合预期。
以下是解决该问题的具体步骤和改进后的代码:
---
### 解决方案分析
1. **检查GeoJSON文件的有效性**
确保你的 `adminBoundary.geojson` 文件是一个有效的 GeoJSON 格式,并且每个点都包含正确的经度和纬度数值。
2. **验证数据结构**
检查是否有空值或无效的数据项存在于 GeoJSON 的 `coordinates` 字段内。
3. **过滤无效数据**
在加载过程中加入额外的安全检查机制,跳过那些可能导致异常的数据片段。
---
### 改进后的代码
```javascript
// 初始化Cesium Viewer
var viewer = new Cesium.Viewer('cesiumContainer', {
terrainProvider: Cesium.createWorldTerrain(),
});
function isValidCoordinate(coord) {
// 验证经纬度是否合法(非null、非undefined并且是有限浮点数)
return (
Array.isArray(coord) &&
coord.length >= 2 &&
typeof coord[0] === 'number' &&
typeof coord[1] === 'number' &&
isFinite(coord[0]) &&
isFinite(coord[1])
);
}
function sanitizeCoordinates(coordinatesArray) {
return coordinatesArray.map(function(subArray) {
if (Array.isArray(subArray)) {
return subArray.filter(isValidCoordinate); // 过滤非法坐标
} else {
console.warn("Unexpected structure in coordinate data:", subArray);
return [];
}
});
}
// 假设您的GeoJSON文件名为 "adminBoundary.geojson"
async function loadAndClipWithGeoJSON(url) {
try {
// 加载GeoJSON数据源
const dataSourcePromise = await Cesium.GeoJsonDataSource.load(url, {
stroke: Cesium.Color.BLUE,
fill: Cesium.Color.RED.withAlpha(0.5),
strokeWidth: 2
});
const entities = dataSourcePromise.entities.values;
// 获取所有实体边界(Polygons)
let sanitizedPolygons = [];
for (let i = 0; i < entities.length; i++) {
if (!entities[i].polygon || !entities[i].polygon.hierarchy) continue;
// 清理并验证坐标数组有效性
const polygonHierarchy = entities[i].polygon.hierarchy.getValue(Cesium.JulianDate.now());
if (polygonHierarchy && polygonHierarchy.positions.every(isValidCoordinate)) {
sanitizedPolygons.push(entities[i]);
} else {
console.error(`Invalid hierarchy found at entity ${i}:`, polygonHierarchy);
}
}
// 全球底图遮罩层初始化
var globalRectangleEntity = viewer.entities.add({
rectangle: {
coordinates: Cesium.Rectangle.fromDegrees(-180, -90, 180, 90),
material: Cesium.Color.BLACK.withAlpha(0.7),
},
});
// 构建裁剪平面列表
function createClippingPlanesFromPolygon(entity) {
return entity.polygon.hierarchy.getValue(Cesium.JulianDate.now()).positions.map((position) => {
const ellipsoidPoint = Cesium.Cartographic.toCartesian(
Cesium.Ellipsoid.WGS84.cartographicToCartesian(new Cesium.Cartographic(position.longitude * Math.PI / 180, position.latitude * Math.PI / 180))
);
return new Cesium.ClippingPlane(
Cesium.Cartesian3.normalize(ellipsoidPoint, new Cesium.Cartesian3()),
Cesium.Cartesian3.magnitudeSquared(ellipsoidPoint)
);
}).filter(Boolean); // 移除可能存在的空平面
}
let allClippingPlanes = sanitizedPolygons.flatMap(createClippingPlanesFromPolygon);
if(allClippingPlanes.length > 0){
// 设置裁剪效果给整个地球表面
viewer.scene.globe.clippingPlanes = new Cesium.ClippingPlaneCollection({
planes: allClippingPlanes,
edgeWidth: 0.0,
edgeColor: Cesium.Color.WHITE,
});
}
// 自动缩放到合适视角
viewer.zoomTo(dataSourcePromise);
} catch (error) {
console.error("Failed loading or processing the geojson source.", error.message);
}
}
// 执行函数加载本地GeoJSON文件路径替换为实际可用链接地址
loadAndClipWithGeoJSON('./data/adminBoundary.geojson');
```
---
### 修改要点总结
- 新增了两个辅助工具方法:一个是检测单个坐标有效性的 `isValidCoordinate()` ,另一个是用来清理嵌套坐标数组的 `sanitizeCoordinates()` 函数。
- 在遍历每一个行政区划多边形之前增加了合法性判断环节以避免潜在的风险因素继续向下传递造成崩溃情形发生。
- 对创建裁减面部分也进行了相应的健壮化改造从而保障即使个别位置存在问题也不会影响其余正常区域的表现成果质量。
---
阅读全文
相关推荐


















