2016-09-14 119 views
2

我试图建立一个自定义bing地图v8 API图钉组合文本和一个小uri数据图像,但我得到一个'未捕获的InvalidStateError:未能执行'drawImage' CanvasRenderingContext2D':提供的HTMLImageElement处于'破碎'状态。'浏览器控制台出现错误。有任何想法吗?Bing Maps API v8 - 图钉SVG URI图像

MapOptions = { credentials: 'mycredentials', mapTypeId: Microsoft.Maps.MapTypeId.road, zoom: 10, showMapTypeSelector: true, enableInertia: false, enableClickableLogo: false, disableKeyboardInput: true, navigationBarMode: navigationBarMode.minified, showLocateMeButton: true }; 

map = new Microsoft.Maps.Map(document.getElementById("MapDIV"), MapOptions); 

LayerShapes = new Microsoft.Maps.Layer(); 
LayerShapes.setZIndex(101); 

map.layers.insert(LayerShapes); 

var svgTemplate = '<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32"><foreignObject width="100%" height="100%"><div xmlns="http://www.w3.org/1999/xhtml"> <p>TEXT</p> {htmlContent} </div></foreignObject></svg>'; 
var customHtml = ' <image width="32" height="32" xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAAcCAYAAACUJBTQAAAABmJLR0QA/wD/AP+gvaeTAAAACXBIWXMAAAsTAAALEwEAmpwYAAAAB3RJTUUH3wQbECUudScMXAAAAB1pVFh0Q29tbWVudAAAAAAAQ3JlYXRlZCB3aXRoIEdJTVBkLmUHAAACGUlEQVRIx+3Wy2sTURTH8e/NTDIzaZMxadMWhyBUSheiiyo+QPpHuHIhdOfSP8GlbkXEhTv/gNau3LgRurEIUqlWU2ubh7evPEg6NjOZJHNdlIgLo11YRcj5A84Hfpx7zxFKKcUJlw7gOM6JAVLKIwTg4avbfxy4c/UJABH+Qg2QAfKfI98f48vc/CCuATJA/iEilFKq3/q98XTk2I0W5qp916/41SHhOM6xoIW5KlLK/t/K6oNbwlAdknELYSZpxTMkxrO4XoCUUv0O6gHlYkjHWxF+yyWTsKit57CGbbTMGSJWepTh05PIRof3mxLNjNP0Pdp+i9ziIyGl7BtFD1hdOqRdei5ijW2shkSvS8LAJTM2gh4JiWzvFNksFdAsA3s0Ram4TrtZJxnXCLwKWSF+CvWAt89czmffiEQ0gGYZzSuTX3tNx60Q1Pcxwyb67JUL7Jb38VsdojETz2ux8W6JqG6iJaOoGLTr98WP0fWAsZgQ849v8mnZYeriLNinwAup722RsW12cysYiRT62voGwymbbsQgMZREcMD1yzN4nkctrNEV4HbrTKeFKNeOJlFKiXtwV2ganJvKkF8rsvxiEd8P0FSTiXQa2wxJxEz2yl/QA2Mc2Qihq7NdqdE5rJAc2ufsZBbTiIIGXWXTVeCIa0glMQwh8vl7hMDHD5+Zmb7E16ZPtVrFilnsFLY42CngTDhEohbfALpF/s+4JwbyAAAAAElFTkSuQmCC"/> '; 

var PinPos = new Microsoft.Maps.Location(Lat, Lng); 
pin = new Microsoft.Maps.Pushpin(PinPos, { icon: svgTemplate.replace('{htmlContent}', customHtml), width: 32}); 

LayerShapes.add(pin); 
+0

与我同样的问题。我在div元素中添加了一个id,导致了相同的问题。 –

回答

1

我遇到了同样的问题。 发生这种情况是因为它试图用未加载的图像绘制图钉图标。

一般的想法是在使用图钉之前预先加载JS代码中的图像。

我解决它通过这种方式:

  1. 我预装图像阵列
  2. 我用的不是 'SVG'
var imageArray = []; 
var imagesFiles = ['home_16.png', 'home_16_done.png', 'not existing.png']; 

    function preLoadImages(callback) { 

     var filesCount = imagesFiles.length; 
     for (var i = 0; i < imagesFiles.length; i++) { 
      var imageObj = new Image(); 
      imageObj.src = '/images/' + imagesFiles[i]; 
      imageObj.name = imagesFiles[i]; 
      imageObj.onload = (function (img) { 
      imageArray.push({ name: img.target.name, object: img.target }); 

      filesCount--; 

      if (filesCount === 0) { 
       if (callback) 
        callback(imageArray); 
      }}); 

      imageObj.onerror = function() { //even image is not loaded 

       filesCount--; 
       if (filesCount === 0) { 
       if (callback) 
        callback(imageArray); 
       }}; 
      } 
    } 


     .... 

     pushpin = new Microsoft.Maps.Pushpin(location, 
     { icon: createCanvasContent(imageArray[i], parameters[]) 
     ..... 

     function createCanvasContent(img, parameters){ 

      var c = document.createElement('canvas'); 
      c.width = img.width + 2; 
      c.height = img.height + 2; 

      var context = c.getContext('2d'); 

      context.fillStyle = bgrcolor; 
      context.fillRect(0, 0, 18, 18); 
      c.style.opacity = '0.8'; 
      //Draw image 
      context.drawImage(img, 1, 0, c.width - 2, c.height - 2); 

      return c.toDataURL(); 
     } 

您可以使用所有的功能从帆布画布标签,如

context.textAlign = "center"; 
context.strokeText(text, x, y); 
context.fillStyle = 'white'; 
context.fillText(text, x, y);