我希望能够创建一个div并给它一个高度,宽度和类。然后将div添加到Cesium地图作为广告牌。
我可以使用图片和标签创建广告牌,还可以找到关于如何使用svg的this链接,但我无法弄清楚如何使广告牌包含动态生成的html。这个项目使用类名来将字体图标应用于div。
有没有办法将html插入广告牌?或者是否有另一个类更适合这个?我是Cesium的新手,我愿意接受建议。
答案 0 :(得分:4)
广告牌旨在显示光栅化数据,例如图像。如果要将html渲染为1,则必须为其创建一个canvas元素draw the dom elements,然后将该画布作为其图像属性传递给广告牌。
如果您实际上只需要显示图标/图像,然后在用户点击时显示一些HTML,那么您应该使用Entity API来创建广告牌。您将获得其他属性,例如' description'当您使用Entity API时。描述可以是静态HTML字符串或回调属性,可以根据需要随时更新。当用户通过鼠标点击选择实体时会显示描述,但可以通过 viewer.trackedEntity 属性以编程方式完成。
您可以在Sandcastle或Codepen
中运行此功能var viewer = new Cesium.Viewer('cesiumContainer');
var canvas = document.createElement('canvas');
canvas.width = 300;
canvas.height = 300;
var svgString = '<svg xmlns="http://www.w3.org/2000/svg" width="200" height="200">' +
'<foreignObject width="100%" height="100%">' +
'<div xmlns="http://www.w3.org/1999/xhtml" style="font-size:40px; color: #FF0">' +
'<em>I</em> like' +
'<span style="color:white; text-shadow:0 0 2px blue;">' +
'Cupcakes</span>' +
'</div>' +
'</foreignObject>' +
'</svg>';
var image = new Image();
image.src = 'data:image/svg+xml;base64,' + window.btoa(svgString);
//Need to wait for image to load before proceeding to draw
image.onload = function() {
canvas.getContext('2d').drawImage(image, 0, 0);
viewer.entities.add({
id: 'Cupcake SVG',
position: Cesium.Cartesian3.fromDegrees(-75.59777, 40.03883),
billboard: {
image: canvas
},
description: '<p>This is a cupcake that can be modified.</p>'
});
};