JAVA使用GDAL入门指南

如果你打开了这篇博客,那么你肯定和我当初一样的苦逼。
话不多说,分析下我学习gdal的一丢丢心得。

1.你要知道什么GDAL,它是干什么的。

gdal到底是什么呢,相信你已经百度过了。。。。
**

2.Java集成gdal

2.1 下载Java版本的gdal在千万文件大军找到我们需要的文件GDAL\bin\gdal\java
一个jar包四个DLL文件,这是Java依赖GDAL的核心文件 一个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

  • 61
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 9
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值