首页 文章

OpenLayers,如何限制WMS层范围

提问于
浏览
3

我能够使用maxExtent和restrictedExtent属性创建一个OpenLayers Map .

我也玩WMS图层及其maxExtent属性,但是在WMS图层中使用singleTile时会出现问题 .

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

任何想法如何实现它 . 提前致谢 .

下一个代码显示了一个 Map ,其中包含我想在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 回答

  • 2

    如果您正在考虑将整个 Map 限制在您谈论的范围内,并且不允许用户超出范围,您可以尝试以下内容 .

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

    这里的不同之处在于我在整个 Map 上设置了范围而不仅仅是图层 . 请注意,您还需要控制最大缩放级别 . 如果不这样做,用户仍然可以缩小,并且将显示传递的数据,但是它们将无法在 Map 上平移视图 .

    如果您希望 Map 在指定的范围之外平移但不是那个层,那么有许多方法 .

    • 如果您有权访问从中提供图层的WMS服务器,则可以在此处添加设置以限制图层服务器的范围 . 检查此链接http://docs.geoserver.org/latest/en/user/webadmin/data/layers.html并阅读"Bounding Boxes Section"

    • 如果您无权访问WMS服务器,并且只想从客户端限制从WMS服务器请求的区域,则可以尝试使用具有不同策略的OpenLayers.layer.WMS类 . 请参阅下面的示例:

    var myfilter = new OpenLayers.Filter.Spatial({
    类型:OpenLayers.Filter.Spatial.BBOX,
    值: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”,
    {
    图层:'coastline_01,coastline_02'
    },
    {
    不透明度:0.6,
    singleTile:是的,
    比例:1,
    isBaseLayer:false,
    策略:[filterStrategy]
    });
    map.addLayer(限制);

    请注意,我还没有测试过这段代码,可能需要一些改进才能让它运行起来 .

相关问题