前言
对于一个GIS开发者来说,GDAL是处理地理数据不可或缺的工具,虽然gdal提供的release版本中提供了java的JNI(Java Native Interface)包,但是正确的配置和部署打包还存在一些坑,这篇文章做一个完整的记录。
开发环境:Jdk1.8、IntelliJ IDEA 2023.1 (Ultimate Edition)、Maven3.8.1、gdal3.6.3
服务器环境:Windows Server 2022 Datacenter(Linux系统服务器随后更新)
GDAL配置
网上有很多关于gdal的配置方法,以及添加到系统变量的过程,这里不多赘述。我们主要的任务是在Idea里面通过Maven的pom文件来管理gdal的依赖,可以正常在项目中使用,并且可以正确将gdal的JNI包打包进项目的完整jar包内,可以在服务器单独运行jar包,所以不做其他环境路径的配置。
- 下载gdal的release版本,以下是示例网址:GISInternals Support Site
- 解压后进入目录文件下的bin/gdal/java目录(如果没有java这个目录,说明下载的文件不对,再去官网找找):我们需要gdalalljni.dll文件和gdal-3.6.3文件。其中gdalalljni.dll文件是gdal的动态链接库,源码是C/C++编写的。gdal-3.6.3的jar包是将函数库封装了一层java的接口。注意:gdal-3.6.3中的内容只是接口,其实现要借助release版本下的dll文件的完成。
- 复制gdalalljni.dll到电脑本机的jdk的jre的bin目录下面。如果没有更改过的话默认应该是:C:\Program Files\Java\jdk1.8.0_281\jre\bin。如果在配置服务器环境,也可以这样操作。
- 返回gdal的release目录下的bin目录,按文件类型排序,复制所有后缀为.dll的应用程序扩展文件,粘贴进C:\Program Files\Java\jdk1.8.0_281\bin目录下。
(我本机java在D盘)
Maven配置
在上述的dll文件拷贝完成之后,将gdal-3.6.3.jar文件拷贝到项目路径中来,放在那里看自己(一般是放在resources下的lib就好)。
来到项目中,在maven的依赖添加如下代码:
<dependency> <groupId>org.gdal</groupId> <artifactId>gdal</artifactId> <version>3.6.3</version> <scope>system</scope> <systemPath>D:/IdeaProjects/system_back/lib/gdal-3.6.3.jar</systemPath> </dependency>
由于我项目本身是基于springboot的多模块项目,比较复杂,这个只是在使用到gdal模块的pom中添加即可。
需要注意的是,在<systemPath>标签内的路径是本机电脑中刚才gdal-3.6.3.jar文件的绝对路径。这里如果你是单模块的项目,可以将jar包拷贝到项目的根目录下,用${project.basedir}来获取到项目根目录而不使用绝对路径。使用绝对路径对团队开发项目不友好,毕竟大家的文件路径都不是一致的。但如果对这些路径不熟悉,还是推荐使用绝对路径,确保程序能找到jar包。
<systemPath>${project.basedir}/lib/gdal-3.6.3.jar</systemPath>
之后刷新maven,然后依赖正常导入,没有标红,说明依赖引入正常。
接下来需要去代码中测试一下,这里提供一个简单的测试dem:
import org.gdal.gdal.Dataset;
import org.gdal.gdal.gdal;
import org.gdal.gdalconst.gdalconstConstants;
public class Gdal {
/**
* 必须注册
*/
static {
gdal.AllRegister();
}
private static final String FILE_PATH = "E:\\data\\压力测试数据\\testdata\\myresult.tif";
// public static void main(String[] args) {
// readTif();
// }
public static void readTif() {
Dataset dataset = gdal.Open(Gdal.FILE_PATH, gdalconstConstants.GA_ReadOnly);
//获取到六参数数组
double[] ori_transform = dataset.GetGeoTransform();
//最小x
double minX = ori_transform[0];
//x方向分辨率
double resoutionX = ori_transform[1];
//x方向旋转角度
double angleX = ori_transform[2];
//最大y
double maxY = ori_transform[3];
//Y方向旋转角度
double angleY = ori_transform[4];
//y方向分辨率
double resoutionY = ori_transform[5];
//x方向的像素数
int pixelX = dataset.getRasterXSize();
//y方向像素
int pixelY = dataset.getRasterYSize();
System.out.println(minX);
System.out.println(resoutionX);
System.out.println(angleX);
System.out.println(maxY);
System.out.println(resoutionY);
System.out.println(pixelX);
System.out.println(pixelY);
}
}
上述tif文件路径换为自己的tif文件即可。这个readTif方法运行成功的话,说明gdal配置成功。
Windows服务器部署打包
在部署打包之前,要确保服务器的gdal版本和本机的版本一致,并且上述的dll文件全部都在服务器的java中进行了相同操作的配置。
- 在Idea的右侧maven中,来到主工程目录下的生命周期,运行一下clean。
- 我的项目是多模块,有一个所有模块的父pom文件管理。进入到父工程的POM文件中配置打包的设置,要将gdal-3.6.3.jar指定到打包路径中,不然默认的情况不会打包。
- 添加以下配置代码:(其中第一个resouce中的目录是gdal-3.6.3.jar的本机绝对路径,第二个resource是默认配置,不能丢。)
<build> <resources> <resource> <directory>D:/IdeaProjects/system_back/lib</directory> <targetPath>BOOT-INF/lib/</targetPath> <includes> <include>**/*.jar</include> </includes> </resource> <resource> <directory>${project.basedir}/src/main/resources</directory> <includes> <include>**/*.*</include> </includes> <filtering>false</filtering> </resource> </resources> </build>
- 刷新maven,然后运行生命周期下面的package命令。等待打包完成。
- 打包完成之后,进入启动类所在模块下的target文件,找到模块打包好的项目jar包。用压缩软件看一下里面BOOT-INFO/lib下面的文件,可以找到gdal-3.6.3.jar已经被打包进来了,这样的jar包拷贝到服务器之后,进入cmd命令窗口运行java -jar xxxx.jar,就可以正常启动服务了。