java : springboot 整合 GDAL做shp解析 (shp转geojson) 踩坑合集 2020-07

java : springboot 整合 GDAL 做shp解析 (shp转geojson) 踩坑合集 2020-07

网上能找到的教程基本都是17年的了,最近项目需要用到GDAL 做数据转换,也是谷歌好久,这里记录一下自己踩的坑,也是给后来人一点提示,毕竟我的解决方案基本也是外网找到的,没有的话估计就不是我一上午的事情了…

首先讲一下下载GDAL ,无论是java\c\c++\python 都是这个网站下载。
http://www.gisinternals.com/release.php

下载有问题的话,这里我也上传了一份最新64位的。
https://download.csdn.net/download/weixin_43616450/12614966
java : springboot 整合 GDAL做shp解析 (shp转geojson) 踩坑合集 2020-07_第1张图片
需要注意:
下载的版本需要和你的java虚拟机位数相同,64为下载64位版本,32位下载32位。

假设你的jvm版本和我相同为64位,点击上图最新版64位进入下载页面
java : springboot 整合 GDAL做shp解析 (shp转geojson) 踩坑合集 2020-07_第2张图片
点击我框选的下载即可,具体文件旁边也有描述。

截至编写时间(2020年7月14日 17:19:26),最新版的GDAL 为1900版,官网上传时间为2020-04-19。

下载后会得到一个压缩包,解压到你所选文件目录。
java : springboot 整合 GDAL做shp解析 (shp转geojson) 踩坑合集 2020-07_第3张图片
这里我解压到了D盘

**

注意:不要复制dll文件到JRE!!!

**
网上的教程基本上都是把bin目录下的dll复制到java运行时环境,实际上我没有成功过,并且个人觉得然并卵,还会把你的环境搞得乱七八糟(代码洁癖 )。

贴一张我搜到的教程
java : springboot 整合 GDAL做shp解析 (shp转geojson) 踩坑合集 2020-07_第4张图片
千万别这么干!因为干了你也找不到依赖。
至于还有说copy到sys32目录的。。。。

**

正确方法:配置环境变量

**
鼠标右键,打开这个批处理文件。
java : springboot 整合 GDAL做shp解析 (shp转geojson) 踩坑合集 2020-07_第5张图片
其实直接运行就是做环境变量配置的,但是理论上很难成功。所以还是一步步来。
java : springboot 整合 GDAL做shp解析 (shp转geojson) 踩坑合集 2020-07_第6张图片
注意我框出来的几步,按照提示设置环境变量为绝对路径

setx GDAL_DATA "C:\Program Files\GDAL\gdal-data"
setx GDAL_DRIVER_PATH "C:\Program Files\GDAL\gdalplugins"
setx PROJ_LIB "C:\Program Files\GDAL\projlib"

注意前面的路径为你解压的目录,自行修改。
最后贴一个我的设置截图:
java : springboot 整合 GDAL做shp解析 (shp转geojson) 踩坑合集 2020-07_第7张图片
java : springboot 整合 GDAL做shp解析 (shp转geojson) 踩坑合集 2020-07_第8张图片
java : springboot 整合 GDAL做shp解析 (shp转geojson) 踩坑合集 2020-07_第9张图片
按照我的设置即可,和我的环境变量一样的话基本上就完成安装了,如果后续出现报错,请检查前两张图的名称和路径指向是否正确。

**

在springboot项目中使用GDAL 做shp解析

**
新建一个boot工程,将此目录下的两个文件分别拷贝到resource/lib 和项目根目录下。
java : springboot 整合 GDAL做shp解析 (shp转geojson) 踩坑合集 2020-07_第10张图片java : springboot 整合 GDAL做shp解析 (shp转geojson) 踩坑合集 2020-07_第11张图片
注意:1500版本的这里大概是4个dll文件,都需要拷贝到项目根目录,否则会找不到依赖
路径贴一下:

D:\release-1900-x64-gdal-3-0-4-mapserver-7-4-3\bin\gdal\java

接下来需要在项目里引用本地jar依赖:
在pom中添加:

		<!--引入 GDAL -->
		<dependency>
			<groupId>org.GDAL</groupId>
			<artifactId>GDAL-core</artifactId>
			<version>2.0.0</version>
			<scope>system</scope>
			<systemPath>${project.basedir}/src/main/resources/lib/gdal.jar</systemPath>
		</dependency>

到这里项目引用就结束了,当然eclipse的话直接bulid path就ok

编写测试代码:

/**
 * @author Oct.ca
 * @version 1.0
 * @date 2020/7/14 9:59
 */
public class gdalUtils {
    public static void main(String[] args) {
        //注册驱动
        ogr.RegisterAll();// 为了支持中文路径,请添加下面这句代码
        gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES");
        // 設置属性表字段支持中文
        gdal.SetConfigOption("SHAPE_ENCODING", "");
        //shp文件所在的位置
        String strVectorFile = "C:\\Users\\SLDT\\Desktop\\test.shp";
        //打开数据
        DataSource ds = ogr.Open(strVectorFile, 0);
        if (ds == null) {
            System.out.println("打开文件失败!");
            return;
        }
        System.out.println("打开文件成功!");
        Driver dv = ogr.GetDriverByName("GeoJSON");
        if (dv == null) {
            System.out.println("打开驱动失败!");
            return;
        }
        System.out.println("打开驱动成功!");
        //输出geojson的位置及文件名
        dv.CopyDataSource(ds, "C:\\Users\\SLDT\\Desktop\\output\\2.json");
        System.out.println("转换成功!");
    }
}

至此运行代码就可以得到转换好的json文件了

如果报错:

Native library load failed.
java.lang.UnsatisfiedLinkError: no ogrjni in java.library.path
Exception in thread "main" java.lang.UnsatisfiedLinkError: RegisterAll
    at org.gdal.ogr.ogrJNI.RegisterAll(Native Method)
    at org.gdal.ogr.ogr.RegisterAll(ogr.java:115)
    at com.gdal.vector.ShapeFileWrite.main(ShapeFileWrite.java:20)  

原因:没有将上述dll放在工程根目录下面,路径如下

D:\release-1900-x64-gdal-3-0-4-mapserver-7-4-3\bin\gdal\java

另外一种:

Native library load failed.
java.lang.UnsatisfiedLinkError: D:\InspurWorkspace\GDALTest01\ogrjni.dll: Can't find dependent libraries
Exception in thread "main" java.lang.UnsatisfiedLinkError: RegisterAll
    at org.gdal.ogr.ogrJNI.RegisterAll(Native Method)
    at org.gdal.ogr.ogr.RegisterAll(ogr.java:115)
    at com.gdal.vector.ShapeFileWrite.main(ShapeFileWrite.java:20)  

原因:缺少依赖,环境变量没有设置好导致的,去仔细翻看环境变量的设置,仔细比对指向路径。

都拷贝了,环境变量也确定没问题?
恭喜,重启下idea即可,原因和设置环境变量以后java -version 需要重启cmd一样。

至此教程就结束了,如果有没有描述清楚,或者其他问题请留言,看到后我会回复的。

贴一个最后解决我的问题的链接:
https://gis.stackexchange.com/questions/326968/ogr2ogr-error-1-proj-pj-obj-create-cannot-find-proj-db

你可能感兴趣的:(GIS编程,gdal,GIS,java,spring,boot,GIS,GIS编程,图形图象,图形处理类,源码,国内外gis)