1.2geotrellis3.5.2-单波段或多波段瓦片搜索与渲染

本文介绍了如何利用Geotrellis 3.5.2库进行单波段或多波段瓦片的搜索与渲染,将结果保存为PNG图片。内容包括编码概述、代码位置、功能代码及测试代码的展示,并给出了渲染某瓦片的测试结果。文章还预告了接下来将探讨如何在前端地图上展示切片数据。
摘要由CSDN通过智能技术生成

1.2geotrellis3.5.2-单波段或多波段瓦片搜索与渲染


前言

  • 注意:如果你没先看下我的第一篇文章-导读,建议还是先看下(导读
  • 目标:读取存放在本地磁盘/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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

tiger-hcx

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

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

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

打赏作者

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

抵扣说明:

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

余额充值