Cesium DataSourceCollection图层排序

时间:2016-03-21 13:58:51

标签: javascript z-index gis geojson cesium

我想要在Cesium地球上放置多个GeoJsonDataSource个对象。问题是,如果它们重叠,我会遇到一些z-fighting问题,我无法调整它们的顺序。

有没有办法在DataSource中指定DataSourceCollection个对象的顺序?

例如,我想使用以下代码将绿色多边形放在红色多边形的顶部:

var viewer = new Cesium.Viewer('cesiumContainer');

var red = Cesium.GeoJsonDataSource.load('map1.geojson', {
  fill: new Cesium.Color(1, 0, 0, 1.0)
});

var green = Cesium.GeoJsonDataSource.load('map2.geojson', {
  fill: new Cesium.Color(0, 1, 0, 1.0)
});

viewer.dataSources.add(red);
viewer.dataSources.add(green);

然而,结果如下:

Cesium screenshot showing z-fighting

我注意到如果我将alpha参数调整为小于1.0,我可以修复z-fighting,但订单仍然无法解决。

3 个答案:

答案 0 :(得分:3)

在你的问题的底部,你提到了z-fighting的快速修复方法是通过设置一些透明度来简单地关闭这些多边形的Z缓冲区。透明度发生在8位Alpha通道中,因此我最喜欢使用的值是254.0 / 255.00.996

但是,您可能希望关闭另一个选项,那就是orderIndependentTranslucency。这是Scene的属性,可以从Viewer的构造函数中的options参数初始化。当保持开启状态时,支持它的系统的默认设置,可以始终"看到"其他半透明对象后面的半透明对象,无论不透明度如何,当然渲染顺序不会影响结果。但是在这种情况下,如果你想让一个多边形遮挡另一个多边形,你想要渲染顺序来影响结果。

这是一个例子。点击"运行代码段"在底部,或只将JavaScript部分粘贴到Sandcastle



var viewer = new Cesium.Viewer('cesiumContainer', {
    navigationInstructionsInitiallyVisible: false, animation: false, timeline: false,

    // The next line is the important option for this demo.
    // Test how this looks with both "true" and "false" here.
    orderIndependentTranslucency: false
});

var redPolygon = viewer.entities.add({
    name : 'Red polygon',
    polygon : {
        hierarchy : Cesium.Cartesian3.fromDegreesArray([-115.0, 37.0,
                                                        -115.0, 32.0,
                                                        -102.0, 31.0,
                                                        -102.0, 38.0]),
        // The alpha of 0.996 turns off the Z buffer.
        material : new Cesium.Color(1, 0, 0, 0.996)
    }
});

var greenPolygon = viewer.entities.add({
    name : 'Green polygon',
    polygon : {
        hierarchy : Cesium.Cartesian3.fromDegreesArray([-118.0, 42.0,
                                                        -100.0, 42.0,
                                                        -104.0, 32.0]),
        // The alpha of 0.996 turns off the Z buffer.
        material : new Cesium.Color(0, 1, 0, 0.996)
    }
});

viewer.zoomTo(viewer.entities);

html, body, #cesiumContainer {
  width: 100%; height: 100%; margin: 0; padding: 0; overflow: hidden;
  font-family: sans-serif;
}

<link href="http://cesiumjs.org/releases/1.19/Build/Cesium/Widgets/widgets.css" 
      rel="stylesheet"/>
<script src="http://cesiumjs.org/releases/1.19/Build/Cesium/Cesium.js">
</script>
<div id="cesiumContainer"></div>
&#13;
&#13;
&#13;

答案 1 :(得分:2)

答案很简单,您可以在代码中添加z-index

var viewer = new Cesium.Viewer('cesiumContainer');

var red = Cesium.GeoJsonDataSource.load('map1.geojson', {
  fill: new Cesium.Color(1, 0, 0, 1.0),
  zIndex: 1
});

var green = Cesium.GeoJsonDataSource.load('map2.geojson', {
  fill: new Cesium.Color(0, 1, 0, 1.0),
  zIndex: 2
});

viewer.dataSources.add(red);
viewer.dataSources.add(green);

答案 2 :(得分:0)

对于有点不同的情况可能有用: enter image description here 多边形有高度,有些可能是透明的,多边形层也是相互叠加的。 在这种情况下,为了解决z-fighting,好的方法是使用选项标志{closeBottom:false}删除多边形的底部。 我从上面的评论中修改了这个案例的代码:

var viewer = new Cesium.Viewer('cesiumContainer', {
navigationInstructionsInitiallyVisible: false, animation: false, timeline: false,

// The next line is the important option for this demo.
// Test how this looks with both "true" and "false" here.
orderIndependentTranslucency: false
});

var redPolygon = viewer.entities.add({
name : 'Red polygon',
polygon : {
    hierarchy : Cesium.Cartesian3.fromDegreesArray([-115.0, 37.0,
                                                    -115.0, 32.0,
                                                    -102.0, 31.0,
                                                    -102.0, 38.0]),
    // The alpha of 0.996 turns off the Z buffer.
    material : new Cesium.Color(1, 0, 0, 1),
    closeBottom: false,
    height: 1000,
    extrudedHeight: 50100
}
});

var greenPolygon = viewer.entities.add({
name : 'Green polygon',
polygon : {
    hierarchy : Cesium.Cartesian3.fromDegreesArray([-118.0, 42.0,
                                                    -100.0, 42.0,
                                                    -104.0, 32.0]),
    // The alpha of 0.996 turns off the Z buffer.
    material : new Cesium.Color(0, 1, 0, 0.29),
    height: 50100,
    extrudedHeight: 95000,
    closeBottom: false
}
    });

viewer.zoomTo(viewer.entities);