如果你打开了这篇博客,那么你肯定和我当初一样的苦逼。
话不多说,分析下我学习gdal的一丢丢心得。
1.你要知道什么GDAL,它是干什么的。
gdal到底是什么呢,相信你已经百度过了。。。。
**
2.Java集成gdal
2.1 下载Java版本的gdal在千万文件大军找到我们需要的文件GDAL\bin\gdal\java
一个jar包四个DLL文件,这是Java依赖GDAL的核心文件
2.2 配置gdal环境变量(为什么要配置环境变量答案在下面),如何配置环境变量请自行百度QAQ…
2.3 重点来了。既然是Java集成gdal那么如何集成呢,有以下2种方式(我只百度出来2种,可能还有别的方式)
第一种:在项目内部配置(这种方式简单易上手没有花里胡哨的操作)
2.3.1 将DLL文件放置在Java项目的根目录下
第二种:在项目外部配置
如何你有洁癖,受不了项目里一大堆文件。或者你有很多需要调用GDAL的项目,那么你可以在外部配置一劳永逸!!!
(1). 将使用的jar包放置在jdk中(成为默认jar包我们就不需要配置了)
放置在Java\jdk1.8.0_152\jre\lib\ext
( 2 ) . 将DLL文件放置在C:\Windows\System32下 (同时将gdal/bin下的DLL文件都复制过去(因为DLL库都是相互关联的))
2.3.2 DLL解决了,那么jar包放哪呢???
本人使用的是maven仓库(开源的)将jar包放入WEB-INF/lib下。
此时 你开心的测试了一把,,哈哈不好使,我们需要在pom.xml配置gdal.jar(毕竟是外地人)
这里需要注意一点systemPath路径 是gdal.jar放置的位置
3.如何调用GDAL
如何你认真百度了你肯定知道GDAL是C++写的,所以无法直接调用(气不气QAQ)
1.调用GDAL的几种方式大致了解下
大哥 jni (重量级选手,功能强大,结构严谨,配置繁琐,适合大型项目或者对精度要求很高的项目(需要下载插件和配置相关信息))
二哥 jna (轻量级选手,版本 配置简单,满足绝大部分功能需求的计算(底层依旧是jni实现的,jni依旧是爸爸))
三哥 nativeJna (没用过不做评价,请自行百度)
本人使用的jna方式(jni一个大牛教过我,我不是很懂,不敢造次)
2.配置JNA调用GDAL
JAVA使用jna是以jar包的方式使用的(前辈们把饭做好了,我们直接吃就行了)。和配置gdal.jar一样的方式配置jna。
注意JNA有2个jar包。
当你配置到此步骤的时候基本是木有问题了。下面是JAVA 调用GDAL是具体代码
public class AltitudeUtil {
public static void main(String[] args){
Integer selectAltitude = SelectAltitude(100.3445, 37.003);
System.out.println("海拔是:"+selectAltitude+"米");
}
public static Integer SelectAltitude (double lon,double lat){
//海拔
Integer altitude =0;
//支持所有驱动
gdal.AllRegister();
//要读取的文件
String fileName_tif = "D:/file/海北州高程数据/HAIBEIZHOU_DEM.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数据,所以声明一个int数组来存储,如果是其他数据类型,声明相应的类型即可
int buf[] = new int[iXSize];
//循环遍历取出像元值
for(int i=0; i<iYSize; i++){
band.ReadRaster(0, i, iXSize, 1, buf); //读取一行数据
// 下面是输出像元值
for(int j=0; j<iXSize; j++){
if(i==Yline && j==Xline){
//System.out.println("海拔是:"+buf[j]+"米");
altitude=buf[j];
}
}
}
hDataset.delete();
// 可选
gdal.GDALDestroyDriverManager();
return altitude;}
}
总结:如果你还没配置出来,不要慌这个方向是对的可能细节上有点出入,你可以看看其他大牛的博客,啥也不说了,就是希望看见这篇文章的人少走弯路,程序员小白与代码直接多点真诚,少点套路,妈耶,打字怪累,点个赞呗,哪怕你不是真心的,小手抖一哈!!!花QAQ 花QAQ