Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- def getTile(x: Int, y: Int, zoom: Int, uri: String): Option[Array[Byte]] = {
- val geoTiff = GeoTiffReader[MultibandTile].cacheRead(uri)
- val layoutScheme = ZoomedLayoutScheme(WebMercator)
- val layout = layoutScheme.levelForZoom(zoom).layout // this layout is currently used by map
- val keyExtent: Extent = layout.mapTransform(SpatialKey(x, y)) // requested tile extent
- val reprojectedKeyExtent = keyExtent.reproject(layoutScheme.crs, geoTiff.crs) // requested tile extent in source CRS
- def extractTile(extent: Extent, tiff: GeoTiff[MultibandTile]) = tiff
- .getClosestOverview(layout.cellSize, Auto(0)) // select the best matching overview from those available in the tiff
- .crop(extent, Crop.Options(clamp = false)) // crop to the tile extent
- .raster
- .reproject(geoTiff.crs, layoutScheme.crs, Reproject.Options(targetCellSize = Some(layout.cellSize))) // reproject to the map CRS (WebMercator)
- .resample(RasterExtent(keyExtent, layoutScheme.tileSize, layoutScheme.tileSize)) // resample to the desired tile size
- .tile
- geoTiff
- .extent
- .intersection(reprojectedKeyExtent) // returns None if tile extent doesn't intersect tiff extent
- .map(extent => extractTile(extent, geoTiff).renderPng().bytes) // get tile and render png
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement