下载GDAL依赖
下载GDAL
图例1
图例2
配置环境
-
配置环境变量
-
将release-1928-x64\bin目录下所有dll文件拷贝到jdk\bin目录下
图例3
- 将release-1928-x64\bin\gdal\java目录下gdal.jar拷贝到项目工程内,并用maven引用
方式1
<dependency>
<groupId>org.gdal</groupId>
<artifactId>gdal</artifactId>
<scope>system</scope>
<systemPath>${project.basedir}/gdal.jar</systemPath>
</dependency>
方式2
将jar通过maven命令打包至仓库
mvn install:install-file -Dfile=gdal.jar -DgroupId=org.gdal -DartifactId=gdal -Dversion=3.6.4 -Dpackaging=jar
<dependency>
<groupId>org.gdal</groupId>
<artifactId>gdal</artifactId>
<version>3.6.4</version>
</dependency>
测试
- 代码
/**
* 根据经纬度获取高程数据
* @param lon 经度
* @param lat 纬度
* @return 高程
*/
public static Double SelectAltitude(double lon, double lat) {
//海拔
Double altitude = 0d;
//支持所有驱动
gdal.AllRegister();
//要读取的文件,经纬度不可超过查询地图的范围,否则结果为null
//海拔读取为DEM高程数据
String fileName_tif = "E:\\CC_workspace\\tif\\SRTMHGT90DEM\\SRTMHGT90.tif";
//只读方式读取数据
Dataset hDataset = gdal.Open(fileName_tif, gdalconstConstants.GA_ReadOnly);
//支持中文路径
gdal.SetConfigOption("gdal_FILENAME_IS_UTF8", "YES");
//判断是否非空
if (hDataset == null) {
System.err.println("GDALOpen failed - " + gdal.GetLastErrorNo());
System.err.println(gdal.GetLastErrorMsg());
System.exit(1);
}
//图像的列和行
Driver hDriver = hDataset.GetDriver();
int iXSize = hDataset.getRasterXSize();
int iYSize = hDataset.getRasterYSize();
Band band = hDataset.GetRasterBand(1);
//图像六要素
double[] dGeoTrans = hDataset.GetGeoTransform();
//经纬度转行列号
double dTemp = dGeoTrans[1] * dGeoTrans[5] - dGeoTrans[2] * dGeoTrans[4];
int Xline = (int) ((dGeoTrans[5] * (lon - dGeoTrans[0]) - dGeoTrans[2] * (lat - dGeoTrans[3])) / dTemp + 0.5);
int Yline = (int) ((dGeoTrans[1] * (lat - dGeoTrans[3]) - dGeoTrans[4] * (lon - dGeoTrans[0])) / dTemp + 0.5);
//这里是DEM数据,所以声明一个double数组来存储,如果是其他数据类型,声明相应的类型即可
double[] buf = new double[iXSize];
//通过xy确定行数据
band.ReadRaster(0, Yline, iXSize, 1, buf); //读取一行数据
//取出像元值
if (Xline < buf.length) {
altitude = buf[Xline];
}
//删除加载的高程数据
hDataset.delete();
// 可选
gdal.GDALDestroyDriverManager();
return altitude;
}
- 测试结果