21

我正在使用 OpenLayers 在网页中显示地图。我正在使用来自 CloudMade 的图块,但来自 OpenStreetMap 的 Mapnik 图块也会出现同样的问题。

我正在尝试限制地图,以便用户无法一直缩放到世界视图——我希望他们至少保持大致城市级别的缩放。

我试过使用minZoomLevel//属性maxZoomLevelnumZoomLevels只有maxZoomLevelandnumZoomLevels属性似乎有效,而minZoomLevel属性似乎完全被忽略了。

还有另一种方法可以做到这一点吗?

4

9 回答 9

11

您可以覆盖该isValidZoomLevel功能。像这样的东西(未经测试):

OpenLayers.Map.isValidZoomLevel = function(zoomLevel) {
   return ( (zoomLevel != null) &&
      (zoomLevel >= 2) && // set min level here, could read from property
      (zoomLevel < this.getNumZoomLevels()) );
}

编辑

或者您需要覆盖可用的分辨率,请参见此处的示例:http ://dev.openlayers.org/examples/zoomLevels.html

于 2010-11-21T22:18:35.133 回答
9

XYZ 层不支持 minZoomLevel,OSM 是其子类。

有关解决方法,请参阅以下票证:

于 2010-11-28T02:17:52.660 回答
8

我发现限制 XYZ 图层的 maxZoom 级别的最简单方法是覆盖 getNumZoomLevels 方法:

map.getNumZoomLevels = function(){
        return 10;
        };

这可以防止缩放超过 10 级,并且还可以正确绘制 zoomBar 控件。这个和zoomOffset选项的组合应该允许您轻松控制最小/最大缩放,而不必弄乱分辨率或子类。

于 2012-02-24T11:28:12.203 回答
2

此处的其他答案是指版本 3 之前的 OpenLayers 版本。

使用 OpenLayers 3,您可以maxZoom在初始化地图时使用 map 选项,如下所示:

    var map = new ol.Map({
        target: 'mapcontainer-001',
        layers: layers,  // Layers need to be initialized previously
        view: new ol.View({
          center: ol.proj.transform([-5.12345, 42.12345], 'EPSG:4326', 'EPSG:3857'),
          zoom: 12,
          maxZoom: 19
        })
    });

更多信息可以在 OpenLayers 文档中找到:http: //openlayers.org/en/v3.0.0/doc/tutorials/concepts.html

于 2016-02-01T16:42:39.250 回答
1

现在我在“视图”中使用它:

view: new ol.View({
    center: ol.proj.transform([-3.707524, 40.485644], 'EPSG:4326',EPSG:3857'),
    zoom: 15,
    maxZoom: 17,
    minZoom: 6
}),

它工作正常

于 2016-05-06T20:42:55.347 回答
0

定义分辨率并不能解决问题(即使在 v2.1 中) - 我没有找到任何永久性修复,所以我在 JS 中制作了自己的缩放栏 - 这就是我向使用自定义遇到缩放栏问题的任何人推荐的瓷砖。

于 2011-08-15T15:01:53.610 回答
0

我最终得到了这个解决方案,因为我无法弄清楚如何在我的设置中使用 zoomOffset。

        map.getNumZoomLevels = function(){
            return (options.maxzoom-options.minzoom+1);
        };

        map.isValidZoomLevel = function(zoomLevel) {
            var valid = ( (zoomLevel != null) &&
                (zoomLevel >= options.minzoom) &&
                (zoomLevel <= options.maxzoom) );
            if(!valid && map.getZoom() == 0){
                map.zoomTo(options.maxzoom - (options.maxzoom - options.minzoom)/2);

            }
            return valid;
        }
于 2012-05-14T12:00:25.557 回答
0

我尝试了这样的事情,它对我有用:

map.newMoveTo = map.moveTo;
map.moveTo = function(lonlat,zoom,options){
    return(zoom>=maxZoom && zoom<=minZoom)?map.newMoveTo(lonlat,zoom,options):false;
};
于 2012-07-13T08:44:15.803 回答
0

我找到的最佳答案(包括一个示例)是在OpenLayers - limit the number of zoom levels。我这里就不贴了,请看那边的说明。

于 2013-05-13T10:02:45.477 回答