OpenLayers, как ограничение размера слоя WMS - PullRequest
3 голосов
/ 21 ноября 2011

Я могу создать карту OpenLayers со свойствами maxExtent и limitedExtent.

Также у меня есть игра со слоем WMS и его свойством maxExtent, но проблема возникает при использовании singleTile в слое WMS.

Я хочу иметь слой 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 или переопределить некоторые методы слоя WM.Буду признателен за любую помощь.Спасибо.

1 Ответ

2 голосов
/ 01 августа 2013

Если вы смотрите на ограничение всей карты в той степени, о которой вы говорите, и не позволяете пользователям перемещаться за пределы экстента, вы можете попробовать что-то вроде следующего.

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

Обратите внимание, что я не тестировал этот код, и может потребоваться небольшая доработка, чтобы заставить его работать.

...