GIS_gdal geotiff文件与JAVA 浮点二维数组array之间的转换
说明:
功能如题所示。
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之间的转换相关推荐
- java txt 二维数组_java 将一个二维数组存到txt文件里,然后再读取
java 将一个二维数组存到txt文件里,然后再读取 mip版 关注:286 答案:3 悬赏:30 解决时间 2021-01-26 21:40 已解决 2021-01-26 04:05 将一个d ...
- java生成二维码到文件,java生成二维码转成BASE64
java生成二维码到文件,java生成二维码转成BASE64 如题,利用java和第三方库,把指定的字符串生成二维码,并且把二维码保存成图片,转换成BASE64格式. 需要的jar文件: packag ...
- java语言二维数组转置_java实现二维数组转置的方法示例
本文实例讲述了java实现二维数组转置的方法.分享给大家供大家参考,具体如下: 这里在文件中创建Test2.Exchange.Out三个类 在Exchange类中编写exchange()方法,在方法中 ...
- java二维数组杨辉三角_实验----Java的二维数组的应用及杨辉三角的编写
(1) 编写一个程序,生成一个10*10的二维随机整数数组,并将该数组的每行最大值保存于一个一维数组中,将每列平均值保存于另外一个一维数组中并分别输出. (2) 编程输出杨辉三角的前10行. 找出一个 ...
- java arraycopy二维数组_System.arraycopy()实现数组的复制与交换
今天在读别人代码的时候,发现了一个数组之间复制很不错的方法,就分享记录下吧.同时小小的研究下了它的使用方法. System提供了一个静态方法arraycopy(),我们可以使用它来实现数组之间的复制. ...
- java获取二维数组长度
java获取二维数组长度 二维数组定义:int array[][] = new int[3][4]; 获取行数: int rowLength = array.length;//3 获取列数: int ...
- Java获取二维数组行列长度
Java获取二维数组行列长度 二维数组定义:int array[][]=new int[3][3]; 获取行长度 : int rowlength=array.length; 获取列长度:int col ...
- Java读写二维数组到文件
1. 创建文件 使用了File类中的createrNewFile方法. public static boolean createFile(String filename){try{File file ...
- Java实现二维数组和稀疏数组的转换
文章目录 稀疏数组 二维数组-->稀疏数组 稀疏数组-->二维数组 完整code 稀疏数组 简介:当编写的二维数组中存在很多不用的点但初始化时都赋值为0时,这个二维数组的观赏性很低并且非常 ...
- Java基础--二维数组
1.二维数组的定义 二维数组表示行列二维结构,在栈空间中的二维数组的地址指向堆空间中的一维数组,堆空间中的一维数组的地址又指向一维数组所在的内存空间. 2.二维数组的声明 二维数组声明有3种方式,推荐 ...
最新文章
- AI 技术发展飞快,高校 AI 教师的知识储备能满足学生旺盛的求知欲吗?
- win32 API 遍历一个目录下的文件
- Activity与多个fragment的之间的相爱想杀
- 1779: 无法言表(map+queue)
- xcode常用快捷键_Mac及Xcode常用快捷键
- 使用XAMPP轻松建站(上)
- java validate 框架_如何使用validator框架来validatebean
- php mysql合同跟踪,使用TCP协议进行路由跟踪
- 【Java笔记】IO流(2):字符流
- 统计学习方法读书笔记5-感知机代码实现
- 配置centos环境
- java 成绩单_java中用if做成绩单
- 电脑卸载了bandzip,但是在文件的打开方式里面还是有bandzip,注册表里又搜不到相关文件,如何解决?
- css的nth选择器,CSS选择器之nth
- 知识树软件的IPO图
- iview构建基本html页面,写前端页面步骤----vue+iview
- 炭黑是做什么用的 炭黑起什么作用
- 抖音上很火的苹果手机称重touchscale原理
- c语言中哪个键是逐行运行的,c语言中的快捷键有哪些?
- 线性函数,C语言方式实现
热门文章
- VUE中使用lib-flexible和 px2rem-loader
- iOS开发常用技能点(持续更新中。。。)
- linux shell中$0,$?,$!等的特殊用法
- 微星msi B450M+i5-8500+1060成功黑苹果
- vscode 修改(自定义)插件的快捷键
- FPGA实现“打字机”(VGA UART)
- 上手DocumentDB On Azure (二)
- python输入输出基本点
- SqlServer获取数据表字段自定义编号
- Python selenium 滚动页面以及滚动至元素可见(转载)