所以,我正在使用Cesium,并希望添加一个多边形或线条来代表地形表面上的属性边界。
我的多边形在平坦/椭球面上工作得很好,但不幸的是当地形图层显示时,多边形并不能自动覆盖在地形表面上。
很好,实际上我没有z/高度值——所以我正在使用sampleTerrain.js promise方法基于地形插值高度值。这部分工作得很好,我得到了我的高度值。但接下来怎么做呢?
我尝试用我的高度值创建多边形实体,但是毫无效果——它只会忽略高度值。当我阅读文档时,我真的看不出有任何涉及高度值摄入的参考——所有的“位置”数组都是二维的吗?
唯一涉及高度值被考虑的参考是PolygonOutlineGeometry,它有一个看起来很有前途的属性叫做perPositionHeight
。
这基本上就是我想要的——我不想设置整个多边形的高度,我希望每个点的高度值都被使用。
这是我其中一个失败的尝试:
实体/多边形:
var entity = viewer.entities.add({
polygon : {
hierarchy : cartesianPositions, //array of positions with z values
outline : true,
outlineColor : Cesium.Color.RED,
outlineWidth : 9,
material : Cesium.Color.BLUE.withAlpha(0.0),
}
});
底线: 我只需要一个多边形或折线实体,能够很好地贴在地形表面上。
编辑:
使用已接受答案评论中的橙色多边形示例,结合sampleTerrain.js,我已经能够模拟将多边形覆盖在地形上,用一个没有z值的位置列表来演示,这里是一个简单的例子:
var positions = []; // xy position array
var cesiumTerrainProvider = new Cesium.CesiumTerrainProvider({
url : '//assets.agi.com/stk-terrain/world'
});
viewer.terrainProvider = cesiumTerrainProvider;
// go off and sample the terrain layer to get interpolated z values for each position..
var promise = Cesium.sampleTerrain(cesiumTerrainProvider, 11, positions);
Cesium.when(promise, function(updatedPositions) {
var cartesianPositions = Cesium.Ellipsoid.WGS84.cartographicArrayToCartesianArray(updatedPositions);
var entity = viewer.entities.add({
polygon : {
hierarchy : cartesianPositions,
outline : true,
outlineColor : Cesium.Color.RED,
outlineWidth : 9,
perPositionHeight: true,
material : Cesium.Color.BLUE.withAlpha(0.0),
}
});
viewer.flyTo(entity);
});
alpha(0.0)
?根据Cesium规范,0.0代表的是“零强度”。 - Kirill Slatin