neo*_*ben 5 javascript dictionary canvas wms openlayers-3
当我尝试导出使用 OpenLayer 创建的多层地图时遇到问题。
这是我的JS代码:
map.once('postcompose', function(event) {
var img = new Image,
canvas = event.context.canvas;
img.crossOrigin = "anonymous";
img.src = canvas.toDataURL('image/png');
});
Run Code Online (Sandbox Code Playgroud)
其中map是我的 OpenLayers 地图的 JavaScript 变量。
当地图由多个级别组成时,我收到此类错误:
未捕获的安全错误:无法在“HTMLCanvasElement”上执行“toDataURL”:受污染的画布可能无法导出
如果尝试在不向地图添加级别的情况下执行相同的操作(仅使用默认的 OpenLayer 地图),我可以生成数据 URL 并以 png 格式下载地图。
这似乎是 CrossOrigin 问题,但应该在我的服务器上启用 COR。
有什么帮助吗?谢谢!
编辑
这里是 JS 代码示例,我将图层添加到导致此问题的地图。
var layer = new ol.layer.Image({
source: new ol.source.ImageWMS({
url: 'http://pubblicazioni.provincia.fi.it/geoserver/wms',
params: {
'LAYERS': 'layer_name',
'FORMAT': 'image/png',
'TRANSPARENT': 'true'
},
crossOrigin: null
})
});
map.addLayer(layer);
Run Code Online (Sandbox Code Playgroud)
我按照 MichaelJS 的建议解决了在我的服务器上实现本地代理的问题。
我正在运行 Django 应用程序,因此我从以下代码开始开发了一个自定义代理: https:
//github.com/mjumbewu/django-proxy
然后在我的 urls.py 中定义了这个规则:
url(r'^proxy/(?P<url>.*)$', views.proxy_view, name='proxy'),
Run Code Online (Sandbox Code Playgroud)
最后,我将请求代理到 WMS 服务,并以这种方式更改 JS 代码:
var layer = new ol.layer.Image({
source: new ol.source.ImageWMS({
url: '/proxy/http://pubblicazioni.provincia.fi.it/geoserver/wms',
params: {
'LAYERS': 'layer_name',
'FORMAT': 'image/png',
'TRANSPARENT': 'true'
},
crossOrigin: null
})
});
map.addLayer(layer);
Run Code Online (Sandbox Code Playgroud)
跨域问题解决了!