我的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)
  }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

裘千仞不会水上漂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值