我正在尝试从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问题
答案 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]中调用getURL
。 getURL
函数实际上由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以外的几个级别时,它看起来很好用。缺点是图像被重新采样。