cesium加载KML点线面地贴

发布于:2022-12-19 ⋅ 阅读:(971) ⋅ 点赞:(0)

关于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 后查看