链接: gdal官网地址
gdal
gdal的一个用c++语言编写的库,用于处理地理信息相关的数据包括转换,识别数据,格式化数据以及解析
同时提供第三方语言的SDK包括python,java上述需要编译后使用 java是需要使用jni接口调用实现方法在window平台是DLL文件,在linux平台是so文件,最后需要使用和初始化服务。
windows环境
链接: gdal Download
(1)第一种简单粗暴的方式就是把gdal包bin目录下所有的dll文件和bin\gdal\java下的dll文件丢到你的JDK的bin目录下,对应的jar包也许在\bin\gdal\java目录下。
链接: windows Springboot 集成GDAL开发环境配置
1.将解压后的GDAL压缩包bin文件夹下的所有dll文件拷贝到自己电脑的jdk安装目录下的bin文件夹中(我的电脑是C:\jdk\bin),如果有冲突文件可以跳过。 注意是jdk下bin文件夹,不是jre下的bin。
2.将压缩包解压后的bin\gdal\java\gdalalljni.dll文件同样到jdk下的bin文件夹中
(2)第二种是自己新建一个文件夹把需要的dll文件全放在一起,然后自己配环境变量(总之让系统能找到你的库就行了)。
Path 添加
Linux和docker环境
链接: OSGeo/gdal github地址
在Linux上,gdal官网上没有编译好的包,要自己去下gdal的源码包,然后自己编译,后面会生成.so文件和jar包,和windows一样可以配置环境变量或者把so文件丢到jdk的bin目录下。
-- 拉取镜像
docker pull osgeo/gdal:latest-- 以本机的网络模式运行 内部的端口则可以直接访问了
docker run -it --rm -v /home/gadl/tmp/sll:/tmp/sll -d --network=host osgeo/gdal:latest-- 查看GDAL库的版本。
gdalinfo --version-- 查看java的版本。
java -version-- 进入目录
docker exec -it 容器id /bin/bashcd /tmp/sll/-- 把jar复制进来
java -jar 启动 jar包
docker-compose启动
gdalservice:image: "osgeo/gdal:latest"container_name: gdalservicevolumes:- ./gdalservice/data:/data- /opt/docker-project/gdalservice/data/geo-api-0.0.1-SNAPSHOT.jar:/app/geo-api-0.0.1-SNAPSHOT.jarenvironment:- SOME_ENV_VAR=valuecommand: /bin/sh -c "java -jar /app/geo-api-0.0.1-SNAPSHOT.jar"ports:- "9003:9003"
测试代码
链接: 官方gdal的java调用API
写个springboot项目接口 打包上去测试即可
引入依赖
<!-- https://mvnrepository.com/artifact/org.gdal/gdal --><dependency><groupId>org.gdal</groupId><artifactId>gdal</artifactId><version>3.7.0</version></dependency>
public static void main(String[] args) {// 指定文件的名字和路径String gdbFile = "D:\\test\\MyProject12.gdb";// 注册所有的驱动ogr.RegisterAll();// 为了支持中文路径,请添加下面这句代码gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");// 为了使属性表字段支持中文,请添加下面这句gdal.SetConfigOption("SHAPE_ENCODING", "CP936");//打开文件获取数据集Dataset dataset = gdal.OpenEx(gdbFile);if (dataset == null) {System.out.println("打开"+gdbFile+"失败"+gdal.GetLastErrorMsg());System.exit(1);}Group group = dataset.GetRootGroup();Vector<String> vector1 = group.GetGroupNames();System.out.println(vector1);for (String name : vector1) {Group group1 = group.OpenGroup(name);Vector<String> vector = group1.GetVectorLayerNames();for (String o : vector) {Layer layer = group1.OpenVectorLayer(o);System.out.println(layer.GetName());}}Vector vector2 = group.GetVectorLayerNames(vector1);System.out.println(vector2);// 读取数据,这里以gdb文件为例// 程序提供对ArcGIS 9及以上版本创建的文件geodatabase.gdb目录的矢量层的读取访问。数据集名称必须是目录/文件夹名称并且必须以.gdb扩展名结尾。它还可以直接读取zipped.gdb目录扩展名为.gdb.zip前提是它们在第一级包含一个.gdb目录。也可以直接打开特定的.gdbtable文件包括“system”表。几何图形中的曲线由GDAL>=2.2支持。String strDriverName = "OpenFileGDB";// 创建一个文件,根据strDriverName扩展名自动判断驱动类型org.gdal.ogr.Driver oDriver = ogr.GetDriverByName(strDriverName);if (oDriver == null) {System.out.println(strDriverName + " 驱动不可用!\n");return;}DataSource dataSource = oDriver.Open(gdbFile, 0);for (int i = 0; i < dataSource.GetLayerCount(); i++) {Layer layerIdx = dataSource.GetLayer(i);System.out.println("图层名称 要素类:<==>" + layerIdx.GetName());}Layer layer = dataSource.GetLayer("test");SpatialReference spatialReference = layer.GetSpatialRef();System.out.println("空间参考坐标系:" + spatialReference.GetAttrValue("AUTHORITY", 0)+ spatialReference.GetAttrValue("AUTHORITY", 1));double[] layerExtent = layer.GetExtent();System.out.println("图层范围:minx:" + layerExtent[0] + ",maxx:" + layerExtent[1] + ",miny:" + layerExtent[2]+ ",maxy:" + layerExtent[3]);FeatureDefn featureDefn = layer.GetLayerDefn();int fieldCount = featureDefn.GetFieldCount();Map<String, String> fieldMap = new HashMap<String, String>();for (int i = 0; i < fieldCount; i++) {FieldDefn fieldDefn = featureDefn.GetFieldDefn(i);// 得到属性字段类型int fieldType = fieldDefn.GetFieldType();String fieldTypeName = fieldDefn.GetFieldTypeName(fieldType);// 得到属性字段名称String fieldName = fieldDefn.GetName();fieldMap.put(fieldTypeName, fieldName);}//System.out.println(fieldMap);long featureCount = layer.GetFeatureCount();System.out.println("图层要素个数:" + featureCount);Feature feature2 = null;while ((feature2 = layer.GetNextFeature()) != null) {// System.out.println(feature2.GetGeometryRef().ExportToJson());//System.out.println(feature2.GetFieldAsString("Shape_Area") + "\t" + feature2.GetFieldAsString("省区"));}oDriver.delete();gdal.GDALDestroyDriverManager();}
参考链接
链接: Linux下安装GDAL(含docker部分)
链接: Java调用开源GDAL解析dxf成shp,再调用开源GeoTools解析shp文件
链接: Ubuntu基于Docker快速配置GDAL的Python、C++环境)
链接: docker pull osgeo/gdal:latest
链接: linux机器搭建java版gdal环境
链接: gdal容器化记录
链接: 【Linux】CentOS制作Java+GDAL环境镜像并部署运行SpringBoot项目