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

You may also like...