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

 

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