2015-07-07 2 views
2

У меня проблема при попытке экспортировать карту с несколькими уровнями, созданными с помощью OpenLayer.
Это мой JS код:OpenLayers: «Не удалось выполнить« toDataURL »в« HTMLCanvasElement »

map.once('postcompose', function(event) { 
     var img = new Image, 
     canvas = event.context.canvas; 

     img.crossOrigin = "anonymous"; 
     img.src = canvas.toDataURL('image/png'); 
}); 

Где карта является переменной JavaScript моей OpenLayers карты.
Когда карта состоит из более чем на один уровень, я получаю такую ​​ошибку:

Uncaught SecurityError: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported

Если попробовать сделать то же самое, без добавления уровня на карту (только с помощью карты OpenLayer по умолчанию) Я могу создать URL-адрес данных и загрузить карту в формате png.
Это проблема CrossOrigin, но COR должны быть включены на моем сервере.
Любая помощь? Благодаря!

EDIT
Здесь приведен пример кода 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); 
+1

Вы пробовали настройки 'crossOrigin:«» 'на источник вашей плитке слоя (как в этом [например] (HTTP : //openlayers.org/en/master/examples/icon.html))? – tsauerwein

+0

Я попытался установить crossOrigin: «Анонимный», но в этом случае я не смог загрузить слой на карте из-за ошибки безопасности. Я попробую с вашим предложением. – neoben

+0

Когда я использую 'crossOrigin: ''', я получаю такую ​​ошибку: 'Image from origin 'http://pubblicazioni.provincia.fi.it' был заблокирован от загрузки по принципу совместного использования ресурсов Cross-Origin: Заголовок Access-Control-Allow-Origin присутствует на запрошенном ресурсе. Origin 'http: //188.166.72.87 ', следовательно, не допускается доступ. ' – neoben

ответ

2

Я решил проблему с реализацией локального прокси-сервера на моем сервере, как было предложено MichaelJS.
Я бегу приложение Django, поэтому я разработал настроенный прокси-сервер, начиная с этого кода:
https://github.com/mjumbewu/django-proxy

Тогда в моем urls.py я определил это правило:

url(r'^proxy/(?P<url>.*)$', views.proxy_view, name='proxy'), 

И, наконец, я proxed запрос к службе 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); 

Cr ossOrigin проблема решена!

0

Так как я не могу комментировать еще, мой ответ здесь растворов а) создать локальный прокси-сервер и получать данные с его помощью б) запрашивать у источника-провайдера, если он может активировать Cross-Origin -Включить заголовок "*".

0

Вы можете посмотреть на this document, чтобы увидеть настройки CORS. Вместо того чтобы устанавливать crossOrigin в источнике к '', вы можете попробовать установить его анонимным:

crossOrigin: 'Anonymous' 
Смежные вопросы