Advertisement
Guest User

Untitled

a guest
Jun 18th, 2019
71
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.24 KB | None | 0 0
  1. def getTile(x: Int, y: Int, zoom: Int, uri: String): Option[Array[Byte]] = {
  2. val geoTiff = GeoTiffReader[MultibandTile].cacheRead(uri)
  3.  
  4. val layoutScheme = ZoomedLayoutScheme(WebMercator)
  5. val layout = layoutScheme.levelForZoom(zoom).layout // this layout is currently used by map
  6. val keyExtent: Extent = layout.mapTransform(SpatialKey(x, y)) // requested tile extent
  7. val reprojectedKeyExtent = keyExtent.reproject(layoutScheme.crs, geoTiff.crs) // requested tile extent in source CRS
  8.  
  9. def extractTile(extent: Extent, tiff: GeoTiff[MultibandTile]) = tiff
  10. .getClosestOverview(layout.cellSize, Auto(0)) // select the best matching overview from those available in the tiff
  11. .crop(extent, Crop.Options(clamp = false)) // crop to the tile extent
  12. .raster
  13. .reproject(geoTiff.crs, layoutScheme.crs, Reproject.Options(targetCellSize = Some(layout.cellSize))) // reproject to the map CRS (WebMercator)
  14. .resample(RasterExtent(keyExtent, layoutScheme.tileSize, layoutScheme.tileSize)) // resample to the desired tile size
  15. .tile
  16.  
  17. geoTiff
  18. .extent
  19. .intersection(reprojectedKeyExtent) // returns None if tile extent doesn't intersect tiff extent
  20. .map(extent => extractTile(extent, geoTiff).renderPng().bytes) // get tile and render png
  21. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement