geotrellis cog 請求超過最大層級時實時採樣到更大層級

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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章