【问题标题】:Save current Google Map as image将当前谷歌地图保存为图片
【发布时间】:2013-04-20 13:15:29
【问题描述】:

如何将当前的谷歌地图保存为图像?下面是我用来初始化地图的 Javascript。

var myMarker = new google.maps.LatLng(result[0].centerLat, result[0].centerLong);
var myOptions = {
  disableDoubleClickZoom: true,
  zoom: result[0].zoom,
  center: myMarker,
  mapTypeId: google.maps.MapTypeId.ROADMAP
};
var map = new google.maps.Map(document.getElementById("map_canvas"), myOptions);

我查看了https://developers.google.com/maps/documentation/javascript/reference#Map,但似乎没有返回当前地图对象的 URL 或图像的方法。是否可以通过某种方式将地图另存为图像?

【问题讨论】:

    标签: javascript asp.net google-maps-api-3


    【解决方案1】:
    function Export() 
    {          
    
     var staticMapUrl = "https://maps.googleapis.com/maps/api/staticmap"; 
    
            //Set the Google Map Center.        
            staticMapUrl += "?center=" + mapOptions.center.G + "," +     mapOptions.center.K;
    
            //Set the Google Map Size.
            staticMapUrl += "&size=500x400"; 
            //Set the Google Map Zoom.
            //staticMapUrl += "&zoom=" + mapOptions.zoom;
             staticMapUrl += "&zoom= 19";
              staticMapUrl += "&style=visibility:on";         
    
              for(var n in polygons)
              {        
               staticMapUrl += "&path=color:0x0x23537C%7Cfillcolor:0x0x23537C|weight:0|"+polygons[n];
              }         
    
            //Set the Google Map Type.
            staticMapUrl += "&maptype=" + mapOptions.mapTypeId;
            staticMapUrl += "&markers=icon:"+iconpath+"%7c"+latitude+","+longitude;
            staticMapUrl += "&scale= 1";
    
            for (var j in markers) { 
               if (markers[j]!=='')
               {          
                var image=imagnameewithpath+".png";     
                staticMapUrl += "&markers=icon:"+image+"%7c"+markers[j]+"|";
    
               }           
    
          var canvas=document.createElement('canvas');
          var context = canvas.getContext('2d');
          var imageObj = new Image();
          imageObj.crossOrigin = "crossOrigin";  // This enables CORS  
          imageObj.onload = function() {
           canvas.width=imageObj.width;
           canvas.height=imageObj.height;
            context.drawImage(imageObj, 0, 0,imageObj.width,imageObj.height);
            var dataurl=canvas.toDataURL('image/png');
             var imgMap = document.getElementById("imgMap");
            imgMap.src = dataurl;        
          };
          imageObj.src = staticMapUrl;
    
        }
    

    【讨论】:

      【解决方案2】:

      您可以使用两种方式:使用html2canvas 生成图像或Google 静态地图API。

      谷歌静态地图 API

      function mapeado(geocoder, map, infowindow) {
          var staticMapUrl = "https://maps.googleapis.com/maps/api/staticmap";
      
          //Set the Google Map Center.
          staticMapUrl += "?center=" + document.getElementById('lat').value + "," + document.getElementById('lng').value;
      
          //Set the Google Map Size.
          staticMapUrl += "&size=640x480&scale=2";
      
          //Set the Google Map Type.
          staticMapUrl += "&maptype=hybrid";
      
          //Set the Google Map Zoom.
          staticMapUrl += "&zoom=" + mapOptions.zoom;
      
          //Loop and add Markers.
          staticMapUrl += "&markers=" + document.getElementById('lat').value + "," + document.getElementById('lng').value;
      
          //Display the Image of Google Map.
          var imgMap = document.getElementById("imgMap");
      
          $("#imgMap").attr("src", staticMapUrl);
          return imgMap + "png";
      }
      

      html2canvas

      function convertasbinaryimage() {
          html2canvas(document.getElementById("map"), {
              useCORS: true,
              onrendered: function (canvas) {
                  var img = canvas.toDataURL("image/png");
                  img = img.replace('data:image/png;base64,', '');
                  var finalImageSrc = 'data:image/png;base64,' + img;
                  $('#googlemapbinary').attr('src', finalImageSrc);
               }
          });
      }
      

      【讨论】:

      • 无法克隆 WebGL 上下文,因为它有 preserveDrawingBuffer=false
      【解决方案3】:

      这里是直接网址

      注释

      https://maps.googleapis.com/maps/api/staticmap?center=23.03,72.58&zoom=6&size=640x400&path=weight:3|color:blue|enc:aofcFz_bhVJ[n@ZpAp@t@b@uA%60FuAzEoCdJiDpLs@VM@y@s@oBcBkAw@cCoAuBu@eEaAiAa@iAi@w@a@o@g@g@k@e@u@uAaCc@i@w@y@eAo@i@UaBc@kAGo@@]JyKA}EC{G?q@?IGKCeGA{CAyCAyEAwEBaFAkJ?yGEyAIiLAiB?{@BcBJ}@@aBGwBEo@A@j@BjBFTHjEl@fOD%60C?|@RARAJERWPL@FE^S%60AI%60A&key=API_KEY
      

      用于卫星

      https://maps.googleapis.com/maps/api/staticmap?maptype=satellite&center=37.530101,38.600062&zoom=14&size=640x400&key=YOUR_API_KEY
      

      对于样式化地图

      http://maps.googleapis.com/maps/api/staticmap?center=Australia&size=640x400&style=element:labels|visibility:off&style=element:geometry.stroke|visibility:off&style=feature:landscape|element:geometry|saturation:-100&style=feature:water|saturation:-100|invert_lightness:true&key=YOUR_API_KEY
      

      你可以通过改变必要的参数直接使用它,你只需要API_KEY

      【讨论】:

        【解决方案4】:

        如果您想保存超过 google maps 静态 API 允许的内容(例如在其上绘制的自定义叠加层过于复杂/太大而无法通过查询字符串),您可以使用 html2Canvas 之类的东西将地图容器导出到画布(@987654321 @),然后将其转换为数据 URL 并根据需要进行处理。

        function saveMapToDataUrl() {
        
            var element = $("#mapDiv");
        
            html2canvas(element, {
                useCORS: true,
                onrendered: function(canvas) {
                    var dataUrl= canvas.toDataURL("image/png");
        
                    // DO SOMETHING WITH THE DATAURL
                    // Eg. write it to the page
                    document.write('<img src="' + dataUrl + '"/>');
                }
            });
        }
        

        我认为您需要将 useCORS 选项设置为 true 以允许该功能从 google 下载图像。

        这种方法的缺点是它可能会在您的页面上留下大约 1 兆字节的数据。

        我尝试使用这种方法将地图导出到要下载的图像,但在如何将这张图像提供给漂亮庄园的人时遇到了问题。您可以使用将其 href 属性设置为您创建的 dataUrl 的超链接,但除非您使用像 download="filename.png" 这样的 HTML 属性,否则无法设置文件名,这对我来说在不同的浏览器上一直存在问题。另一种方法是将 dataUrl 发布到服务器,然后服务器按照需要发送出去,但是上传大图像只是为了再次下载它似乎是一种奇怪的处理方式。

        【讨论】:

        • 此方法在 Chrome 中有效。但是 Firefox 会正确显示图像,但会继续加载页面并说“正在连接”。为了解决这个问题,我将 document.write 语句更改为 window.open(dataUrl);
        • 哎哟!否决票?我希望这样做的人写一个理由!我试图通过为问题提供可能的替代解决方案来提供帮助。
        • 我也试过这个,但是放置标记的画布没有渲染。受污染的画布可能无法导出。
        • 我想使用这种方法从 Chrome 一次性保存谷歌地图 (png)(使用开发者控制台)。这有没有可能?如果有,怎么做?
        • 如果要保存到 MySQL DB,字段数据类型必须足够大。也许是长文本。
        【解决方案5】:

        使用 API:

        var currentPosition=map.getCenter();
        return "http://maps.google.com/maps/api/staticmap?sensor=false&center=" +
          currentPosition.lat() + "," + currentPosition.lng() +
          "&zoom="+map.getZoom()+"&size=512x512&markers=color:green|label:X|" +
          currentPosition.lat() + ',' + currentPosition.lng();
        

        【讨论】:

          【解决方案6】:

          您可能会发现直接生成图像的静态地图 API 很有帮助。

          https://developers.google.com/maps/documentation/staticmaps/

          就像那个 - 这是图像:

          还有一些工具,例如:http://gmaps-utility-library-dev.googlecode.com/svn/tags/snapshotcontrol/1.0/examples/optionsWizard.html

          参考:Google Maps image?

          【讨论】:

            【解决方案7】:

            您可以使用谷歌地图静态 API:https://developers.google.com/maps/documentation/staticmaps/

            您可以从 google maps javascript api 获取需要传递给静态地图 api 的参数(例如中心、可见区域等)。

            【讨论】:

            • 这是否也允许保存放置在地图上的标记?
            • 请注意,您的静态地图查询长度不能超过 2048 个字符,在您真正开始使用之前,这似乎很多。
            • 似乎增加了 URL 大小:“Google Static Maps API URL 的大小限制为 8192 个字符。”
            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-04-25
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-08-29
            • 2014-04-12
            相关资源
            最近更新 更多