• 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包
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    在这里插入图片描述

    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"
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    测试代码

    链接: 官方gdal的java调用API

    写个springboot项目接口 打包上去测试即可

    引入依赖

    
            
            <dependency>
                <groupId>org.gdalgroupId>
                <artifactId>gdalartifactId>
                <version>3.7.0version>
            dependency>
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
     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();
    
        }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82
    • 83
    • 84
    • 85
    • 86
    • 87
    • 88
    • 89
    • 90
    • 91
    • 92
    • 93
    • 94
    • 95
    • 96
    • 97
    • 98
    • 99
    • 100
    • 101
    • 102
    • 103
    • 104
    • 105
    • 106

    参考链接

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

  • 相关阅读:
    【Codeforces】 CF587F Duff is Mad
    Java的关键字final
    MYSQL索引解析
    Linux/shell 判断设备文件(/dev)是否存在
    【Java】异常处理
    【黄啊码】什么是php-fpm?
    【C语言数据结构】图-邻接矩阵法
    【脚本】生成已划分好训练集、验证集、测试集的数据集对应的train.txt、val.txt、test.txt【包含图像的绝对地址】
    IO流(3)
    lightdb21.3-支持语句级hint
  • 原文地址:https://blog.csdn.net/qq_41604890/article/details/133686926