链接: 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/bash
cd /tmp/sll/
-- 把jar复制进来
java -jar 启动 jar包
docker-compose启动
gdalservice:
image: "osgeo/gdal:latest"
container_name: gdalservice
volumes:
- ./gdalservice/data:/data
- /opt/docker-project/gdalservice/data/geo-api-0.0.1-SNAPSHOT.jar:/app/geo-api-0.0.1-SNAPSHOT.jar
environment:
- SOME_ENV_VAR=value
command: /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项目