Guest User

Untitled

a guest
Nov 16th, 2018
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.37 KB | None | 0 0
  1. package main
  2.  
  3. import (
  4. "fmt"
  5. "image"
  6. "io/ioutil"
  7. "log"
  8. "os"
  9. "unsafe"
  10.  
  11. "github.com/golang/snappy"
  12. "github.com/terrascope/geometry"
  13. "github.com/terrascope/proj4go"
  14. "github.com/terrascope/raster"
  15. "github.com/terrascope/scimage"
  16. "github.com/terrascope/scimage/cog"
  17. "github.com/terrascope/scimage/scicolor"
  18. )
  19.  
  20. const (
  21. rasterName = "/Users/pablo/Downloads/tiles/cmrset_h%02dv%02d.tif"
  22. tileName = "/Users/pablo/Downloads/tiles/cmrset_h%02dv%02ds%02d.snp"
  23. sinuProj = "+proj=sinu +lon_0=0 +x_0=0 +y_0=0 +a=6371007.181 +b=6371007.181 +units=m +no_defs "
  24. xSize = 1111950.519666
  25. ySize = 1111950.519667
  26. rasterSize = 2400
  27. tileSize = 400
  28. )
  29.  
  30. func getBlankRaster(h, v int) raster.Raster {
  31. x0 := float64(h-18) * xSize
  32. x1 := float64(h-17) * xSize
  33. y0 := float64(9-v) * ySize
  34. y1 := float64(8-v) * ySize
  35.  
  36. return raster.Raster{scimage.NewBlankImage(scicolor.GrayS16Model{}, image.Rect(0, 0, 2400, 2400)),
  37. proj4go.Coverage{Proj4: sinuProj, BoundingBox: geometry.BBox(x0, y0, x1, y1)}}
  38. }
  39.  
  40. func ReadRaster(h, v int) (raster.Raster, error) {
  41. fileName := fmt.Sprintf(rasterName, h, v)
  42. rast := getBlankRaster(h, v)
  43.  
  44. rc, err := os.Open(fileName)
  45. if err != nil {
  46. return raster.Raster{}, fmt.Errorf("Error opening file: %s: %v", fileName, err)
  47. }
  48.  
  49. rast.Image, err = cog.Decode(rc)
  50. rc.Close()
  51. if err != nil {
  52. return raster.Raster{}, fmt.Errorf("Error decoding image: %v", err)
  53. }
  54.  
  55. return rast, nil
  56. }
  57.  
  58. func GenerateTiles(h, v int, img image.Image) error {
  59. for i := 0; i < rasterSize/tileSize; i++ {
  60. for j := 0; j < rasterSize/tileSize; j++ {
  61. s := j*10 + i
  62. tName := fmt.Sprintf(tileName, h, v, s)
  63.  
  64. rect := image.Rect(i*tileSize, j*tileSize, (i+1)*tileSize, (j+1)*tileSize)
  65. fmt.Println(rect)
  66.  
  67. tile := img.(*scimage.GrayS16).SubImage(rect).(*scimage.GrayS16)
  68. pix := make([]int16, tileSize*tileSize)
  69.  
  70. for ti := tile.Bounds().Min.X; ti < tile.Bounds().Max.X; ti++ {
  71. for tj := tile.Bounds().Min.Y; tj < tile.Bounds().Max.Y; tj++ {
  72. pix[(ti-tile.Bounds().Min.X)+(tj-tile.Bounds().Min.Y)*tileSize] = tile.GrayS16At(ti, tj).Y
  73. }
  74. }
  75.  
  76. data := *(*[]byte)(unsafe.Pointer(&pix))
  77. fmt.Println(len(data))
  78. err := ioutil.WriteFile(tName, snappy.Encode(nil, data), 0644)
  79. if err != nil {
  80. return err
  81. }
  82. }
  83. }
  84.  
  85. return nil
  86. }
  87.  
  88. func main() {
  89. rast, err := ReadRaster(30, 12)
  90. if err != nil {
  91. log.Fatal(err)
  92. }
  93.  
  94. im := rast.Image.(*scimage.GrayS16)
  95. GenerateTiles(30, 12, im)
  96. }
Add Comment
Please, Sign In to add comment