我的spark学习之路(四):利用geotrellis 裁剪TIF数据

裁剪数据大概是我们最常用的功能之一了吧,geotrellis的Tile类有两个方法,一个是localMask,一个是mask,tile.localMask(r: Tile, readMask: Int, writeMask: Int) 的作用是把对数据tile进行掩腌,具体的做法是把r中readMask位置的数据换成writeMask,这种要求掩膜数据和被裁剪的数据具有相同的范围大小,mask方法是用矢量数据裁剪TIF文件,这应该是一个很有用的方法,遗憾的是我没有调用成功,它要求提供一个extent参数,我不知道shp的extent应该如何获得,后面如果碰到相关的方法我会再来完善,知道的朋友请不吝赐教。没办法只能自己拆腾,最终还是想到了一个办法,虽然它可能不太完美,但却能解决我的问题,这个方法是用TIT 裁TIF,具体思路是这样的,既然localMask适用于两幅范围相同的数据,那么我们就先把两幅数据的范围弄一样再用localMask方法,具体代码如下:

import breeze.linalg.DenseMatrix
import geotrellis.proj4.CRS
import geotrellis.raster.{CellSize, IntArrayTile}
import geotrellis.raster.io.geotiff.SinglebandGeoTiff
import geotrellis.raster.resample.Average
import geotrellis.vector._
import geotrellis.raster._
/**
    * clip a single band tif file by other
    * @param tif tif that will be clip
    * @param clip mask tif
    * @return
    */

  def clip(tif:SinglebandGeoTiff,clip:SinglebandGeoTiff,readMask:Int=255,writeMask:Int=65535):SinglebandGeoTiff={

    val x=(clip.extent.xmin-tif.extent.xmin)
    val y=(tif.extent.ymax-clip.extent.ymax)
    val w=tif.cellSize.width
    val h=tif.cellSize.height

    val startx=(x/w).toInt
    val starty=(y/h).toInt

    val clipMatrix=DenseMatrix.create(clip.tile.cols,clip.tile.rows,clip.tile.toArrayDouble()).t
    val tifMatrix=DenseMatrix.create(tif.tile.cols,tif.tile.rows,tif.tile.toArrayDouble()).t

    //obtain intersect section data
    val intersect=tifMatrix(starty until starty+clipMatrix.rows,startx until startx+clipMatrix.cols)

    //resample tif 
    val tile=DoubleArrayTile(intersect.t.toArray,clip.tile.cols,clip.tile.rows)
    //mask
    val maskTile=tile.localMask(clip.tile,readMask,writeMask)
    val crs=tif.crs
    val extent=clip.extent
    SinglebandGeoTiff(maskTile,extent,crs)
  }

你可能感兴趣的:(分布式计算的学习之路)