OpenLayers,如何限制WMS图层范围?

3
我可以创建一个带有maxExtent和restrictedExtent属性的OpenLayers地图。我也已经尝试过WMS图层及其maxExtent属性,但问题在于使用WMS图层中的singleTile时。 我想要的是只从服务器获取一张图片的WMS图层,但限制在我想要的范围内。因此,我使用了singleTile=true,ratio=1和maxExtend=my_desired_extent。但它总是请求整个地图视图。 有什么好的想法吗? 谢谢提前。 下面的代码显示了一个带有基础层和海岸线层的地图,我想在单瓦片模式下使用,并限制它们对WMS的请求区域。
<script type="text/javascript" src="http://openlayers.org/api/2.11/OpenLayers.js"></script>

<div id="map" style="width: 700px; height: 500px;"></div>

<script type="text/javascript">
    var map = new OpenLayers.Map("map");
    var wms = new OpenLayers.Layer.WMS("OpenLayers WMS Basic", "http://labs.metacarta.com/wms/vmap0",
    {
        layers: 'basic'
    });
    map.addLayer(wms);  

    var restricted = new OpenLayers.Layer.WMS("Coast Line", "http://labs.metacarta.com/wms/vmap0",
    {
        layers: 'coastline_01,coastline_02'
    },
    {
        opacity: 0.6,
        singleTile: true,
        ratio: 1,
        isBaseLayer: false,
        maxExtent: OpenLayers.Bounds.fromString("-10,-90,30,90")
    });
    map.addLayer(restricted); 

    map.setCenter(new OpenLayers.LonLat(0,40), 3);
</script>

我正在查看OpenLayers源代码,似乎我需要的功能没有被实现,所以我需要创建一些WMS子类或重新定义一些WMS图层方法。

如果有帮助,我将不胜感激。

谢谢。


1
你能分享一下你目前的代码吗?这样帮助起来会更容易。 - Niklas Wulff
1
你解决了吗?如果是,能否请您发布解决方案? - Shaunak
1个回答

2
如果您希望将整个地图限制在您所说的范围内,并且不允许用户在范围之外移动,您可以尝试以下方法。
var extent = new OpenLayers.Bounds({-10,-90,30,90});
function init() {
            var options = {
                restrictedExtent: extent
            };
            map = new OpenLayers.Map('map', options);
var restricted = new OpenLayers.Layer.WMS("Coast Line", "http://labs.metacarta.com/wms/vmap0",
    {
        layers: 'coastline_01,coastline_02'
    },
    {
        opacity: 0.6,
        singleTile: true,
        ratio: 1,
        isBaseLayer: false
    });
    map.addLayer(restricted); 

这里的区别在于我已经设置了整个地图的范围,而不仅仅是图层。请注意,您还需要控制最大缩放级别。如果您不这样做,用户仍然可以缩小并查看超出范围的数据,但他们将无法在地图上移动视图。
如果您希望地图在指定范围之外平移,但仅限于该图层,则有多种方法可供选择。
1.如果您可以访问提供该图层的WMS服务器,则可以在那里添加一个设置以限制图层服务器的范围。 请参考此链接http://docs.geoserver.org/latest/en/user/webadmin/data/layers.html并阅读“边界框”部分
2.如果您无法访问WMS服务器,并且只想从客户端侧限制请求WMS服务器的区域,则可以尝试使用OpenLayers.layer.WMS类,并采用不同的策略。以下是一个示例:
var myfilter = new OpenLayers.Filter.Spatial({
  type: OpenLayers.Filter.Spatial.BBOX,
    value: OpenLayers.Bounds.({-10,-90,20,90})})

var filterStrategy = new OpenLayers.Strategy.Filter({filter: myFilter});

var restricted = new OpenLayers.Layer.WMS("Coast Line", "http://labs.metacarta.com/wms/vmap0",
  {
      layers: 'coastline_01,coastline_02'
  },
  {
      opacity: 0.6,
      singleTile: true,
      ratio: 1,
      isBaseLayer: false,
      strategies: [filterStrategy]
  });
  map.addLayer(restricted);
请注意,我尚未测试此代码,可能需要一些改进才能使其正常工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接