在 OpenLayers 2 中放大图块或在不扭曲投影的情况下增加 MaxZoom

Magnifying Tiles in OpenLayers 2 or Increasing MaxZoom Without Distorting Projection

我在 Bing 中使用 OpenLayers2。我的客户需要更深的缩放级别才能与地图进行交互。目前,我可以达到的最大缩放级别是 19,我使用 getZoom() 函数进行了测试。我试图将地图构造函数中的 "numZoomLevels" 设置为更高的数字,但 Bing/OL 似乎忽略了它。我想知道是否有一种方法可以将图块强制降低到较低的缩放级别,或者我是否可以简单地放大现有的图块,这样即使细节有点模糊,我也可以看到更大的图像。然而,至关重要的是,我没有修改投影,因为拥有正确的 lat/lon 值对客户的功能至关重要。

map = new OpenLayers.Map('map', {
    allOverlays: false,
    numZoomLevels: 20,
    controls: [
        new OpenLayers.Control.Navigation({
            dragPanOptions: {
                enableKinetic: true
            }
        }),
        new OpenLayers.Control.LayerSwitcher(),
        new OpenLayers.Control.Zoom({
            zoomInId: "customZoomIn",
            zoomOutId: "customZoomOut"
        })
    ]});

var aerial = new OpenLayers.Layer.Bing({
    name: "Aerial",
    key: apiKey,
    type: "Aerial"
});

我确实偶然发现了 OL3 magnify example,但它是为 OL3 编写的,有点超出我可以转换的范围,因为我需要将放大选项作为缩放级别嵌入,而不仅仅是上下文叠加.另外,我对 canvas 没有太多经验。感谢您的帮助!

我想通了,其实很简单。首先,numZoomLevels 应该在图层级别,而不是地图级别。如果您希望能够放大超出 Bing 提供的范围,您必须将 fractionalZoom 设置为 true,如下所示:

    map = new OpenLayers.Map('map', {
    allOverlays: false,
    fractionalZoom: true,
    controls: [
        new OpenLayers.Control.Navigation({
            dragPanOptions: {
                enableKinetic: true
            }
        }),
        new OpenLayers.Control.LayerSwitcher(),
        new OpenLayers.Control.Zoom({
            zoomInId: "customZoomIn",
            zoomOutId: "customZoomOut"
        })
    ]});

然后,在每一层上,您需要设置一个分辨率数组。您需要为 numZoomLevels 下列出的每个缩放级别创建一个值。我需要 22 个缩放级别。

    var aerial = new OpenLayers.Layer.Bing({
      name: "Aerial",
      key: apiKey,
      type: "Aerial",
      numZoomLevels: 22,
      resolutions: bingResolutions,
      serverResolutions: bingServerResolutions,
      transitionEffect: 'resize'
    });

在 OpenLayers.Layer.Bing 的源代码中已经定义了一个解析块,它映射到它们在以下位置的值:https://msdn.microsoft.com/en-us/library/aa940990.aspx

var bingResolutions = [156543.03390625, 78271.516953125, 39135.7584765625,
19567.87923828125, 9783.939619140625, 4891.9698095703125,
2445.9849047851562, 1222.9924523925781, 611.4962261962891,
305.74811309814453, 152.87405654907226, 76.43702827453613,
38.218514137268066, 19.109257068634033, 9.554628534317017,
4.777314267158508, 2.388657133579254, 1.194328566789627,
0.5971642833948135, 0.29858214169740677, 0.14929107084870338,
0.07464553542435169];

var bingServerResolutions = [156543.03390625, 78271.516953125, 39135.7584765625,
19567.87923828125, 9783.939619140625, 4891.9698095703125,
2445.9849047851562, 1222.9924523925781, 611.4962261962891,
305.74811309814453, 152.87405654907226, 76.43702827453613,
38.218514137268066, 19.109257068634033, 9.554628534317017,
4.777314267158508, 2.388657133579254, 1.194328566789627,
0.5971642833948135];

服务器分辨率是 Bing 本身的图块分辨率。附加分辨率 (0.29858214169740677, 0.14929107084870338, 0.07464553542435169) 是我的分数缩放级别,仅放大第 19 层图块。

Here 是来自 OpenLayers 的 OSM 层的工作示例。

希望这对其他人有帮助!