网上能找到的教程基本都是17年的了,最近项目需要用到GDAL 做数据转换,也是谷歌好久,这里记录一下自己踩的坑,也是给后来人一点提示,毕竟我的解决方案基本也是外网找到的,没有的话估计就不是我一上午的事情了…
首先讲一下下载GDAL ,无论是java\c\c++\python 都是这个网站下载。
http://www.gisinternals.com/release.php
下载有问题的话,这里我也上传了一份最新64位的。
https://download.csdn.net/download/weixin_43616450/12614966
需要注意:
下载的版本需要和你的java虚拟机位数相同,64为下载64位版本,32位下载32位。
假设你的jvm版本和我相同为64位,点击上图最新版64位进入下载页面
点击我框选的下载即可,具体文件旁边也有描述。
截至编写时间(2020年7月14日 17:19:26),最新版的GDAL 为1900版,官网上传时间为2020-04-19。
下载后会得到一个压缩包,解压到你所选文件目录。
这里我解压到了D盘
**
**
网上的教程基本上都是把bin目录下的dll复制到java运行时环境,实际上我没有成功过,并且个人觉得然并卵,还会把你的环境搞得乱七八糟(代码洁癖 )。
贴一张我搜到的教程
千万别这么干!因为干了你也找不到依赖。
至于还有说copy到sys32目录的。。。。
**
**
鼠标右键,打开这个批处理文件。
其实直接运行就是做环境变量配置的,但是理论上很难成功。所以还是一步步来。
注意我框出来的几步,按照提示设置环境变量为绝对路径
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"
注意前面的路径为你解压的目录,自行修改。
最后贴一个我的设置截图:
按照我的设置即可,和我的环境变量一样的话基本上就完成安装了,如果后续出现报错,请检查前两张图的名称和路径指向是否正确。
**
**
新建一个boot工程,将此目录下的两个文件分别拷贝到resource/lib 和项目根目录下。
注意: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