基于缩放级别显示WMS图层

5
我已经在这里工作了整整一天,但老实说我已经没有任何想法了。我有一些WMS图层,希望根据当前缩放级别显示/隐藏。是的,我已经阅读了API文档,但是我按照建议的一切去做,却没有得到期望的结果:(
以下是我查看的其中一个来源:http://trac.osgeo.org/openlayers/wiki/SettingZoomLevels
更糟糕的是,我发现如果您在加载时显示Open Street Map基础图层,则似乎会限制您对地图的numZoomLevels的控制,这正是我需要的,因为我确实想将其用作我的加载基础图层...
所以我的问题是:
我做错了什么吗? 使用Open Street Map基础图层加载时,是否真的没有控制缩放级别的解决方法?还是有些我不知道的东西?
以下是我的一些代码尝试: 尝试1:tib_villages图层只应在缩放级别为8-10时显示,但无效!
var options = {
                                        controls: [new OpenLayers.Control.Navigation()], //Needed to use GeoExt controls such as the zoomslider
            maxExtent: new OpenLayers.Bounds(-20037508.34, -20037508.34, 20037508.34, 20037508.34),
            units: 'm',
            numZoomLevels: null, //setting the map's zoom levels to null
            allOverlays: false
        }

var osm = new OpenLayers.Layer.OSM(); //MY base layer

//MY overlay layer
var tib_villages = new OpenLayers.Layer.WMS(
                    "Villages", "http://localhost:8080/geoserver/wms", {layers: 'cite:tib_villages', transparent: true, numZoomLevels: 10, minZoomLevel: 8}, {isBaseLayer: false, displayInLayerSwitcher: true, visibility: true}
                );

第二次尝试:tib_villages图层应仅在缩放级别为8-10时显示,地图应仅有10个缩放级别,但实际上有19个,因为Open Street Map图层强制执行它,这不起作用!

var options = {
                                        controls: [new OpenLayers.Control.Navigation()], //Needed to use GeoExt controls such as the zoomslider
            maxExtent: new OpenLayers.Bounds(-20037508.34, -20037508.34, 20037508.34, 20037508.34),
            units: 'm',
            numZoomLevels: 10, //setting the map's zoom levels to 10 only
            allOverlays: false
        }

var osm = new OpenLayers.Layer.OSM(); //MY base layer

//MY overlay layer
var tib_villages = new OpenLayers.Layer.WMS(
                    "Villages", "http://localhost:8080/geoserver/wms", {layers: 'cite:tib_villages', transparent: true, numZoomLevels: null, minZoomLevel: 8}, {isBaseLayer: false, displayInLayerSwitcher: true, visibility: true}
                )

第三步:在加载时去除Open Street Map基础图层后,地图仅有10个指定的缩放级别,但tib_villages图层应该只在缩放级别为8-10时显示,但未生效!

var options = {
                                        controls: [new OpenLayers.Control.Navigation()], //Needed to use GeoExt controls such as the zoomslider
            maxExtent: new OpenLayers.Bounds(-20037508.34, -20037508.34, 20037508.34, 20037508.34),
            units: 'm',
            numZoomLevels: 10, //setting the map's zoom levels to 10
            allOverlays: false
        }

//MY overlay layer
var tib_villages = new OpenLayers.Layer.WMS(
                    "Villages", "http://localhost:8080/geoserver/wms", {layers: 'cite:tib_villages', transparent: true, numZoomLevels: 10, minZoomLevel: 8}, {isBaseLayer: false, displayInLayerSwitcher: true, visibility: true}
                );

非常感谢您提出的所有建议!

elshae


@elshae:我会去http://gis.stackexchange.com/或者邮件列表*users@openlayers.org*上发布你的问题。 - Chau
嗯,我会去查看gis.stackexchange.com,并在Users@openlayers.org上发布帖子,但我经常得不到回应 :-/ - elshae
2个回答

9
尝试使用minResolutionmaxResolution代替minZoomLevel,这通常效果很好。如果您调用map.getResolution()方法,可以获取任何缩放级别的分辨率。
另一个选择是侦听OpenLayers.Mapzoomend事件,并相应地切换图层可见性。类似这样的代码:
map.events.on({ "zoomend": function (e) {
    if (this.getZoom() > 2) {
      layer1.setVisibility(false);
      layer2.setVisibility(true);
    }
    else {
      layer2.setVisibility(false);
      layer1.setVisibility(true);
    }
  }
});

非常感谢!你的回答非常清晰简洁,现在我的地图功能已经按照我想要的方式工作了:D - elshae
清晰的解释,优美的解决方案。运行得非常完美。 - tony gil

5

我建议在图层上使用maxScale和minScale而不是分辨率,但这可能是个人偏好的问题。 :-) 我无法理解分辨率值,但比例尺易于理解并在长期内维护,当他人查看您的代码时。


最终我确实使用了minScale :), 可惜不能将两个答案都标记为正确 :-/ - elshae
没问题。如果你能改变正确答案,当然会很好,但这不是什么大不了的事情。 - Niklas Wulff
3
如果你在点踩,请提交评论,这样我就可以在以后改进。谢谢。 - Niklas Wulff
我有点困惑,我什么时候给你的答案点了踩?我记得我最近是接受了你的回答的! - elshae
@elshae,我不知道是谁给我点了踩,我只是在回应那个人。显然不是你。 :-) - Niklas Wulff
可以给个例子或者文档链接吗? - alfonx

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