我能够创建具有 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 平移到指定范围之外而不是该图层,则有多种方法。
如果您可以访问为图层提供服务的 WMS 服务器,您可以在那里添加一个设置来限制图层服务器的范围。 检查此链接 http://docs.geoserver.org/latest/en/user/webadmin/data/layers.html并阅读“边界框部分”
如果您无权访问 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/