Cesium如何'drape'一个多边形或线到地形表面
Cesium how to 'drape' a polygon or line onto terrain surface
所以,我正在使用铯,我想添加一个多边形或线来表示地形表面上的 属性 边界。
我的多边形在 flat/Ellipsoid 表面上工作正常,但不幸的是,当显示地形层时,多边形不会自动覆盖在表面上。
很公平,我实际上没有 z/height 值 - 所以我使用 sampleTerrain.js promise 方法根据地形插入高度值。这部分工作正常,我得到了我的身高值。但是然后呢?
我尝试用我的高度负载位置创建一个多边形实体,但无济于事 - 它只是忽略了高度值。 When I read the docs,我真的可以看到任何对摄取高度值的引用 - 所有 "positions" 数组都是二维的?
唯一参考的身高值是在 PolygonOutlineGeometry 中,它看起来很有前途 属性,叫做 perPositionHeight
。
这基本上就是我想要的 - 我不想设置整个多边形的高度,我希望使用每个点的高度值..
这是我失败的尝试之一:
Entity/Polygon:
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,我已经能够模拟 'draping' 一个多边形到地形,带有没有 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);
});
Cesium 尚不支持地形矢量数据。它正在积极开发中,大多数功能应该会开始出现在将于 6 月 1 日发布的 Cesium 1.10 中。任何未发布该版本的内容都应在 7 月 1 日的 1.11 中发布。
对于多边形,您可以跟随 GitHub 拉取请求:https://github.com/AnalyticalGraphicsInc/cesium/pull/2618
对于广告牌和标签,查看:https://github.com/AnalyticalGraphicsInc/cesium/pull/2653
多段线尚未开始,但一旦完成以上两项,就会开始。
从 1.13 版开始,cesium 现在支持 GroundPrimitives。它们将覆盖地形。
看起来像这样:http://cesiumjs.org/images/2015/09-01/groundPrimitives.gif
Cesium 给出的这个例子:
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
}));
所以,我正在使用铯,我想添加一个多边形或线来表示地形表面上的 属性 边界。
我的多边形在 flat/Ellipsoid 表面上工作正常,但不幸的是,当显示地形层时,多边形不会自动覆盖在表面上。
很公平,我实际上没有 z/height 值 - 所以我使用 sampleTerrain.js promise 方法根据地形插入高度值。这部分工作正常,我得到了我的身高值。但是然后呢?
我尝试用我的高度负载位置创建一个多边形实体,但无济于事 - 它只是忽略了高度值。 When I read the docs,我真的可以看到任何对摄取高度值的引用 - 所有 "positions" 数组都是二维的?
唯一参考的身高值是在 PolygonOutlineGeometry 中,它看起来很有前途 属性,叫做 perPositionHeight
。
这基本上就是我想要的 - 我不想设置整个多边形的高度,我希望使用每个点的高度值..
这是我失败的尝试之一:
Entity/Polygon:
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,我已经能够模拟 'draping' 一个多边形到地形,带有没有 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);
});
Cesium 尚不支持地形矢量数据。它正在积极开发中,大多数功能应该会开始出现在将于 6 月 1 日发布的 Cesium 1.10 中。任何未发布该版本的内容都应在 7 月 1 日的 1.11 中发布。
对于多边形,您可以跟随 GitHub 拉取请求:https://github.com/AnalyticalGraphicsInc/cesium/pull/2618
对于广告牌和标签,查看:https://github.com/AnalyticalGraphicsInc/cesium/pull/2653
多段线尚未开始,但一旦完成以上两项,就会开始。
从 1.13 版开始,cesium 现在支持 GroundPrimitives。它们将覆盖地形。
看起来像这样:http://cesiumjs.org/images/2015/09-01/groundPrimitives.gif
Cesium 给出的这个例子:
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
}));