windows 下安装gdal 项目运行包含gis

7 篇文章 0 订阅
1.相关环境安装与文件下载:

https://blog.csdn.net/xlp789/article/details/126246154

2.复制gdal 安装文件下 dll文件
2.1:
release-1911-x64-gdal-3-2-1-mapserver-7-6-2\bin下 *.dll文件复制到jdk/bin 目录下;
2.2:
复制release-1911-x64-gdal-3-2-1-mapserver-7-6-2\bin\gdal\java下gdalalljni.dll 到jdk/bin 目录下;
2.3:
复制release-1911-x64-gdal-3-2-1-mapserver-7-6-2\bin\gdal\java下gdalalljni.dll 文件到项目 resource:gdal/linux/libgdaljni.so 中 用于在idea项目中运行时加载(如果是Linux环境时同理)
2.4 maven 依赖引入:
        <dependency>
            <groupId>org.gdal</groupId>
            <artifactId>gdal</artifactId>
            <version>2.2.0</version>
        </dependency>
3.复制以下代码到项目中,确认能够正常加载gdalalljni文件即可(linux环境下gdalalljni文件是不一样的),启动时调用init()方法即可 就可使用gdal啦:
package com.hclight.nd.common;

import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import cn.hutool.core.util.ClassUtil;
import org.apache.poi.util.StringUtil;
import org.gdal.gdal.gdal;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 动态库加载类:从资源加载动态库
 */
public class GdalLoader {

    private static final Logger log = LoggerFactory.getLogger(GdalLoader.class);

    public static void init(){
        log.info("---LibraryUtil--gdal载入动态库");
        try {
            //根据系统环境加载资源
            String systemType = System.getProperty("os.name");
            String file="";

            boolean isWin= systemType.toLowerCase().contains("win");
            if(isWin) {
                file=ClassUtil.getClassPath()+"gdal/win/gdalalljni.dll"; //win下jni路径
            }
            else {
                file=ClassUtil.getClassPath()+"gdal/linux/libgdaljni.so";//linux下jni路径
            }
            //从资源文件加载动态库
            loadFromResource(file);
            //注册gdal驱动
            gdal.AllRegister();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     * 从资源文件加载类
     * * @param clazz jar中类
     *
     * @param file resources目录下文件全路径:/gdal/win32/gdalalljni.dll
     */
    private static void loadFromResource(String file) throws IOException {
        try {
            //获取系统路径
            String[] libraryPaths = initializePath("java.library.path");
            log.info("---LibraryUtil-----java.library.path={}", StringUtil.join(";", libraryPaths));
            if (libraryPaths == null || libraryPaths.length == 0) {
                log.info("---LibraryUtil--请设置环境变量java.library.path");
                return;
            }
            String nativeTempDir = libraryPaths[0];

            int sepIndex = file.lastIndexOf(File.separator);
            if (sepIndex == -1) {
                sepIndex = file.lastIndexOf("/");
            }
            String fileName = file.substring(sepIndex + 1);

            log.info("---LibraryUtil--从环境变量{}加载{}", nativeTempDir, fileName);
            //系统库不存在,就从资源文件复制
            File extractedLibFile = new File(nativeTempDir + File.separator + fileName);
            if (!extractedLibFile.exists()) {
                //file resources目录下文件全路径:/gdal/windows/gdalalljni.dll
                InputStream in = GdalLoader.class.getResourceAsStream(file);
                if (in == null) {
                    log.info("---LibraryUtil--资源文件不存在{}", file);
                    throw new FileNotFoundException(file);
                }
                saveFile(in, extractedLibFile);
                //保存文件到java.library.path
                log.info("---LibraryUtil--成功保存文件{}到{}", fileName, extractedLibFile.getPath());
            }
            //注意采用loadLibrary加载时mapLibraryName方法会根据系统补全名称
            int startIndex = fileName.startsWith("lib") ? 3 : 0;
            String libName = fileName.substring(startIndex, fileName.indexOf("."));
            String mapLibraryName = System.mapLibraryName(libName);
            log.info("---LibraryUtil--mapLibraryName={}", mapLibraryName);
            //输出调试信息
            log.info("---LibraryUtil--系统加载动态库{}开始", libName);
            System.loadLibrary(libName);
            log.info("---LibraryUtil--系统加载动态库{}完成", libName);
        } catch (Exception ex) {
            log.error(ex.getMessage());
        }
    }

    private static String[] initializePath(String propname) {
        String ldpath = System.getProperty(propname, "");
        String ps = File.pathSeparator;
        int ldlen = ldpath.length();
        int i, j, n;
        // Count the separators in the path
        i = ldpath.indexOf(ps);
        n = 0;
        while (i >= 0) {
            n++;
            i = ldpath.indexOf(ps, i + 1);
        }

        // allocate the array of paths - n :'s = n + 1 path elements
        String[] paths = new String[n + 1];

        // Fill the array with paths from the ldpath
        n = i = 0;
        j = ldpath.indexOf(ps);
        while (j >= 0) {
            if (j - i > 0) {
                paths[n++] = ldpath.substring(i, j);
            } else if (j - i == 0) {
                paths[n++] = ".";
            }
            i = j + 1;
            j = ldpath.indexOf(ps, i);
        }
        paths[n] = ldpath.substring(i, ldlen);
        return paths;
    }

    private static void saveFile(InputStream in, File extractedLibFile) throws IOException {
        BufferedInputStream reader = null;
        FileOutputStream writer = null;
        try {
            //文件不存在创建文件,否则获取流报异常
            createFile(extractedLibFile);

            reader = new BufferedInputStream(in);
            writer = new FileOutputStream(extractedLibFile);

            byte[] buffer = new byte[1024];

            while (reader.read(buffer) > 0) {
                writer.write(buffer);
                buffer = new byte[1024];
            }
        } catch (IOException e) {
            throw e;
        } finally {
            if (in != null) {
                in.close();
            }
            if (writer != null) {
                writer.close();
            }
        }
    }

    /**
     * 文件不存在创建文件,包括上级目录
     */
    private static void createFile(File destFile) throws IOException {
        File pfile = destFile.getParentFile();
        if (!pfile.exists()) {
            pfile.mkdirs();
        }
        if (!destFile.exists()) {
            destFile.createNewFile();
        }
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值