一、GeoTiff

GeoTiff是很常见的一种遥感影像数据格式,它是一种栅格数据,这种数据是以像素点矩阵的形式存储的。

TIF文件中的空间信息包括投影信息和仿射变换信息。其中,仿射变换(经纬度等)的信息分别为:左上角的坐标(经度和维度)、东西和南北方向的像素分辨率(也就是每个像素点的经纬度偏移量)以及图像的旋转系数(正北方向时为零)。这样,每个像素点的坐标就可以通过它与左上角的偏移量和每个像素的分辨率值计算出来。

切图产生的新图的投影信息是不变的,但仿射信息会发生变化,因为左上角的原点可能跟原图不一样了。因此,需要重新计算仿射信息并设置(投影信息也需要设置,但不需要重新计算)。

二、波段

波段又称为波谱段或波谱带,在遥感技术中,通常把电磁波谱划分为大大小小的段落,大的成为波段区,如可见区、红外区等;中等的如近红外、远红外等;小的称为波段。

影像数据根据波段的多少可以分为单波段影像和多波段影像两种,单波段影像一般用黑白色的灰度图来描述,多波段常用RGB 合成象素值的彩色图来描述,就是将三个波段的数据分别通过红、绿、蓝三个通道加载,从而渲染出。

将多波段影像数据添加到地图中之后,可使用多波段栅格数据集中的任意三个可用波段的组合来创建 RGB 合成图。与仅处理一个波段相比,通过将多个波段共同显示为RGB 合成图通常可从数据集收集到更多信息。

三、GDAL切图

  1. Tif文件的读取

  2. 根据Tif文件中的波段数量,读取相应的波段(Band)。

  3. 根据裁剪的起始点和矩形框的大小,并读取相应的数据

  4. 获取创建文件并创建新的目标文件

  5. 计算新图的仿射信息,并设置投影和仿射信息

  6. 将提取出来的数据写入新文件并刷新缓存到磁盘

  7. 释放文件句柄资源

源码如下:

