Openlayers更改WMS调用URL

时间:2014-06-24 17:07:30

标签: openlayers wms

我对Openlayers相对缺乏经验,而且我一直试图解决这个问题。基本上我已经通过WMS Call在地图上创建了一个图层。我设置了url,以便在单击单选按钮时,它会运行一个函数,并插入URL的一部分,将其链接到服务器上的正确文件。最好用代码来解释......

var layer_type = "Tavg_SDdiff";
var layer_name = "Tavg_SD_diff";


function layer_names(id) {

    layer_type = OpenLayers.Util.getElement(id).id;
    }


Tavg = new OpenLayers.Layer.WMS("Tavg",
    "http://convection.meas.ncsu.edu:8080/thredds/wms/sco/synthesis/eval_WICCI_" + layer_type + "_50km.nc?",
    {layers: layer_name,
    version:'1.1.1',
    CRS:'CRS:84',
    "transparent":'true',
    "styles":'boxfill/shrmc-mxhgt',
    "colorscalerange":'-2.1,2.1',
    "numcolorbands":'42',
    "abovemaxcolor":'extend',
    "belowmincolor":'extend',
    time:"2001-01-01T00:00:00"},
    {isBaseLayer:false, setVisibility: true, transparent:true,displayInLayerSwitcher:true});
Tavg.url = "http://convection.meas.ncsu.edu:8080/thredds/wms/sco/synthesis/eval_WICCI_" + layer_type + "_50km.nc?";

因此,layer_type和layer_name会根据所选的单选按钮而改变。 我知道变量会发生变化,因为我已经通过函数中的alert()检查了它。

此外,我还有一个重绘图层的功能,以便显示新数据。

function deleteLayer() {
    Tavg.redraw();
    alert(Tavg.url);
    }

这是问题,当我在第二个函数中插入警报时,我看到地址变量中的URL没有改变,因此当我选择不同的按钮并且重绘命令执行其操作时,它不会改变地图上的任何内容。甚至可以更新地图而无需为每个文件的图层添加单独的地图变量吗?

1 个答案:

答案 0 :(得分:1)

要在OpenLayers中更改部分WMS查询字符串,有一个mergeNewParams函数,它将更新它并重新请求所有的tile,请参阅第222行http://trac.osgeo.org/openlayers/browser/trunk/openlayers/lib/OpenLayers/Layer/WMS.js。需要说明的是,这仅适用于请求的查询字符串。

在您的情况下,您似乎将不同的图层和图层类型作为网址的一部分。您将不得不调用map.removeLayer(Tavg),创建新的WMS请求URL并再次使用map.addLayer(Tavg)重新添加WMS。

一般情况下,如果您有某种规模的资源,您的网址建议您这样做, ... thredds / wms / sco / synthesis / eval_WICCI_“+ layer_type +”_50km.nc?“,但是使用不同的主题视图,您可能最好使用WMS的图层和样式参数处理它,只需一个网址,否则你最终会得到数百个不同的网址,只是为了显示同一个磁贴的不同视图,从服务器的角度来看可能会非常混乱。另外,你会注意到OpenLayers有一个mergeNewParams函数,这就是处理这种情况的预期方法。

编辑:在进一步深入了解源代码之后,您可以通过显式设置网址来执行您想要的操作,并通过调用重绘来调用setURL函数。这两个函数都在OpenLayers.Layer.HTTPRequest中,OpenLayers.Layer.WMS通过OpenLayers.Layer.Grid继承了它的一些方法。

wms.setUrl(newURL);
wms.redraw();

我没有简单的方法来测试这个,所以如果你有问题,请告诉我。