以非常高的缩放显示切片图层

时间:2014-09-27 00:05:47

标签: google-maps-api-3 zoom openlayers tiles

我正在尝试从GIBS图像服务器http://wiki.earthdata.nasa.gov/display/GIBS/Map+Library+Usage显示每日MODIS卫星图像。 瓦片以WMTS协议提供。以下是使用Google maps API的代码示例:

var getTileUrl = function(tile, zoom) {
        return "http://map1.vis.earthdata.nasa.gov/wmts-webmerc/" +
               "MODIS_Terra_CorrectedReflectance_TrueColor/default/" + 
               get_date() + "/" +
               "GoogleMapsCompatible_Level9/" +
                zoom + "/" + tile.y + "/" +
                tile.x + ".jpeg";
    };

    var layerOptions = {
        alt: "MODIS_Terra_TrueColor",
        getTileUrl: getTileUrl,
        maxZoom: 9,
        minZoom: 1,
        name: "MODIS_Terra_TrueColor",
        tileSize: new google.maps.Size(256, 256),
        opacity: 0.8
    };
    var modisOverlay = new google.maps.ImageMapType(layerOptions);
    map.overlayMapTypes.insertAt(0, modisOverlay);

当我将地图缩放到比缩放级别9更多的细节时,图块会消失。所以我将maxZoom增加到了10,现在我收到的消息如下:

Failed to load resource: the server responded with a status of 400 (Bad Request) http://map1.vis.earthdata.nasa.gov/wmts-webmerc/MODIS_Terra_CorrectedReflectance_TrueColor/default/2013-03-07/GoogleMapsCompatible_Level9/10/291/587.jpeg

根据我的理解,服务器在缩放级别高于9的情况下没有平铺。

当我缩放到更高的缩放级别时,有没有办法显示WMTS图块?我需要的是"伸展"用户放大到大于9的缩放级别时的平铺图像。我目前正在使用Google Maps API V3,但如果更容易使用它们来解决我的问题,我可以更改为Leaflet或OpenLayers问题

2 个答案:

答案 0 :(得分:3)

我不确定Google地图,但对于OpenLayers,简短的回答是没有内置方式。 WMTS资源与其URL之间存在一对一映射。因此,有一定数量的具有固定分辨率的缩放级别,并且从视口端口范围和缩放级别,将基于/zoom/y/x.jpeg返回正确的切片。因此,一旦达到最大缩放比例,您将不得不扩展WMTS代码以重新调整现有的后备缓冲区图像,而不是从服务器请求新的图层。所以,如果有点乱,那是可行的。

如果查看OpenLayers.Layer.Tile的源代码,您将看到一个方法applyBackBuffer,它执行tile重新缩放并由zoom事件调用,假设在WMS / WMTS源上设置了transitionEffect:resize(这是默认值) )。一旦达到WMTS的最大缩放比例,您将需要使用此逻辑并阻止在[OpenLayers.Layer.WMTS]中调用getURLgetURL函数实际上由OpenLayer.Tile.Image调用,它是表示单个切片WMS或WMTS的类。

所以,这是更长的答案,可行但是凌乱,因为你正在将两种不同的方法混合到瓷砖上。

值得一提的是,即使你这样做,它也会很快看起来很糟糕。当您从4到2的分辨率缩放时,您将同时重新采样x和y尺寸,因此实际上只有25%的原始像素,从4到1,您正在查看原始图块像素的1/16 ,因为每个新像素将在x和y方向上重新采样4个像素。

答案 1 :(得分:2)

我找到了一个使用Leaflet的简单解决方案。 在Leaflet tileLayer中,我可以设置maxNativeZoom和maxZoom。

maxNativeZoom是图块数据提供程序支持的最大缩放级别。

maxZoom是在地图中显示拉伸图块的最大缩放级别。

答案在这里:Leaflet zoom in further and stretch tiles

当我放大maxNativeZoom以外的几个级别时,它看起来很好用。缺点是图像被重新采样。