windows和docker环境下springboot整合gdal3.x

链接: 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项目

猜你喜欢

转载自blog.csdn.net/qq_41604890/article/details/133686926