OpenLayers,如何限制WMS层范围

时间:2011-11-21 19:10:08

标签: gis openlayers

我可以使用maxExtent和restrictedExtent属性创建一个OpenLayers Map。

此外,我还使用了WMS图层及其maxExtent属性,但是在WMS图层中使用singleTile时会出现问题。

我想要的是拥有一个WMS图层,它只从服务器获取一个图像,但仅限于我想要的边界。因为我使用了singleTile = true,ratio = 1和maxExtend = my_desired_extent。 但它始终要求整个地图视图。

任何想法如何实现它。 提前谢谢。

下一个代码显示了一个地图,其中包含我想在singleTile模式下使用的基础层和成本线行图层,并限制他们必须向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 个答案:

答案 0 :(得分: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类战略。请参阅下面的示例:

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

    请注意,我尚未对此代码进行测试,可能需要稍微改进才能使其正常运行。