当前位置:   article > 正文

Win10+JAVA+GDAL配置指南_java.lang.unsatisfiedlinkerror: no gdalalljni in j

java.lang.unsatisfiedlinkerror: no gdalalljni in java.library.path

文章目录

 


前言

最近在做关于tif格式的淹没算法,记录一下。


 

一、Win10+JAVA+GDAL配置指南

二、使用步骤

1.Java环境安装就不提了,JDK和JRE自己安装好

2.下载gdal

下载地址:https://www.gisinternals.com/release.php

这里我选择的是1900-x64,自己看一下选取自己合适的。

问题1:Chrome浏览器点击无反应

我的解决办法:使用手机下载,哈哈哈哈哈哈哈哈

然后传到电脑上

3.开始配置

解压-找到bin目录-配置环境变量

新建Java项目,我建的是Dynamic webProject项目-----新建一个文件夹lib,找到我们解压的文件,我的目录

E:\release-1900-x64-gdal-3-2-0-mapserver-7-6-1\bin\gdal\java

把这两个复制粘贴到lib

把gdal.jar右键build path-add to build path(导包基本操作)

然后就可以编码了

package sad;
import org.gdal.gdal.*;
import org.gdal.gdalconst.gdalconstConstants;
import org.gdal.ogr.DataSource;
import org.gdal.ogr.ogr;

public class Hello {
    public static void main(String[] args) {
        //此处换成自己文件的位置的路径
        //readGDAL("E:\\xxxxxxx.tif");

        getElevationFromTif("C:\\xxxx.tif");
    }
    /**
     * 读取tif文件的相关信息
     * @param fileName
     */
    public static void readGDAL(String fileName) {
        gdal.AllRegister();
        //读取影像数据
        Dataset dataset = gdal.Open(fileName,gdalconstConstants.GA_ReadOnly);
        if(dataset == null){
            System.err.println("GDALOpen failed - "+gdal.GetLastErrorNo());
            System.err.println(gdal.GetLastErrorMsg());
            System.exit(1);
        }

        Driver driver = dataset.GetDriver();
        System.out.println("Driver:"+driver.getShortName()+"/"+driver.getLongName());

        //读取影像信息
        int xSize = dataset.getRasterXSize();
        int ySize = dataset.getRasterYSize();
        int bandCount = dataset.GetRasterCount();
        System.out.println("size is "+xSize+","+ySize+",光带数:"+bandCount);

        Band band = dataset.GetRasterBand(1);
        int type = band.GetRasterDataType();
        //type为1,代表的是Eight bit unsigned integer
        System.out.println(type);

        dataset.delete();
        gdal.GDALDestroyDriverManager();
    }

    /**
     * shp转换geojson
     * @param shpFileName
     * @param geojsonFileName
     */
    public static void shpToGeojson(String shpFileName,String geojsonFileName) {
        // 注册所有的驱动
        ogr.RegisterAll();
        // 为了支持中文路径,请添加下面这句代码  
        gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","YES");
        // 为了使属性表字段支持中文,请添加下面这句  
        gdal.SetConfigOption("SHAPE_ENCODING","");
        //shp文件所在的位置
        //String strVectorFile = "D:\\sichuan\\sichuanPointALL.shp";
        //打开数据
        DataSource ds = ogr.Open(shpFileName,0);
        if (ds == null)
        {
            System.out.println("打开文件失败!" );
            return;
        }
        System.out.println("打开文件成功!" );
        org.gdal.ogr.Driver dv = ogr.GetDriverByName("GeoJSON");
        if (dv == null)
        {
            System.out.println("打开驱动失败!" );
            return;
        }
        System.out.println("打开驱动成功!" );
        //输出geojson的位置及文件名
        //String geojsonFileName = "D:\\data\\sichuan.geojson";
        dv.CopyDataSource(ds, geojsonFileName);
        System.out.println("转换成功!");
    }
    /**
     * 获取每个点的高程值
     * @param fileName_tif
     */
    public static void getElevationFromTif(String fileName_tif) {
        gdal.AllRegister();
        Dataset hDataset = gdal.Open(fileName_tif, gdalconstConstants.GA_ReadOnly);
        if (hDataset == null)
        {
            System.err.println("GDALOpen failed - " + gdal.GetLastErrorNo());
            System.err.println(gdal.GetLastErrorMsg());

            System.exit(1);
        }

        Driver hDriver = hDataset.GetDriver();
        System.out.println("Driver: " + hDriver.getShortName() + "/" + hDriver.getLongName());
        int iXSize = hDataset.getRasterXSize();
        int iYSize = hDataset.getRasterYSize();
        System.out.println("Size is " + iXSize + ", " + iYSize);

        Band band = hDataset.GetRasterBand(1);
        //这里是DEM数据,所以声明一个int数组来存储,如果是其他数据类型,声明相应的类型即可
        int buf[] = new int[iXSize];    

        for(int i=0; i<50/*iYSize*/; i++)
        {
            band.ReadRaster(0, i, iXSize, 1, buf);    //读取一行数据

            // 下面是输出像元值,为了方便,我只输出了左上角 10×10的范围内的数据
            for(int j=0; j<50/*iXSize*/; j++){
                System.out.print(buf[j] + ", ");
            }

            System.out.println("\n");
        }
        hDataset.delete();
        // 可选
        gdal.GDALDestroyDriverManager();

    }


}
 

问题2:当你满怀信心,尝试代码的时候,出现error

Native library load failed.
java.lang.UnsatisfiedLinkError: no gdalalljni in java.library.path

说你这个东西不稳

解决办法:我们下载gdal文件解压后的bin目录所有dll类型文件拷贝到自己JAVA环境的jre目录下的bin目录下(关注一下自己的jre环境变量啊)

找到jre\bin,然后直接粘贴

最后把先前的gdal解压目录下的另一个dll也复制粘贴到jre\bin里面

打完收工

总结

第一次写这个文章,参考了https://blog.csdn.net/qq_42316200/article/details/103243960

https://blog.csdn.net/Sonsay/article/details/90210573

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/繁依Fanyi0/article/detail/119555
推荐阅读
相关标签
  

闽ICP备14008679号