import org.gdal.gdal.Dataset;
import org.gdal.gdal.Driver;
import org.gdal.gdal.gdal;
import org.gdal.gdalconst.gdalconstConstants;public class GDALClip {public static void clip(String srcFile, String dstFile, int offsetX, int offsetY, int sizeX, int sizeY) {// 读取要切的原图Dataset srcDs = gdal.Open(srcFile, gdalconstConstants.GA_ReadOnly);if (srcDs == null) {System.err.println("GDALOpen failed - " + gdal.GetLastErrorNo());System.err.println(gdal.GetLastErrorMsg());return;}int rasterCount = srcDs.GetRasterCount();System.out.println("波段数 = " + rasterCount);if (rasterCount < 1) {System.err.println("异常:没有波段。");return;}// 获取Tif的驱动,为创建切出来的图文件做准备Driver GTIFFDiver = gdal.GetDriverByName("GTIFF");// 创建切出来的要存的文件Dataset dstDs = GTIFFDiver.Create(dstFile, sizeX, sizeY, rasterCount, srcDs.GetRasterBand(1).getDataType());if (dstDs == null) {System.err.println("Create failed - " + gdal.GetLastErrorNo());System.err.println(gdal.GetLastErrorMsg());return;}// 复制每个波段的数据for (int index = 1; index <= rasterCount; index++) {copyData(srcDs, dstDs, index, offsetX, offsetY, sizeX, sizeY);}// 仿射变换系数,即6个参数,左上角地理坐标,纵横方向上的分辨率,以及旋转系数。// GeoTransform[0] /* 左上角x坐标  */// GeoTransform[1] /* 东西方向分辨率resolution */// GeoTransform[2] /* 旋转角度, 0表示图像 "北方朝上" */// GeoTransform[3] /* 左上角y坐标 */// GeoTransform[4] /* 旋转角度, 0表示图像 "北方朝上" */// GeoTransform[5] /* 南北方向分辨率resolution */ // 获取原图的原点坐标信息double[] srcTransform = srcDs.GetGeoTransform();System.out.println("原点坐标   = " + srcTransform[0] + "," + srcTransform[3]);System.out.println("像素坐标差 = " + srcTransform[1] + "," + srcTransform[5]);// 根据反射变换参数计算新图的原点坐标double top_left_x = srcTransform[0] + offsetX * srcTransform[1];double top_left_y = srcTransform[3] + offsetY * srcTransform[5];// 将计算后的值组装为一个元组double[] dstTransform = {top_left_x, srcTransform[1], srcTransform[2], top_left_y, srcTransform[4], srcTransform[5]};// 设置裁剪出来图的原点坐标dstDs.SetGeoTransform(dstTransform);// 设置SRS属性(投影信息)// System.out.println("Projection = " + srcDs.GetProjection());dstDs.SetProjection(srcDs.GetProjection());// 将缓存写入磁盘dstDs.FlushCache();dstDs.delete();srcDs.delete();}private static void copyData(Dataset srcDs, Dataset dstDs, int bandNum, int offsetX, int offsetY, int sizeX, int sizeY) {int bufR[] = new int[sizeX * sizeY];//从波段中切需要的矩形框内的数据(注意读取的矩形框不能超过原图大小)srcDs.GetRasterBand(bandNum).ReadRaster(offsetX, offsetY, sizeX, sizeY, bufR);// 写入目标文件dstDs.GetRasterBand(bandNum).WriteRaster(0, 0, sizeX, sizeY, bufR);}public static void main(String[] args) {gdal.AllRegister();GDALClip.clip("D:\\test\\cut_img.tif", "D:\\test\\clip.tif", 0, 0, 100, 100);gdal.GDALDestroyDriverManager();}
}

GeoTiff及GDAL切图(java)相关推荐

  1. 图片自动切图java源代码_Sketch 和 PS中的设计图如何实现“自动切图”?

    切图是很多UI设计师的一项日常工作.平时做完设计图,要将设计稿切成便于制作成页面的图片,并标注好尺寸和间距,交付给前端来完成html+css布局的静态页面,有利于交互,形成良好的视觉感. 但有的认为前 ...

  2. java 生成纯色图片_java实现切图并且判断图片是不是纯色/彩色图片

    java实现切图并且判断图片是不是纯色/彩色图片 发布时间:2020-08-30 15:45:30 来源:脚本之家 阅读:92 作者:点墨花花 整理文档,搜刮出一个java实现切图并且判断图片是否是纯 ...

  3. Java切图或者判断是不是纯色图片

    文章目录 一.切图代码: 二.判断是否是纯色图片的代码,稍微改一下可以用来判断是不是彩色图片: 一.切图代码: import java.awt.Rectangle; import java.awt.i ...

  4. [Java] Java九格切图 (同样支持四格, 六格, n*n格)

    公司的APP要做一个九格切图功能, 类似朋友圈那种一张大图放上去. 本来已经用Python三十行搞定. 结果被测试部的质疑我不会用Java写?? 一下子脾气就上来了, 用Java写了一个支持N格切图的 ...

  5. ps切图后 JAVA开发_2018年设计师都在用的PS切图插件--摹客

    终于找到你,我梦寐以求的PS切图插件.曾几何时,设计师在完成设计稿之后高效的输出标注切图一直是设计师的噩梦.为什么这么说呢?开发要的那么多尺寸,我到底该怎么切图?iPhone的版本已经不少了,更别提安 ...

  6. java 切图_java用pdfbox切图并重绘宽高

    引入pdfbox使用的jar pdfbox-2.0.8.jar,maven依赖如图: org.apache.pdfbox pdfbox 2.0.8 切图:按页切图并生成对应的png格式的图片,输出至相 ...

  7. java将图片均匀分成9份,怎样把一张图片快速切成平均等分/切图? - 杂谈

    我们在发微博.朋友圈的时候,有时候希望把一张图片切成几个等块后发布:而作为商家也有将商品图片切成短图的需求,其实那样看起来更有美感,又或者是一张比较大火长的图片,需要进行等分裁切,这时候,我们可以使用 ...

  8. ps切图后 JAVA开发_photoshop操作之前端PS操作切图和合并sprite

    今天给大家介绍一下关于前端相关PS操作之切图和合并sprite,首先给那些已经学习完HTML/CSS基础知识,想模仿做一个静态页面,但缺少对ps了解的新手同学,那么下面我们一起来看一下吧. 一.准备工 ...

  9. ps切图后 JAVA开发_做一个会PS切图的前端开发

    系列链接 切图方法分类 PhotoShop从CS版本演变到现在的CC版本,切图功能发生了比较大的变化,我们可以把PhotoShop CS版本时的切图功能称为传统切图,而从PhotoShop CC版本开 ...

  10. 根据传入坐标和图片URL地址对图片进行切图操作、将图片转化成Base64位码

    目录 1.根据传入坐标和图片URL地址对图片进行切图操作 2.将图片转化成Base64位编码.根据传入坐标 算出切点坐标 在开发过程的学习记录,此两个工具类主要是对图像的处理(切图),对文件的想换转化 ...

最新文章

  1. 深入学习Lock锁(2)——LockSupport工具类
  2. Linux磁盘空间被占满?清空回收站试试!
  3. 强烈建议使用国外DNS解析域名,解决访问速度和某些访问故障!
  4. green ethernet
  5. 【形式语言与自动机】有限状态机
  6. 后序遍历的非递归算法python_Python非递归实现二叉树的后续遍历
  7. mysql 部署在私有云_教你在 RHEL 7 中部署私有云网盘
  8. Box,( UVa, 1587 )
  9. android camera x旋转,如何使用android.graphics.Camera.rotateX(角度)在特定点旋转画布
  10. gis插入的文本怎么搞成两行_PPT脱白教程09期手把手带你了解“文本框”(03)...
  11. LINUX下运行.sh文件出现Syntax error: end of file unexpected (expecting “then”)最方便解决方法
  12. The code contains unhandled characters
  13. GlusterFS(上)
  14. UE4.24版本VR项目打包后,未出现手柄控制器
  15. python学习(五)--打印错误信息
  16. C/C++大文件/数据网络传输方法总结
  17. 两种方式实现线程通信:三个线程交替打印AABBCC
  18. ACM-ICPC 2018 南京赛区网络预赛 Skr 马拉车+字符串hash+hash表
  19. GSM手机卡头不安全,可轻易复制来使用
  20. HTTP协议通信相关资料(做笔记)

热门文章

  1. 写给新入IT的新人们(转载)
  2. 重磅!Google ARCore 和京东 AR 联合举办消费应用创新大赛
  3. 手机配置代理报错invalid host header
  4. 颠覆大数据分析之Storm简介
  5. 创龙 C6000 DSP开发板众筹来袭
  6. 25.Linux/Unix 系统编程手册(上) -- 进程的终止
  7. 35.MySQL 常见问题
  8. 3. XML 树结构
  9. php中有关目录的几个函数 basename() dirname() pathinfo()
  10. 三星Galaxy note I9220 系统廋身