如何使用 geoJSON 层捕获传单/地图框图像?

How to capture a leaflet / mapbox image with a geoJSON layer?

我在这里使用了基本的传单图像示例: https://www.mapbox.com/mapbox.js/example/v1.0.0/leaflet-image/

并通过向地图添加一个非常简单的 geoJSON 图层对其进行了修改:

var dataJson = JSON.parse(data);
var segLayer = L.geoJson(dataJson);
segLayer.addTo(map);
map.fitBounds(segLayer.getBounds());

https://jsfiddle.net/fexymjy3/10/

当我点击 "Take a snapshot" 按钮时,出现以下错误:

Uncaught TypeError: Failed to execute 'drawImage' on 'CanvasRenderingContext2D': The provided value is not of type '(HTMLImageElement or HTMLVideoElement or HTMLCanvasElement or ImageBitmap)'

我看过传单图片自述文件: https://github.com/mapbox/leaflet-image/blob/gh-pages/README.md

哪个州

You must set L_PREFER_CANVAS = true; so that vector layers are drawn in Canvas rather than SVG or VML.

但它并没有说在哪里设置它。我尝试将其设置在我的 segLayer 上、地图上以及全局范围内,但它并没有修复错误。我做错了什么?

解释是here

不幸的是,JSFiddle 不允许分享解决方案(因为你不能写脚本标签) 所以你必须在你自己的网络服务器上这样做。

<script>L_PREFER_CANVAS = true;</script>
<script src="http://cdnjs.cloudflare.com/ajax/libs/leaflet/0.7.3/leaflet.js"></script>
<script src='https://api.tiles.mapbox.com/mapbox.js/v2.2.1/mapbox.js'></script>
<script src='https://api.tiles.mapbox.com/mapbox.js/plugins/leaflet-image/v0.0.4/leaflet-image.js'></script>

Mapbox static maps API 将用于异步图像获取。

使用 This link and MapID 您还可以查看地图图像预览。

请参阅此 example 以了解如何将静态地图 API 与 GeoJSON 一起使用。

添加更新后的 JSFiddle

L.mapbox.accessToken = 'pk.eyJ1IjoiZGF2aWRsb3R0IiwiYSI6IjdlNmU1ZWUyMDE5MDcwMDQ5YTNiN2IyZTIzYjZkNTg5In0.sDTxz1C0DTl3UH7AguCBXg';

var snapshot = document.getElementById('snapshot');
var map = L.mapbox.map('map', 'mapbox.streets')
    .setView([38.88995, -77.00906], 15);

var data = '{"type":"FeatureCollection","features":[{"type":"Feature","properties":{"Line":85,"Seg":873},"geometry":{"type":"LineString","coordinates":[[-105.68659973,43.22522736],[-105.67418671,43.14464951],[-105.67417145,43.14464569]]}}]}';

var dataJson = JSON.parse(data);
var segLayer = L.geoJson(dataJson);

segLayer.addTo(map);

map.fitBounds(segLayer.getBounds());

document.getElementById('snap').addEventListener('click', function() {

    var center = map.getCenter()
    console.log(map.getCenter());


    var jsonData = {
        "type": "Feature",
        "properties": {
            "stroke-width": 4,
            "stroke": "#ff4444",
            "stroke-opacity": 0.5
        },
        "geometry": {
            "type": "LineString",
            "coordinates": [
                [-105.68659973, 43.22522736],
                [-105.67418671, 43.14464951],
                [-105.67417145, 43.14464569]
            ]
        }
    };

    var encodedData = encodeURIComponent(JSON.stringify(jsonData));

    console.log(encodedData);

    var imageUrl = "https://api.tiles.mapbox.com/v4/mapbox.streets/geojson(" + encodedData + ")/" + center.lng + "," + center.lat + "," + map._zoom + "/500x300.png?access_token=pk.eyJ1IjoiZGF2aWRsb3R0IiwiYSI6IjdlNmU1ZWUyMDE5MDcwMDQ5YTNiN2IyZTIzYjZkNTg5In0.sDTxz1C0DTl3UH7AguCBXg";

    console.log(imageUrl);

    var img = document.createElement('img');
    var dimensions = map.getSize();
    img.width = dimensions.x;
    img.height = dimensions.y;
    img.src = imageUrl;
    snapshot.innerHTML = '';
    snapshot.appendChild(img);

});
  body { margin:0; padding:0; }
  #map { position:absolute; top:0; bottom:0; width:100%; }

.ui-button {
  position:absolute;
  top:10px;
  right:10px;
  z-index:1000;
  }
#map {
  width:50%;
  }
#snapshot {
  position:absolute;
  top:0;bottom:0;right:0;
  width:50%;
  }
<link rel="stylesheet" type="text/css" href="https://api.tiles.mapbox.com/mapbox.js/v2.2.1/mapbox.css"/>
<script type="text/javascript" src="https://api.tiles.mapbox.com/mapbox.js/v2.2.1/mapbox.js"></script>
<script type="text/javascript" src="https://api.tiles.mapbox.com/mapbox.js/plugins/leaflet-image/v0.0.4/leaflet-image.js"></script>
<button id='snap' class='ui-button'>Take a snapshot</button>
<div id='snapshot'></div>
<div id='map'></div>