Javascript 铯如何';窗帘';地形表面上的多边形或线

Javascript 铯如何';窗帘';地形表面上的多边形或线,javascript,cesium,Javascript,Cesium,所以,我使用铯,我想添加一个多边形或线来表示地形表面上的属性边界 我的多边形在平面/椭球曲面上运行良好,但不幸的是,当显示地形层时,多边形不会自动覆盖在曲面上 公平地说,我实际上没有z/高度值——因此我使用promise方法根据地形插值高度值。这部分很好,我得到了我的高度值。那又怎么样 我尝试用我的高度填充位置创建多边形实体,但没有效果-它只是忽略了高度值,我真的可以看到任何对高度值的引用——所有的“位置”数组都是二维的 对高度值的唯一引用是在中,它有一个很有前途的属性,名为perPositio

所以,我使用铯,我想添加一个多边形或线来表示地形表面上的属性边界

我的多边形在平面/椭球曲面上运行良好,但不幸的是,当显示地形层时,多边形不会自动覆盖在曲面上

公平地说,我实际上没有z/高度值——因此我使用promise方法根据地形插值高度值。这部分很好,我得到了我的高度值。那又怎么样

我尝试用我的高度填充位置创建多边形实体,但没有效果-它只是忽略了高度值,我真的可以看到任何对高度值的引用——所有的“位置”数组都是二维的

对高度值的唯一引用是在中,它有一个很有前途的属性,名为
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),
   }
});

底线:我只想要一个多边形或多段线实体,它可以很好地位于地形表面上

编辑:

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),
   }
});
使用已接受答案中的注释,结合,我已经能够模拟将多边形“悬垂”到地形上,并列出没有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);   

});

铯还不支持地形上的矢量数据。它正在积极开发中,大部分功能将开始出现在将于6月1日发布的铯1.10中。任何不能发布该版本的内容都应该在7月1日的1.11版本中发布

特别是对于多边形,您可以按照GitHub pull请求进行操作:

有关广告牌和标签,请查看:


多段线尚未启动,但将在上述两项完成后立即启动。

从1.13版开始,铯现在支持。它们将覆盖整个地形

看起来是这样的:

这是铯的例子:

var rectangleInstance = new Cesium.GeometryInstance({
  geometry : new Cesium.RectangleGeometry({
    rectangle : Cesium.Rectangle.fromDegrees(-140.0, 30.0, -100.0, 40.0)
  }),
  id : 'rectangle',
  attributes : {
    color : new Cesium.ColorGeometryInstanceAttribute(0.0, 1.0, 1.0, 0.5)
  }
});
scene.primitives.add(new Cesium.GroundPrimitive({
  geometryInstance : rectangleInstance
}));

如果要查看多边形,为什么要使用
alpha(0.0)
?根据0.0是零强度,我有意隐藏多边形的表面,因为我对可见的边界更感兴趣。这与我的问题无关。我使用相同的代码,但一些路径段仍在地下。有人知道原因吗?嘿@sabrina,也许值得用一个jsfiddle来演示这个问题,或者最好还是放弃这种方法,使用公认答案中建议的伟大的新GroundPrimitives。如果需要的话,也可以考虑问一个新的问题(请给我发电子邮件,我明天再看一看)。嗨,丹尼尔。我刚刚理解了我的问题(但仍然没有找到解决方案)。。。位置(路径的顶点)完全位于地面上;问题是连接两个点的线有时会在地面下相交。好吧,还没有正式的支持——但sampleTerrain.js的存在告诉我,一定有办法做到这一点,是吗?如果铯不能处理三维空间中的点,为什么有人会在开放层上使用铯?对不起,我误解了你的问题。要使用位置的高度值,请将perPositionHeight属性设置为true。本例中的橙色多边形实现了您想要的功能:我要补充的是,我们正在添加的功能是将矢量数据直接覆盖在地形上,即,就像它躺在地面上一样。设置perPositionHeight不会使多边形符合地形,它只会将高度提高到指定的高度,这样您就可以在空中拥有多边形。好的,明白了-感谢您的洞察力。因此,您能否确认当结合sampleTerrain.js插值“地面”高度时,
perPositionHeight
可能是一种有效的方法?(有效地渲染多边形“在空中”,但高度与地形高程相同)。哦,很抱歉没有听到您的第一句评论,我会检查一下,谢谢。是否可以在路径中使用GroundPrimitives?这是我的代码:var target=viewer.entities.add({位置:sample,路径:{分辨率:60,材质:Cesium.Color.BLUE,宽度:4,追踪时间:360,前置时间:0});其中sampe是Cesium.SampledPositionProperty,因此路径随时间而扩展。如何在地形上覆盖路径?需要使用基本体类型并将其添加到scene.primitives集合中。看起来您正在创建一个实体。@emackey有没有办法用CZML实现这一点?@Slaiyer目前我不这么认为。试着在铯论坛上提问。