Прокси для слоев WMS

При сборке приложения с помощью ol-cesium, в зависимости от WMS, могут возникать ошибки Cross-Origin:

"Image from origin 'http://www.ifremer.fr' has been blocked
from loading by Cross-Origin Resource Sharing policy: 
No 'Access-Control-Allow-Origin' header is present on 
the requested resource. Origin 'http://localhost:8080' 
is therefore not allowed access"

У меня нет возможности установить заголовок CORS в используемой WMS (как предлагается здесь https://github.com/openlayers/ol3-cesium/issues/127).

Похоже, прокси можно настроить на уровне Cesium (см. https://cesiumjs.org/2013/01/04/Cesium-Imagery-Layers-Tutorial/).

Можно ли настроить его на уровне OL, чтобы он устанавливал его на уровне цезия? и если да, то как?


person Francois Prunayre    schedule 09.06.2015    source источник


Ответы (6)


Вы можете использовать прокси, просто изменив URL-адрес, а не обучая OL3 прокси. Например, если ваш WMS-сервер:

http://www.example.com/geoserver/ows

Вы можете просто передать этот URL в OL3, чтобы он прошел через ваш прокси-сервер по адресу /proxy:

/proxy/http://www.example.com/geoserver/ows
person kring    schedule 10.06.2015

С https://github.com/openlayers/ol3-cesium/pull/358 теперь пользователь может установить свойство olcs.proxy для источника слоя. например:

source.set('olcs.proxy', '/myproxy/url');
person Francois Prunayre    schedule 09.06.2016

Глядя на код инициализации для OL3-Cesium, нет встроенной функциональности для применения прокси на уровне OL.

Вы можете попытаться скопировать настройки imageryProvider для созданных ими слоев и включить прокси в новый.

Я не пробовал это, поэтому не знаю, сработает ли это, но стоит попробовать, если OL3 не планирует в ближайшее время выпускать обновление, которое исправляет это.

person Mike LP    schedule 10.06.2015

Быстрый поиск кода в кодовой базе ol3 показывает, что вы не можете установить прокси на уровне OL.

Просто используйте URL-адрес WMS через общедоступный прокси-сервер CORS (сначала). Я уже отвечал на похожий вопрос. Возможно, это поможет.

person Thomas Gratier    schedule 10.06.2015

Я не использую Cesium, просто ThreeJS, но получаю ту же проблему CORS без небольшого трюка с копированием изображений. Это работает для меня -

function loadWmsImage( url, params, cb ){
  var tmpImage = new Image();
  var wmsPng = url + jQuery.param( params );
  tmpImage.onload = function(){
    var canv = document.createElement('canvas');
    var ctx = canv.getContext('2d');
    canv.width = this.width;
    canv.height = this.height;
    ctx.drawImage(this, 0, 0);
    cb(canv.toDataURL());
  }
  tmpImage.crossOrigin = 'anonymous';
  tmpImage.src =  wmsPng;
}

loadWmsImage( htMapUrl, htMapParams,
  function(img){
    customUniforms.bumpTexture.value = 
      new THREE.ImageUtils.loadTexture(img);
  });
person Michael Saunby    schedule 25.07.2015

Потратьте много времени на попытки и получение опыта............~_~

Пример WMTS olcs.proxy:

var o_tileGrid = {
  origin: ol.extent.getTopLeft(projectionExtent),
  resolutions: resolutions,
  matrixIds: matrixIds
};
var o = {
  attributions: '',
  url: url,
  layer: layer,
  matrixSet: matrixSet,
  format: format,
  projection: projection,
  tileGrid: new ol.tilegrid.WMTS(o_tileGrid),
  style: style,
  wrapX: true
};                
var source = new ol.source.WMTS(o);
var proxy = "http://proxy.example.../";      
source.set("olcs.proxy",proxy);  


person 何宗翰    schedule 18.07.2019