Cesium11:加载geojson面贴地和显示边界问题

文章介绍了在Cesium中加载geojson面数据时遇到的问题,即部分数据在地形下显示不全,以及设置clampToGround属性后边界的消失。通过创建额外的polyline实体作为边界线解决了边界显示问题。此外,文章还展示了如何为不同geojson面设置不同的颜色和随机高度,以及调整用户交互如禁用相机旋转、平移和缩放等。

1.背景

cesium加载geojson面数据后,有部分数据在地形下面显示不全, 加了clampToGround: true,设置贴地后,边界又不见了

this.viewer.dataSources.add(GeoJsonDataSource.load('http://xx/xzbj.geojson', {
            stroke: Color.BLACK.withAlpha(0.5),
            strokeWidth: 2.3,
            fill: Color.CORAL.withAlpha(0.4),
            //clampToGround: true
        })).then(data => {
            this.perLayer = data;
            //this.viewer.zoomTo(this.perLayer)
        });

2.解决

添加polygon实体后,设置outline属性。但是当height属性不设置时,会发现边界线不显示了。这边可以通过再绘制一个polyline实体来作为边界线,代码如下:

 var positions = entity.polygon.hierarchy._value.positions;
    this.viewer.entities.add({
        name: 'boderLine',
        polyline: {
            positions: positions,
            width: 2,
            material: Color.BLACK.withAlpha(0.5),
            clampToGround: true
        }
    })

3.其他

(1)加载geojson 设置不同面颜色和高度

var m =this;
CesiumMath.setRandomNumberSeed(0);  //设置随机数种子
var promise =GeoJsonDataSource.load('http://xxx/g_xzbj.geojson'); //geojson面数据
promise.then(function(dataSource) {
  m.viewer.dataSources.add(dataSource);
  var entities = dataSource.entities.values;
  var colorHash = {};
  for (var i = 0; i < entities.length; i++) {
       var entity = entities[i];
       var name = entity.id;  //geojson里面必须得有一个name属性,entity.name对应
       var color = colorHash[name]; //可以使两个同名要素使用同一种颜色。。。
       if (!color) {
            color = Color.fromRandom({
               alpha : 1.0
            });
            colorHash[name] = color;
       }
       entity.polygon.material =  color;
       entity.polygon.outline = false;
       entity.polygon.extrudedHeight = Math.floor(Math.random()*500+1000) 
       //1000~500的随机数,单位是米
       m.viewer.zoomTo(promise);
  }
});

(2)常用设置

// 如果为真,则允许用户旋转相机。如果为假,相机将锁定到当前标题。此标志仅适用于2D和3D。
 viewer.scene.screenSpaceCameraController.enableRotate = false;
 如果为true,则允许用户平移地图。如果为假,相机将保持锁定在当前位置。此标志仅适用于2D和Columbus视图模式。
viewer.scene.screenSpaceCameraController.enableTranslate = false;
// 如果为真,允许用户放大和缩小。如果为假,相机将锁定到距离椭圆体的当前距离
viewer.scene.screenSpaceCameraController.enableZoom = false;
// 如果为真,则允许用户倾斜相机。如果为假,相机将锁定到当前标题。这个标志只适用于3D和哥伦布视图。
viewer.scene.screenSpaceCameraController.enableTilt = false;

<think>好的,我需要帮助用户在Cesium中创建DataSource来加载GeoJSON数据。首先,根据用户提供的引用内容,特别是引用[1]引用[3],GeoJsonDataSource是专门处理GeoJSON格式的类。用户需要具体的示例教程,所以我应该一步步解释如何实现。 首先,用户需要引入CesiumGeoJSON文件。在代码中,必须创建Viewer实例,这是Cesium的基础容器。然后,使用GeoJsonDataSource的load方法加载外部GeoJSON文件,这一步需要处理异步操作,所以要用Promise或者async/await。加载完成后,将返回的dataSource添加到viewer.dataSources中,并调整相机视角到数据范围,这可以通过zoomTo方法实现。 另外,用户可能需要了解如何自定义图层的样式,比如修改颜色或图标。引用[2]提到DataSourceEntity的关系,所以可能需要通过entities属性来调整。但根据引用[1],GeoJsonDataSource已经封装了数据加载,可能支持配置选项来自定义样式,这样更简便。 还需要考虑错误处理,比如加载失败的情况,但用户的问题主要是创建加载,可能暂时不需要深入错误处理。最后,应该提供相关的问题,比如性能优化或数据源管理,帮助用户进一步学习。确保所有步骤符合用户提供的引用内容,并正确使用LaTeX格式,比如变量或代码块。</think>在Cesium中创建DataSource加载GeoJSON数据需要遵循以下步骤: ### 一、基础实现 1. **引入GeoJsonDataSource模块** ```javascript const viewer = new Cesium.Viewer('cesiumContainer'); const dataSourcePromise = Cesium.GeoJsonDataSource.load('data/geojson/sample.geojson'); ``` 2. **异步加载并添加数据源** ```javascript dataSourcePromise.then(dataSource => { viewer.dataSources.add(dataSource); viewer.zoomTo(dataSource); // 自动调整视角 }).catch(error => { console.error('加载GeoJSON失败:', error); }); ``` 此代码实现了GeoJSON数据源的加载与可视化[^3] ### 二、高级配置 使用$options$参数自定义样式: ```javascript const options = { stroke: Cesium.Color.RED, fill: Cesium.Color.BLUE.withAlpha(0.5), markerSymbol: '?' }; Cesium.GeoJsonDataSource.load(url, options).then(/* ... */); ``` 支持配置线型($strokeWidth$)、填充透明度($fillOpacity$)、标注图标等20+样式属性[^1] ### 三、数据源管理 1. **数据源引用获取** ```javascript const dataSourceCollection = viewer.dataSources; const defaultEntities = viewer.entities; // 对应默认数据源的实体集合[^2] ``` 2. **动态移除操作** ```javascript const removeDataSource = () => { viewer.dataSources.remove(dataSource); // 或移除全部:viewer.dataSources.removeAll() } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值