Пользовательский рекламный щит html с цезием

Я хотел бы иметь возможность создать div и задать ему высоту, ширину и класс. Затем добавьте div на карту Cesium в качестве рекламного щита.

Я могу создавать рекламные щиты с изображениями и метками, а также нашел >эта ссылка о том, как использовать svg, но мне трудно понять, как заставить рекламный щит содержать динамически создаваемый html. В этом проекте имена классов используются для применения значков шрифтов к элементам div.

Есть ли способ вставить html в рекламный щит? Или есть другой класс, который лучше подходит для этого? Я новичок в Cesium и открыт для предложений.


person Zac    schedule 22.06.2015    source источник


Ответы (1)


Рекламные щиты предназначены для отображения растровых данных, таких как изображения. Если вы хотите отображать html в один, вы должны создать элемент холста, нарисовать элементы dom к нему, затем передайте этот холст на рекламный щит как свойство изображения.

Если вам на самом деле нужно только отображать значок/изображение, а затем отображать некоторый HTML, когда пользователь нажимает на него, вам следует использовать Entity API для создания вашего рекламного щита. Вам предоставляются дополнительные свойства, такие как «описание», когда вы используете 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>'
  });
};
person Mike LP    schedule 04.07.2015
comment
Спасибо за ответ, но у меня есть небольшая проблема. То есть вы говорите, что можете использовать второй холст как сцену для рендеринга контента, а затем брать данные с холста и добавлять их на рекламный щит? Как добавить контент на билборд? Вы также упомянули описание, что вы имеете в виду? Я проверил документацию по классу Billboard, но не нашел поля описания. Это то, что можно добавить? - person Zac; 06.07.2015
comment
@Zeb, дайте мне знать, если это редактирование прояснило для вас ситуацию. - person Mike LP; 10.07.2015
comment
О, очень мило. Я не видел, чтобы svgs использовались таким образом. Это здорово, спасибо! Хотя это не идеально, чтобы сделать так много, чтобы получить html на карте, это должно работать для меня. - person Zac; 14.07.2015
comment
Справедливости ради следует отметить, что необходимость рендеринга html на рекламном щите является неоптимальным сценарием. У вас может быть div с абсолютным позиционированием над Cesium Viewer, он просто не будет привязан к объекту в средстве просмотра, когда вы перемещаетесь. - person Mike LP; 14.07.2015
comment
Да, этого я хочу избежать. - person Zac; 14.07.2015
comment
Ссылки на Sandcastle и Codepen не работают. - person Rafael Herscovici; 24.05.2017