实现代码如下:
import org.apache.camel.scala.dsl.builder.RouteBuilderSupport
import geotrellis.raster._
import geotrellis.proj4._
import geotrellis.raster.resample.Bilinear
import geotrellis.spark._
import geotrellis.spark.io._
import geotrellis.spark.io.file._
import geotrellis.spark.io.hadoop._
import geotrellis.spark.io.hbase._
import geotrellis.spark.io.index._
import geotrellis.spark.pyramid._
import geotrellis.spark.reproject._
import geotrellis.spark.tiling._
import geotrellis.spark.render._
import geotrellis.vector._
import org.apache.spark._
import org.apache.spark.rdd._
import java.io.{File, FilenameFilter}
import scala.io.StdIn
import com.typesafe.config.ConfigFactory
import com.yykj.chatta.initWriteBackend
import com.yykj.common.comfun
import geotrellis.raster.io.geotiff.{SinglebandGeoTiff, Tags}
import geotrellis.raster.io.geotiff.reader.GeoTiffReader
object makeSlices {
val config = ConfigFactory.load()
def makeslice(inputPath:String)={
val conf =
new SparkConf()
.setMaster("local[*]")
.setAppName("Spark Tiler")
.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
.set("spark.kryo.registrator", "geotrellis.spark.io.kryo.KryoRegistrator")
val sc = new SparkContext(conf)
runtoHbaseTime(sc,inputPath,config.getString("file.path"))
}
def runtoHbaseTime(implicit sc: SparkContext,inputPath:String) = {
//将时间添加至tif文件的head信息中,并生成新的tif
val newTiffPath="/data/tmp/t0.tif"
val time="2019:06:29 00:00:00"
val geoTiff: SinglebandGeoTiff = GeoTiffReader.readSingleband(inputPath)
val t=Map(Tags.TIFFTAG_DATETIME -> time)
val newtiff = new SinglebandGeoTiff(geoTiff.tile, geoTiff.extent, geoTiff.crs, Tags(t, geoTiff.tags.bandTags), geoTiff.options)
newtiff.write(newTiffPath)
//生成rdd
val inputRdd: RDD[(TemporalProjectedExtent, Tile)] =
sc.hadoopTemporalGeoTiffRDD(newTiffPath)
//创建元数据信息
val layoutScheme = FloatingLayoutScheme(512)
val (_, rasterMetaData: TileLayerMetadata[SpaceTimeKey]) =
inputRdd.collectMetadata[SpaceTimeKey](layoutScheme)
val tilerOptions =
Tiler.Options(
resampleMethod = Bilinear,
partitioner = new HashPartitioner(inputRdd.partitions.length)
)
//生成SpaceTimeKey RDD
val tiledRdd:RDD[(SpaceTimeKey, Tile)] with
Metadata[TileLayerMetadata[SpaceTimeKey]]=
inputRdd.tileToLayout[SpaceTimeKey](rasterMetaData, tilerOptions)
//切片大小
val tarlayoutScheme = ZoomedLayoutScheme(WebMercator, tileSize = 256)
val (zoom, reprojected): (Int, RDD[(SpaceTimeKey, Tile)] with
Metadata[TileLayerMetadata[SpaceTimeKey]]) =
TileLayerRDD(tiledRdd, rasterMetaData)
.reproject(WebMercator, tarlayoutScheme, Bilinear)
//hbase.config的配置内容,这里示例如下
//hbase {
// zookeepers = "node1,node2,node3,node4"
// host = "localhhost"
// port =2181
// master = "localhost"
// tablename ="tb1"
//}
//创建hbase存储对象
val (writer,attributeStore:HBaseAttributeStore,instance) = {
val seq = config.getString("hbase.zookeepers").split(",")
val host=config.getString("hbase.host")
val port=config.getString("hbase.port")
val instance:HBaseInstance = HBaseInstance.apply(seq,host,port)
val tabnename=config.getString("hbase.tablename")
//instance.withTableConnectionDo(tabnename)
(HBaseCollectionLayerReader(instance), HBaseValueReader(instance),
HBaseAttributeStore(instance))
}
//创建金字塔并进行切片,保存至hbase
Pyramid.upLevels(reprojected, tarlayoutScheme, zoom, Bilinear) { (rdd, z) =>
val layerId = LayerId("testid", z)
val indexKeyBounds: KeyBounds[SpaceTimeKey] = {
val KeyBounds(minKey, maxKey) = rdd.metadata.bounds.get // assuming non-empty layer
// KeyBounds(
// minKey.setComponent[TemporalKey](minDate),
// maxKey.setComponent[TemporalKey](maxDate)
// )
KeyBounds(minKey, maxKey)
}
val keyIndex =
ZCurveKeyIndexMethod.byDay
.createIndex(indexKeyBounds)
writer.write(layerId, rdd, keyIndex)
}
sc.stop()
}
def main(args: Array[String]): Unit = {
inputpath="/data/tmp/t.tif"
makeSlices.makeslice(inputpath)
}
}