参考https://www.cnblogs.com/shoufengwei/p/8973677.html
基于geotrellis 3.0版本以上,3.3.0与3.4.0测试通过
1.获取存在的最大层级
需要设法拿到该图层的metadata,只要拿到metadata,什么都好办,需要注意的两点:
1.COG的matadata对象是COGLayerStorageMetadata。
2.不管摄取成多少层级,_attributes都只有第零层。
matadata对象也容易获取,可通过readCOGLayerAttributes或readMetadata获取
val maxZoom = attributeStore
.readCOGLayerAttributes[LayerHeader, COGLayerStorageMetadata[SpatialKey]](LayerId(layerName,0))
.metadata.keyIndexes.keys.map(z => z.maxZoom).toList.max
2.根据传进来的z,x,y参数计算最大层级的SpatialKey,并由此获取到对应Tile
val layerId: LayerId = LayerId(layerName, maxZoom)
val rmd = Serve.attributeStore.readCOGLayerAttributes[LayerHeader, COGLayerStorageMetadata[SpatialKey]](LayerId(layerName,0)).metadata
val layoutLevel = ZoomedLayoutScheme(rmd.metadata.crs).levelForZoom(rmd.metadata.extent, zoom)
val targetExtent = MapKeyTransform(rmd.metadata.crs, layoutLevel.layout.layoutCols, layoutLevel.layout.layoutRows)(x, y)
val GridBounds(nx,ny,_,_) = rmd.metadata.layoutForZoom(maxZoom).mapTransform(targetExtent)
val maxZoomTile = Serve.valueReader.reader[SpatialKey, MultibandTile](layerId).read(SpatialKey(nx,ny))
3.将该Tile重采样到更高层级
val sourceExtent = rmd.metadata.layoutForZoom(maxZoom).mapTransform(nx,ny)
val targetTile = maxZoomTile.resample(sourceExtent,RasterExtent(targetExtent,256,256))
4.采样消耗时间,达到一定层级后,前后端共同限制请求
L.tileLayer("http://xxxxxx/{z}/{x}/{y}", {maxNativeZoom: 13, maxZoom: 18});