WMS图层的代理

时间:2015-06-09 16:57:49

标签: openlayers-3 cesium

使用ol-cesium构建应用程序,具体取决于WMS,可能会出现跨源错误:

"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"

我无法在使用的WMS上设置CORS标头(如此处https://github.com/openlayers/ol3-cesium/issues/127所示)。

看起来可以在Cesium级别设置代理(参见https://cesiumjs.org/2013/01/04/Cesium-Imagery-Layers-Tutorial/)。

是否可以在OL级别进行设置,以便将其设置为Cesium级别?如果是,怎么样?

6 个答案:

答案 0 :(得分:2)

您只需修改URL即可使用代理,而不是通过向OL3讲授代理。例如,如果您的WMS服务器是:

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

您只需将此网址传递给OL3即可通过/proxy处理您的代理:

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

答案 1 :(得分:1)

使用https://github.com/openlayers/ol3-cesium/pull/358,用户现在可以在图层的源上设置olcs.proxy属性。例如:

source.set('olcs.proxy', '/myproxy/url');

答案 2 :(得分:0)

查看OL3-Cesium的初始化代码,没有内置的功能可以在OL级别应用代理。

您可以尝试复制他们创建的图层的imageryProvider设置,并在新图层上包含代理。

我还没试过这个,所以我不知道这是否有用,但如果OL3不打算在不久的任何时候发布更新,那么它值得一试此

答案 3 :(得分:0)

ol3代码库中的

A quick code search表示您无法在OL级别设置代理。

只需通过公共CORS代理使用WMS URL(首先)。 我已回答a similar question 它可能会有所帮助。

答案 4 :(得分:0)

我没有使用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);
  });

答案 5 :(得分:0)

花很多时间尝试并获得经验。........〜_〜

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);