【问题标题】:Openlayers change WMS call URLOpenlayers 更改 WMS 调用 URL
【发布时间】:2014-06-25 21:55:29
【问题描述】:

我对 Openlayers 相对缺乏经验,我一直在尝试解决这个问题。基本上,我通过 WMS 调用在我的地图上创建了一个图层。我设置了 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 没有改变,因此当我选择不同的按钮并且重绘命令执行它时,它不会改变地图上的任何内容.是否甚至可以更新地图而无需为每个文件的图层添加单独的地图变量?

【问题讨论】:

    标签: openlayers wms


    【解决方案1】:

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

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

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

    编辑: 在进一步挖掘源代码之后,您可以通过显式设置 url 来做您想做的事情,然后调用重绘调用 setURL 函数。这两个函数都在 OpenLayers.Layer.HTTPRequest 中,OpenLayers.Layer.WMS 通过 OpenLayers.Layer.Grid 继承了它的一些方法。

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多