Java+GDAL:shp转换geojson
目录
shp转GeoJson有很多种方式,包括一些网站也提供了在线转换的功能,但如果shp文件比较大,网站在线转换就行不通了,需要用软件来进行转换工作,GDAL就是一个不错的选择。
GDAL(Geospatial Data Abstraction Library)是一个开源栅格空间数据转换库。它利用抽象数据模型来表达所支持的各种文件格式。它还有一系列命令行工具来进行数据转换和处理。
GDAL使用C++开发,因此要在Java环境下使用GDAL库,要用JNI(Java跨平台调用的一种方式)的方法调用dll库。所以,我们可以下载GDAL的源码,依照官网教程,通过Visual Studio编译出可用dll。但是最简单的做法就是使用已经编译生成好的符合JNI标准的动态dll库和jar包了,推荐这个网址:http://www.gisinternals.com/sdk/,下载合适的文件。
例如我下载的是release-1500-x64-gdal-2-2-3-mapserver-7-0-7,里面包含了编译好的GDAL以及jar包。
下面以Eclipse的配置为例,示范如何在Java环境中调用GDAL库(此时假设所有GDAL的dll都已经编译好,或是从上面写的网址下载下来了):
1.将下载下来的压缩包解压至合适位置,内容列表如下:
2. 打开Eclipse,新建一个普通的java工程。
3.将下载下来的压缩包bin/gdal/java目录下的gdal.jar、gdalconstjni.dll、gdaljni.dll、ogrjni.dll、osrjni.dll文件拷贝到刚才新建的java工程目录下,如下图,和src目录同级。
4.右键gdal.jar,在弹出的菜单中选择Build Path -> Add to Build Path,将gdal.jar引入到工程环境中
这时候写代码,Eclipse编译不会有错误,但是运行程序时会报错,于是还要进行下一步:
5.将下载下来的压缩包bin目录下的所有dll文件(这些文件是GDAL相关的dll文件,是GDAL_Java的dll需要调用的)拷贝至正确的位置,有很多地方可选:
1)java工程目录下
2){JAVA_HOME}jre/bin,我采用的是这种做法,将这些dll拷贝至jdk安装目录下的jre下的bin目录下
3)网上有人说拷贝至{windir}system32目录下,此方法没有检验过
6. 新建一个Test类来执行转换,代码如下:
package gdal;
import org.gdal.*;
import org.gdal.ogr.DataSource;
import org.gdal.ogr.Driver;
import org.gdal.ogr.ogr;
import org.gdal.gdal.*;
public class Test {
public static void main(String[] args) {
// 注册所有的驱动
ogr.RegisterAll();
// 为了支持中文路径,请添加下面这句代码
gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","YES");
// 为了使属性表字段支持中文,请添加下面这句
gdal.SetConfigOption("SHAPE_ENCODING","");
//shp文件所在的位置
String strVectorFile = "D:\\sichuan\\sichuanPointALL.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, "D:\\data\\sichuan.geojson");
System.out.println("转换成功!" );
}
}
如果shp文件较大转换的时间可能较长,需要耐心等待。
ps,运行java工程时可能的报错:
1. 工程中只引用了gdal.jar包,没有任何gdal_java的dll
Native library load failed.
java.lang.UnsatisfiedLinkError: no gdaljni in java.library.path
Exception in thread “main” java.lang.UnsatisfiedLinkError: org.gdal.gdal.gdalJNI.AllRegister()V
at org.gdal.gdal.gdalJNI.AllRegister(Native Method)
at org.gdal.gdal.gdal.AllRegister(gdal.java:499)
at cn.edu.pku.extremetool.Main.main(Main.java:21)
2. 有引用了gdal.jar包 ,也将releasegdal_java的dll文件拷贝到正确位置,但是缺少GDAL本身的dll(即release-1600-gdal/bin下的众多dll文件)
Native library load failed.
java.lang.UnsatisfiedLinkError: D:WorkSpaceeclipseWPMJunoExtremeToolgdaljni.dll: Can’t find dependent libraries
Exception in thread “main” java.lang.UnsatisfiedLinkError: org.gdal.gdal.gdalJNI.AllRegister()V
at org.gdal.gdal.gdalJNI.AllRegister(Native Method)
at org.gdal.gdal.gdal.AllRegister(gdal.java:499)
at cn.edu.pku.extremetool.Main.main(Main.java:21)
【参考】
GDAL项目官方网站:http://www.gdal.org
GDAL在Java中的使用:http://trac.osgeo.org/gdal/wiki/GdalOgrInJava
转载自:https://blog.csdn.net/qq_37796475/article/details/80410140