说明:

功能如题所示。

geotiff文件 -> JAVA 浮点二维数组float[][] :

  • 输入: geotiff文件路径,
  • 输出: geotiff
    import org.gdal.gdal.Dataset;import org.gdal.gdal.Driver;import org.gdal.gdal.gdal;import org.gdal.gdal.Band;import org.gdal.gdalconst.gdalconst;import org.gdal.gdalconst.gdalconstConstants;import java.io.File;public static float[][] GetRasterValuesFromFilePath(String tiffFilePath){System.out.println("Info: Get Raster Values From File Path: " + tiffFilePath + "...");gdal.AllRegister();Dataset ds = gdal.Open(tiffFilePath, gdalconstConstants.GA_ReadOnly);if (ds == null){System.err.println("ERR: GDALOpen failed - " + gdal.GetLastErrorNo());System.err.println(gdal.GetLastErrorMsg());System.exit(1);}Band band = ds.GetRasterBand(1);Driver hDriver = ds.GetDriver();//System.out.println("Driver: " + hDriver.getShortName() + "/" + hDriver.getLongName());int width = ds.getRasterXSize();int height = ds.getRasterYSize();//System.out.println("Size is " + width + ", " + height);float[][] resultArray = new float[height][width]; //注意这里高和宽别写反了float[] buffer = new float[width * height];band.ReadRaster(0, 0, width, height,gdalconst.GDT_Float32, buffer);for (int i = 0; i < buffer.length; i++)
//          resultArray.SetValue(buffer[i], i / width, i % width);resultArray[i/width][i%width] = buffer[i];ds.delete();gdal.GDALDestroyDriverManager();return resultArray;}

JAVA 浮点二维数组float[][] -> geotiff文件:

  • 输入: float[][]数组 ,待输出的geotiff文件路径,以及geotiff必要的参数,
  • 输出 :geotiff文件到指定上述路径

写geotfff文件,需要一些必要的参数,先定义一个类管理它,然后,再依靠已有的tiff文件(姑且称之为模板tiff文件吧)中获取的这些属性,进行写tiff文件。

写geotiff文件必要的参数类:

public class GeotiffParameters
{// ATTENTION: Assume all geotiff files share the same parameters as blow.double[] transform= new double[6];String projection;String rasterFormat;int xSize;int ySize;int bandCount;int dataType;                      //from the members of class gdalconst Double[] noValue = new Double[1];    // ATTENTION: Assume all geotiff files only have one band.
}

根据模板tiff获取上述参数:

 public static GeotiffParameters GetGeotiffParameters(String tiffFilePath){GeotiffParameters geotiffParameters = new GeotiffParameters();gdal.AllRegister();Dataset ds = gdal.Open(tiffFilePath, gdalconstConstants.GA_ReadOnly);if (ds == null){System.err.println("ERR: GDALOpen failed - " + gdal.GetLastErrorNo());System.err.println(gdal.GetLastErrorMsg());System.exit(1);}geotiffParameters.projection = ds.GetProjection();ds.GetGeoTransform(geotiffParameters.transform);Driver hDriver = ds.GetDriver();//System.out.println("Driver: " + hDriver.getShortName() + "/" + hDriver.getLongName());geotiffParameters.rasterFormat = hDriver.getShortName();// columns(xSize) and rows(ySize) of rastersgeotiffParameters.xSize     = ds.getRasterXSize();geotiffParameters.ySize     = ds.getRasterYSize();  geotiffParameters.bandCount = ds.getRasterCount();geotiffParameters.dataType = ds.GetRasterBand(1).getDataType();ds.GetRasterBand(1).GetNoDataValue(geotiffParameters.noValue);//System.out.println(geotiffParameters.noValue[0]);//-3.4028234663852886E38return geotiffParameters;}

根据上述写geotiff必要的参数,开始写geotiff文件吧:

 public static Boolean CreateRasterToFilePath(String geotiffOutputFilePath, float[][] resultArray){System.out.println("Info: Create Raster Data(.tif file) To File Path: " + geotiffOutputFilePath + "...");// if file exists, delete it.File file = new File(geotiffOutputFilePath);if(file.exists()){file.delete();}int countColumn = mGeotiffParameters.xSize;  //322     int countRow = mGeotiffParameters.ySize;     //562int bandCount = mGeotiffParameters.bandCount;int dataType = mGeotiffParameters.dataType;String rasterFormat = mGeotiffParameters.rasterFormat;gdal.AllRegister();Driver driver = gdal.GetDriverByName(rasterFormat);Dataset result = driver.Create(geotiffOutputFilePath, countColumn, countRow, bandCount, dataType);//set attributesresult.SetGeoTransform(mGeotiffParameters.transform);result.SetProjection(mGeotiffParameters.projection);float[] tmpData = new float[countColumn * countRow];float tmp;for (int i = 0; i < countRow; ++i){for (int j = 0; j < countColumn; ++j){tmp = resultArray[i][j];tmpData[i * countColumn + j] = tmp;}}result.GetRasterBand(1).SetNoDataValue(mGeotiffParameters.noValue[0]);// The value of xoff and yoff indicates the location that the upper left corner of the pixel block is to write.int check = result.GetRasterBand(1).WriteRaster(0, 0, countColumn, countRow, dataType, tmpData);if (check == gdalconst.CE_Failure)assert false:"write tmp geotiff failed!";elsereturn true;return false;}

GIS_gdal geotiff文件与JAVA 浮点二维数组array之间的转换相关推荐

  1. java txt 二维数组_java 将一个二维数组存到txt文件里,然后再读取

    java 将一个二维数组存到txt文件里,然后再读取 mip版  关注:286  答案:3  悬赏:30 解决时间 2021-01-26 21:40 已解决 2021-01-26 04:05 将一个d ...

  2. java生成二维码到文件,java生成二维码转成BASE64

    java生成二维码到文件,java生成二维码转成BASE64 如题,利用java和第三方库,把指定的字符串生成二维码,并且把二维码保存成图片,转换成BASE64格式. 需要的jar文件: packag ...

  3. java语言二维数组转置_java实现二维数组转置的方法示例

    本文实例讲述了java实现二维数组转置的方法.分享给大家供大家参考,具体如下: 这里在文件中创建Test2.Exchange.Out三个类 在Exchange类中编写exchange()方法,在方法中 ...

  4. java二维数组杨辉三角_实验----Java的二维数组的应用及杨辉三角的编写

    (1) 编写一个程序,生成一个10*10的二维随机整数数组,并将该数组的每行最大值保存于一个一维数组中,将每列平均值保存于另外一个一维数组中并分别输出. (2) 编程输出杨辉三角的前10行. 找出一个 ...

  5. java arraycopy二维数组_System.arraycopy()实现数组的复制与交换

    今天在读别人代码的时候,发现了一个数组之间复制很不错的方法,就分享记录下吧.同时小小的研究下了它的使用方法. System提供了一个静态方法arraycopy(),我们可以使用它来实现数组之间的复制. ...

  6. java获取二维数组长度

    java获取二维数组长度 二维数组定义:int array[][] = new int[3][4]; 获取行数: int rowLength = array.length;//3 获取列数: int ...

  7. Java获取二维数组行列长度

    Java获取二维数组行列长度 二维数组定义:int array[][]=new int[3][3]; 获取行长度 : int rowlength=array.length; 获取列长度:int col ...

  8. Java读写二维数组到文件

    1. 创建文件 使用了File类中的createrNewFile方法. public static boolean createFile(String filename){try{File file ...

  9. Java实现二维数组和稀疏数组的转换

    文章目录 稀疏数组 二维数组-->稀疏数组 稀疏数组-->二维数组 完整code 稀疏数组 简介:当编写的二维数组中存在很多不用的点但初始化时都赋值为0时,这个二维数组的观赏性很低并且非常 ...

  10. Java基础--二维数组

    1.二维数组的定义 二维数组表示行列二维结构,在栈空间中的二维数组的地址指向堆空间中的一维数组,堆空间中的一维数组的地址又指向一维数组所在的内存空间. 2.二维数组的声明 二维数组声明有3种方式,推荐 ...

最新文章

  1. AI 技术发展飞快,高校 AI 教师的知识储备能满足学生旺盛的求知欲吗?
  2. win32 API 遍历一个目录下的文件
  3. Activity与多个fragment的之间的相爱想杀
  4. 1779: 无法言表(map+queue)
  5. xcode常用快捷键_Mac及Xcode常用快捷键
  6. 使用XAMPP轻松建站(上)
  7. java validate 框架_如何使用validator框架来validatebean
  8. php mysql合同跟踪,使用TCP协议进行路由跟踪
  9. 【Java笔记】IO流(2):字符流
  10. 统计学习方法读书笔记5-感知机代码实现
  11. 配置centos环境
  12. java 成绩单_java中用if做成绩单
  13. 电脑卸载了bandzip,但是在文件的打开方式里面还是有bandzip,注册表里又搜不到相关文件,如何解决?
  14. css的nth选择器,CSS选择器之nth
  15. 知识树软件的IPO图
  16. iview构建基本html页面,写前端页面步骤----vue+iview
  17. 炭黑是做什么用的 炭黑起什么作用
  18. 抖音上很火的苹果手机称重touchscale原理
  19. c语言中哪个键是逐行运行的,c语言中的快捷键有哪些?
  20. 线性函数,C语言方式实现

热门文章

  1. VUE中使用lib-flexible和 px2rem-loader
  2. iOS开发常用技能点(持续更新中。。。)
  3. linux shell中$0,$?,$!等的特殊用法
  4. 微星msi B450M+i5-8500+1060成功黑苹果
  5. vscode 修改(自定义)插件的快捷键
  6. FPGA实现“打字机”(VGA UART)
  7. 上手DocumentDB On Azure (二)
  8. python输入输出基本点
  9. SqlServer获取数据表字段自定义编号
  10. Python selenium 滚动页面以及滚动至元素可见(转载)