gis - OpenLayers,如何限制 WMS 图层范围

标签 gis openlayers

我能够创建具有 maxExtent 和 restrictedExtent 属性的 OpenLayers map 。

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

我想要的是拥有一个 WMS 层,该层仅从服务器获取一张图像但限制在我想要的范围内。因为我使用了 singleTile=true、ratio=1 和 maxExtend=my_desired_extent。 但它总是请求整个 map View 。

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

下一个代码显示了一个带有基础层和成本线层的 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 图层方法。 我将不胜感激任何帮助。 谢谢。

最佳答案

如果您正在考虑将整个 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 上平移 View 。

如果您希望 map 平移到指定范围之外而不是该图层,则有多种方法。

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

请注意,我尚未测试此代码,可能需要一些改进才能使其正常工作。

关于gis - OpenLayers,如何限制 WMS 图层范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8217163/

相关文章:

javascript - 如何在 OpenLayers 上单击标记

matlab - 计算空间共置的有效方法

google-maps - 使用 5k+ 地址的可用地理 API 计算行程旅行时间

javascript - Dojo 对话框未加载样式

javascript - OpenLayers 保存特征

jquery - 我这里有 OpenLayers/jQuery 冲突吗?

javascript - 开放层功能

python - Pandas :计算每组行内的正弦距离

javascript - 传单 map : How to stop all the popups from closing when one is opened?

c# - 将两个 C# DbGeography 多边形连接成一个多边形