关于cesium加载kml线贴地问题
关于cesium加载kml线贴地问题(cesium1.61)
在加载kml文件时,有的文件,线可以贴地,有的不能贴地,后来通过分析,主要原因是原始的kml文件中设置了贴地,在cesium中才贴地,否则在cesium中设置clampToGround: true也无法实现贴地;
1、原始数据格式
kml中贴地格式如下:tessellate 标签为1时贴地,没有设置贴地一般就没有tessellate这个标签;
2、cesium中加载kml(主要包含为线和点)
var options = {
camera: viewer.scene.camera,
canvas: viewer.scene.canvas,`在这里插入代码片`
clampToGround: true, //开启贴地
};
var kmlx=viewer.dataSources.add(Cesium.KmlDataSource.load(url, options));
kmlx.then(function (dataSource) {
viewer.flyTo(kmlx);
var entities = dataSource.entities.values;
for (var i = 0; i < entities.length; i++) {
var entity = entities[i];
//只对_billboard进行设置。
if (entity._billboard) {
entity._billboard.disableDepthTestDistance = Number.POSITIVE_INFINITY; //去掉地形遮挡
entity.billboard.heightReference=Cesium.HeightReference.CLAMP_TO_GROUND;//设置贴地
//设置文字标签,没有颜色(白色在cesium中非常不好看)替换成红色
entity._label.pixelOffset = new Cesium.Cartesian2(10, -20);
if ("undefined" === typeof (entity._label.fillColor)) {
entity._label.fillColor = Cesium.Color.RED;
}//if
}//if
}});
以上//只对_billboard进行设置。当为线时,设置entity.polyline.clampToGround=true可能出现错误,经过测试当发现当kml文件有标签时,是能这样设置贴地;当不存在,线就没这个属性,不能设置,就会导致出错。
3、 解决办法
第一种解决办法是:修改kml文件,在线的标签后添加
1
第二种解决办法是修改cesium.js,就是kml加载时,不管kml中有没有标签都设置成贴地;具体方法是:
(1)打开cesium.js查找 tessellate字符串。
(2)在该字符串后面找到如下代码:else if(t._clampToGround&&!f&&p),(3)去掉后面的&&p,
(4)保存即可,就是当cesium中设置了clampToGround,kml无论是否设置了贴地,在加载时都实现贴地。
(5)字符P是不同的。