一、前言
地理空间栅格数据有一定的数据结构和编码规则,这点在各种教材中都写的很详细。本文暂且从简单的栅格数据入手,调用GDAL的有关方法,创建一个GeoTiff格式的栅格数据。以便后期需要使用时,能快速上手。
二、实现思路?
首先获取驱动Driver,从驱动Driver创建栅格数据集,然后将提前定义的仿射变换参数、空间参考配置到数据集中,最后将含有业务数据数组写入波段Band中,存入磁盘、释放资源。
三、程序代码?
package com.myself.raster;
import org.gdal.gdal.Band;
import org.gdal.gdal.Dataset;
import org.gdal.gdal.Driver;
import org.gdal.gdal.gdal;
import org.gdal.gdalconst.gdalconst;
import org.gdal.osr.SpatialReference;
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;
public class RasterWriteDemo {
public static void main(String[] args) {
//注册
gdal.AllRegister();
/*定义空间参考,由于WGS84是世界上比较知名的大地坐标系统,所以可以使用SetWellKnownGeogCS定义,从而简化代码。
如果要定义其他空间参考系,可以调用ImportFromEPSG方法实现,前提是该空间参考系在EPSG编码中
如果不在EPSG编码中的自定义空间参考系,可以使用wkt字符串描述空间参考系,然后调用dataset.SetProjection()来定义投影
*/
SpatialReference spatialReference= new SpatialReference();
spatialReference.SetWellKnownGeogCS("WGS84");
//spatialReference.ImportFromEPSG(4326);
//dataset.SetProjection("GEOGCS["WGS 84",DATUM["WGS_1984",SPHEROID["WGS 84",6378137,298.257223563,AUTHORITY["EPSG","7030"]],AUTHORITY["EPSG","6326"]],PRIMEM["Greenwich",0,AUTHORITY["EPSG","8901"]],UNIT["degree",0.0174532925199433,AUTHORITY["EPSG","9122"]],AXIS["Latitude",NORTH],AXIS["Longitude",EAST],AUTHORITY["EPSG","4326"]]");
//定义仿射转换参数
double[] gt = { 85.0143599999999964, 0.1, 0.0, 17.7554, 0.0, -0.1 };
//指定文件路径
String filePath = "F:\\raster\\Demo_1.tif";
//定义横向像素个数
int xSize = 27;
//定义纵向像素个数
int ySize = 28;
//获取驱动
Driver driver = gdal.GetDriverByName("GTiff");
//获取数据集,一般来说需要指定数据类型,默认为Byte - 8位3无符号整型
Dataset dataset = driver.Create(filePath, xSize, ySize, 2,gdalconst.GDT_Float64);
//配置信息存入dataset中
dataset.SetGeoTransform(gt);
dataset.SetSpatialRef(spatialReference);
/*遍历波段Band,向Band中写入数据
这里设置了两个波段,多波段数据一般是遥感影像数据
*/
int bandcount = dataset.getRasterCount();
for(int i = 0;i<bandcount;i++){
double[] data = new double[xSize * ySize];
//这里用随机树给数组赋值。实际生成过程中应写入业务数据
for (int j = 0;j<data.length;j++){
Random r = new Random();
data[j] = r.nextDouble();
}
Band band = dataset.GetRasterBand(i+1);
//将数组数据写到band中
band.WriteRaster(0,0,xSize,ySize, gdalconst.GDT_Float64,data);
//将缓存数据写入磁盘
band.FlushCache();
//释放资源
band.delete();
}
//将缓存数据写入磁盘
dataset.FlushCache();
//释放资源
dataset.delete();
}
}
?注意事项都写在注释里了。
四、使用QGIS查看
使用GQIS打开创建的栅格文件,如图所示。
查看属性:
2021-10-06 有待完善。?
|