关于cesium加载kml点线面贴地问题(cesium1.94)
如果只是普通的点,只要在options参数上加clampToGround: true即可
const options = {
camera: viewer.scene.camera,
canvas: viewer.scene.canvas,
// 默认贴地
clampToGround: true,
};
const dataSource = Cesium.KmlDataSource.load(reader, options);
kml中线贴地格式如下:tessellate 标签为1时贴地,没有设置贴地一般就没有tessellate这个标签;
如果不想修改原文件内容就得修改源码, 在Source\DataSources\KmlDataSource.js文件里
在if判断里&&tessellate去掉即可, 如果是混淆过的代码就得搜索_clampToGround, 看到类型的判断,把&&l去掉即可 ,每次混淆的字母不一定是一样的所以不能直接搜e._clampToGround&&!u&&l
这样线就可以加载完成.
还有一个MultiGeometry(多重几何)的贴地,只有经纬度没高度的, 这种格式在arcgis里是可以贴地的, 但在cesium里无论怎么设置都无法贴地
我看了一下源码, cesium里是当多边形处理了并没有走线的方法(下图的方法),所以无论怎么也无法贴地
如果只是简单的修改可以自己读取coordinates的节点解析,逻辑大概就是如果是点位有高度就不加载,如果没有就和线的渲染方法一样加载, 以防万一,我用了try catch 但还没报错过
try {
if (coordinatesNode.innerHTML.split(" ")[0].split(",").length == 2) {
const polylineGraphics = new PolylineGraphics();
polylineGraphics.clampToGround = true;
entity.polyline = polylineGraphics;
polylineGraphics.positions = coordinates;
if (defined(polyline)) {
polylineGraphics.material = defined(polyline.material)
? polyline.material.color.getValue(Iso8601.MINIMUM_VALUE)
: Color.WHITE;
polylineGraphics.width = defaultValue(polyline.width, 1.0);
} else {
polylineGraphics.material = Color.WHITE;
polylineGraphics.width = 1.0;
}
return true;
}
} catch (error) {
console.log(error);
}
加载官网的kml没问题, 加载自己的kml也是没问题
目前还使用没出过问题, 如果有什么更好的方法欢迎大佬补充和校正
本文含有隐藏内容,请 开通VIP 后查看