前言
- 注意:如果你没先看下我的第一篇文章-导读,建议还是先看下(导读)
- 目标:读取存放在本地磁盘/HDFS的单波段/多波段瓦片进行渲染,保存成png图片
- 抢先体验:
步骤
1.编码
概述
- 提供单波段和多波段搜索渲染瓦片的方法
代码文件位置
功能代码
单波段和多波段瓦片搜索渲染代码
注意:OverzoomingValueReader有一个trait(特征)类似于java的接口,它有三个实现类
package com.tiger.geotrellis.common.render
import geotrellis.layer.SpatialKey
import geotrellis.raster.render.{ColorMap, Png}
import geotrellis.raster.{ByteArrayTile, MultibandTile, Tile}
import geotrellis.store.file.FileValueReader
import geotrellis.store.hadoop.HadoopValueReader
import geotrellis.store.{LayerId, OverzoomingValueReader}
/**
* 单波段/多波段栅格数据切片后瓦片的搜索和渲染
*/
object RenderTiff {
/*
无数据透明的瓦片
*/
val nodataPng: Png = ByteArrayTile.empty(256, 256).renderPng()
/**
* 渲染单波段瓦片
*
* @param tileValueReader 瓦片读取器
* @param layerName 图层名
* @param zoom 级别
* @param x 瓦片索引坐标x
* @param y 瓦片索引坐标y
* @param colorMap 颜色渲染规则
* @return Png对象实例
*/
def renderSinglebandTile(tileValueReader: OverzoomingValueReader, layerName: String, zoom: Int, x: Int, y: Int, colorMap: ColorMap): Png = {
try {
//根据级别和瓦片坐标搜索到瓦片 如果找不到就会报错
val tile = tileValueReader.reader[SpatialKey, Tile](LayerId(layerName, zoom)).read(x, y)
//渲染成png 使用colorMap渲染
val png = tile.renderPng(colorMap)
//返回png
png
} catch {
case _: Exception =>
//没有数据的区域就返回透明的无数据png
nodataPng
}
}
/**
* 渲染多波段瓦片
*
* @param tileValueReader 瓦片读取器
* @param layerName 图层名
* @param zoom 级别
* @param x 瓦片索引坐标x
* @param y 瓦片索引坐标y
* @return Png对象实例
*/
def renderMultibandTile(tileValueReader: OverzoomingValueReader, layerName: String, zoom: Int, x: Int, y: Int): Png = {
try {
//根据级别和瓦片坐标搜索到瓦片 如果找不到就会报错
val multibandTile = tileValueReader.reader[SpatialKey, MultibandTile](LayerId(layerName, zoom)).read(x, y)
//color(),这个方法是 将RGB或RGBA多波段瓦片转换为整数压缩RGBA单波段瓦片
val colorTile = multibandTile.color()
//渲染成png
val png = colorTile.renderPng()
//返回png
png
} catch {
case _: Exception =>
//没有数据的区域就返回透明的无数据png
nodataPng
}
}
/**
* 渲染存储在本地文件夹下单波段瓦片
*
* @param fileValueReader 本地瓦片读取器
* @param layerName 图层名
* @param zoom 级别
* @param x 瓦片索引坐标x
* @param y 瓦片索引坐标y
* @param colorMap 颜色渲染规则
* @return Png对象实例
*/
def renderLocalSinglebandTile(fileValueReader: FileValueReader, layerName: String, zoom: Int, x: Int, y: Int, colorMap: ColorMap): Png = {
renderSinglebandTile(fileValueReader, layerName, zoom, x, y, colorMap)
}
/**
* 渲染存储在本地文件夹下多波段瓦片
*
* @param fileValueReader 本地瓦片读取器
* @param layerName 图层名
* @param zoom 级别
* @param x 瓦片索引坐标x
* @param y 瓦片索引坐标y
* @return Png对象实例
*/
def renderLocalMultibandTile(fileValueReader: FileValueReader, layerName: String, zoom: Int, x: Int, y: Int): Png = {
renderMultibandTile(fileValueReader, layerName, zoom, x, y)
}
/**
* 渲染存储在HDFS中的单波段瓦片
*
* @param hadoopValueReader hdfs瓦片读取器
* @param layerName 图层名
* @param zoom 级别
* @param x 瓦片索引坐标x
* @param y 瓦片索引坐标y
* @param colorMap 颜色渲染规则
* @return Png对象实例
*/
def renderHdfsSinglebandTile(hadoopValueReader: HadoopValueReader, layerName: String, zoom: Int, x: Int, y: Int, colorMap: ColorMap): Png = {
renderSinglebandTile(hadoopValueReader, layerName, zoom, x, y, colorMap)
}
/**
* 渲染存储在HDFS中的多波段瓦片
*
* @param hadoopValueReader hdfs瓦片读取器
* @param layerName 图层名
* @param zoom 级别
* @param x 瓦片索引坐标x
* @param y 瓦片索引坐标y
* @return Png对象实例
*/
def renderHdfsMultibandTile(hadoopValueReader: HadoopValueReader, layerName: String, zoom: Int, x: Int, y: Int): Png = {
renderMultibandTile(hadoopValueReader, layerName, zoom, x, y)
}
}
测试代码
测试代码是scala编写
package com.tiger.geotrellis.render
import com.tiger.geotrellis.common.render.RenderTiff
import geotrellis.raster.render.{ColorMap, RGB, RGBA}
import geotrellis.store.file.FileValueReader
import geotrellis.store.hadoop.HadoopValueReader
import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.fs.Path
import org.junit.jupiter.api.Test
/**
* 单波段瓦片搜索与渲染
* 单波段数据源: 福建省pm2.5栅格模拟数据
* 多波段数据源: 福建省浦城县某一块真彩色遥感影像图
*/
class RenderTiffTest4S {
/**
* 测试 渲染存储在本地文件夹下单波段瓦片
*/
@Test
def testRenderLocalSinglebandTile(): Unit = {
//本地瓦片读取器
val reader = FileValueReader.apply("E:/study/bigdata/geotrellis/testdata/img/layers/")
val layerName = "singlebandLayerJson"
val zoom = 9
val x = 424 //已知在这个位置上一定有数据
val y = 217 //已知在这个位置上一定有数据
//pm2.5渲染规则 单波段渲染的时候使用到
val colorMapPm25: ColorMap =
ColorMap(
Map(
0.0 -> RGBA(255, 255, 255, 1),
35.0 -> RGB(0, 228, 0),
75.0 -> RGB(255, 255, 0),
115.0 -> RGB(255, 126, 0),
150.0 -> RGB(255, 0, 0),
250.0 -> RGB(153, 0, 76),
1000.0 -> RGB(126, 1, 35)
)
)
//调用方法
val png = RenderTiff.renderLocalSinglebandTile(reader, layerName, zoom, x, y, colorMapPm25)
//把图片保存到磁盘
png.write("E:/study/bigdata/geotrellis/testdata/img/render/singlebandLayerJsonLocal.png")
println("测试完成")
}
/**
* 测试 渲染存储在本地文件夹下多波段瓦片
*/
@Test
def testRenderLocalMultibandTile(): Unit = {
//本地瓦片读取器
val reader = FileValueReader.apply("E:/study/bigdata/geotrellis/testdata/img/layers/")
val layerName = "multibandLayerJson"
val zoom = 18
val x = 217377 //已知在这个位置上一定有数据
val y = 109886 //已知在这个位置上一定有数据
//调用方法,不需要ColorMap默认就是真彩色渲染
val png = RenderTiff.renderLocalMultibandTile(reader, layerName, zoom, x, y)
//把图片保存到磁盘
png.write("E:/study/bigdata/geotrellis/testdata/img/render/multibandLayerJsonLocal.png")
println("测试完成")
}
/**
* 测试 渲染存储在HDFS中的单波段瓦片
*/
@Test
def testRenderHdfsSinglebandTile(): Unit = {
val configuration = new Configuration()
val reader = HadoopValueReader.apply(new Path("hdfs://node1:8020/data/test/layers/"), configuration)
val layerName = "singlebandLayerJson"
val zoom = 9
val x = 424 //已知在这个位置上一定有数据
val y = 217 //已知在这个位置上一定有数据
//pm2.5渲染规则 单波段渲染的时候使用到
val colorMapPm25: ColorMap =
ColorMap(
Map(
0.0 -> RGBA(255, 255, 255, 1),
35.0 -> RGB(0, 228, 0),
75.0 -> RGB(255, 255, 0),
115.0 -> RGB(255, 126, 0),
150.0 -> RGB(255, 0, 0),
250.0 -> RGB(153, 0, 76),
1000.0 -> RGB(126, 1, 35)
)
)
//调用方法
val png = RenderTiff.renderHdfsSinglebandTile(reader, layerName, zoom, x, y, colorMapPm25)
//把图片保存到磁盘
png.write("E:/study/bigdata/geotrellis/testdata/img/render/singlebandLayerJsonHdfs.png")
println("测试完成")
}
/**
* 测试 渲染存储在HDFS中的多波段瓦片
*/
@Test
def testRenderHdfsMultibandTile(): Unit = {
val configuration = new Configuration()
val reader = HadoopValueReader.apply(new Path("hdfs://node1:8020/data/test/layers/"), configuration)
val layerName = "multibandLayerJson"
val zoom = 18
val x = 217377 //已知在这个位置上一定有数据
val y = 109886 //已知在这个位置上一定有数据
//调用方法,不需要ColorMap默认就是真彩色渲染
val png = RenderTiff.renderHdfsMultibandTile(reader, layerName, zoom, x, y)
//把图片保存到磁盘
png.write("E:/study/bigdata/geotrellis/testdata/img/render/multibandLayerJsonHdfs.png")
println("测试完成")
}
}
2.结果
测试的某一个瓦片的渲染结果图。
总结
- 编写测试了核心的单波段和多波段瓦片搜索渲染的核心方法。
- 下一篇推出自己编写TMS,在前端地图上展示已经切片好的数据。
- 欢迎互相学习,交流讨论,本人的微信:huangchuanxiaa。
参考
- 官方文档:https://geotrellis.readthedocs.io/en/v3.5.1