參考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});