【问题标题】:Save the map with the control scale-line使用控制比例线保存地图
【发布时间】:2019-07-04 01:02:22
【问题描述】:

我可以将地图保存为 PNG 图像,但如何将比例线控件添加到此画布?

// export png
document.getElementById('export-png').addEventListener('click', function() {
  map.once('postcompose', function(event) {
    var canvasElement = event.context.canvas;
    var MIME_TYPE = "image/png";
    var imgURL = canvasElement.toDataURL(MIME_TYPE);
    var dlLink = document.createElement('a');
    dlLink.download = "carte"; //fileName;
    dlLink.href = imgURL;
    dlLink.dataset.downloadurl = [MIME_TYPE, dlLink.download, dlLink.href].join(':');
    document.body.appendChild(dlLink);
    dlLink.click();
    document.body.removeChild(dlLink);
  });
  map.renderSync();
});

【问题讨论】:

    标签: javascript openlayers


    【解决方案1】:

    请注意,在下一个版本中https://github.com/openlayers/openlayers/blob/master/changelog/upgrade-notes.md OpenLayers 将从所有图层的单个画布更改为每个图层的画布,这与保存完整地图不兼容。但是对于 5.3 及以下版本,ol-ext 库包括用于刻度线、属性和标题的画布控件 https://viglino.github.io/ol-ext/examples/canvas/map.canvas.control.html 在许多情况下,可以从源代码复制各个控件的代码并进行自定义,而无需整个库 https://viglino.github.io/ol-ext/dist/ol-ext.js

    【讨论】:

    • 好的,我实际上使用的是 Ol 4.4,因为与更高版本的依赖项不兼容(法国的 geoporttail 插件)。
    • 所以对于分层的画布,我会在这些依赖关系演变时通知。是否有一种方法或功能可以将这些单独的画布关联到一个以进行导出?至于线条比例,如果不是太复杂,我看代码
    • 只需在 .js 源中搜索“集成在画布中的缩放线控件”,它以“集成在画布中的标题控件”结尾,并且没有依赖关系,因此如果复制和粘贴就可以工作。我在这里使用了它mikenunn.16mb.com/demo/scalerings.html 在OL3 上运行并定制为根据行间隔添加刻度环。在下一个版本中,不要认为 OpenLayers 会有任何内置方法来组合画布,但应该可以使用一些附加代码。
    【解决方案2】:

    刻度线控件是一个 HTML 元素,所以你真的不能这样做。您需要在地图画布本身上绘制一条线,并在每次地图移动后更新该线,以地图单位表示实际长度。

    假设您使用的是公制投影,则分辨率为 0.2 的 50 像素线表示

    50px x 0.2m/px = 10m
    

    查看此处的链接以将地图导出为 PNG:

    https://openlayers.org/en/v4.6.5/examples/export-map.html

    我修改了代码,在画布上画了一条 200 米长的线,并在上面写了 200m 来表示比例。它又快又脏,但应该为您指明方向。

    // this example uses FileSaver.js for which we don't have an externs file.
    var map = new ol.Map({
      layers: [
        new ol.layer.Tile({
          source: new ol.source.OSM()
        }),
        new ol.layer.Vector({
          source: new ol.source.Vector({
            url: 'https://openlayers.org/en/v4.6.5/examples/data/geojson/countries.geojson',
            format: new ol.format.GeoJSON()
          })
        })
      ],
      target: 'map',
      controls: ol.control.defaults({
        attributionOptions: {
          collapsible: false
        }
      }),
      view: new ol.View({
        center: ol.proj.transform([28.9, 41.1],"EPSG:4326","EPSG:3857"),
        zoom: 18
      })
    });
    
    document.getElementById('export-png').addEventListener('click', function() {
      map.once('postcompose', function(event) {
        var canvas = event.context.canvas;
        var ctx = canvas.getContext("2d");
        ctx.strokeStyle = "#0000FF";
        ctx.lineWidth = 5;
        ctx.beginPath();
        ctx.moveTo(10, map.getSize()[1]-10);
        ctx.lineTo(200/map.getView().getResolution(), map.getSize()[1]-10);
        ctx.stroke();
        ctx.font = "20px Arial";
        ctx.fillText("200m", 10, map.getSize()[1]-10);
        if (navigator.msSaveBlob) {
          navigator.msSaveBlob(canvas.msToBlob(), 'map.png');
        } else {
          canvas.toBlob(function(blob) {
            saveAs(blob, 'map.png');
          });
        }
      });
      map.renderSync();
    });
    

    【讨论】:

    • 嗨 Ulas,谢谢我对代码示例感兴趣
    • 检查我提供的代码,看看它是否适合你。你需要详细说明它,但它应该给你一个机会。
    • 谢谢。实际上它显示了 FileSaver.js 的一条线,但是我放大的越多,它应该相反的时候越小
    猜你喜欢
    • 2016-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多