GDAL从源码到JAVA应用(Windows环境)

GDAL从源码到JAVA应用(Windows环境)

Java中的GDAL/OGR

 

本文讲述内容提纲:

1、 GDAL/OGR项目相关介绍

2、 GDAL/OGR 在C++环境中的编译(VS2013环境)

3、 GDAL/OGR 在Java环境中的编译

4、 Java版本的GDAL/OGR的环境配置说明(绝对详细)

5、 应用案例

6、 注:与百度上的其他相关GDAL/OGR应用的差异说明

7、 其他用到JAVA版本的GDAL/OGR项目:ImageI/O-Ext、JAI-EXT

 

1、GDAL/OGR项目相关介绍

GDAL项目拥有基于SWIG生成的绑定JAVA语言的GDAL/OGR包,即JAVA版的GDAL/OGR。JAVA不支持GDAL-1.5.0、1.6.0版本,从GDAL-1.7.0版本开始支持。一般情况下,JAVA版本的GDAL/OGR大多数的类、方法与C++中的类方法的命名一致。

由于JAVA垃圾回收机制是基于脱离于main线程的一个独立线程进行回收,即利用另一个线程进行回收,因此,有必要配制GDAL使其支持多线程,即使你不在其他JAVA线程中使用GDAL API也需要配置一下。

支持JAVA最小版本为JAVA 1.4。

2、GDAL/OGR 在C++环境中的编译(VS2013环境)

2.1、下载GDAL/OGR源代码

链接: http://trac.osgeo.org/gdal/wiki/DownloadSource

 

2.2、C++编译

本文基于Visual Studio2013编译环境利用命令提示符 进行编译。在windows下编译首先在命令行中输入并运行vcvars32.bat脚本设置GDAL的C++编译环境(vcvars32.bat在vs2013编译器中)。具体操作如下:

在Windows中,命令行程序为cmd.exe,通过命令提示符cd将操作路径转换到vs2013的如下路径:

<VisualStudio 2013 path>\VC\bin

运行 vcvars32.bat

 

注:以上操作环境是32 bit
环境,如果要编译64bit GDAL,需要在vcvars32.bat脚本中最后一行添加如下命令:

call “<VisualStudio 2013 path>\VC\vcvarsall.bat” amd64

<Visual Studio 2013 path>
为你自己安装vs的物理路径,注意将它替换。)

 

以上环境设置成功之后,我们可以cd到GDAL根目录下,并且输入如下命令:(假如GDAL的根目录C:\GDAL)

C:\GDAL>nmake /f makefile.vc

 

以下命令操作可以忽略:

 

C:\GDAL>nmake /f makefile.vc install

 

C:\GDAL>nmake /f makefile.vc devinstall

 

3、GDAL/OGR 在Java环境中的编译

http://trac.osgeo.org/gdal/wiki/GdalOgrInJavaBuildInstructions

 

3.1、安装SWIG

http://www.swig.org/download.html

下载并解压之后,存放在自己计算机的任意路径下即可,不需要编译。

注:GDAL/OGR的JAVA版本绑定操作对SWIG的版本较为敏感,SWIG-1.3.39适合于GDAL/OGR-1.8.0。不过,博主在使用最新的swig-3.0.12和GDAL-2.2.1进行编译的时候,没有任何错误,且运行正常。你也可以自己尝试最新版本。

3.2、安装最新版本的JAVA SE

http://www.oracle.com/technetwork/java/javase/downloads/index.html

下载最新的JDK版本即可,仅仅runtime即可,即下载 JAVA SE(standard edition)即可。

3.3、安装Apache Ant

http://ant.apache.org/bindownload.cgi

下载并解压之后,存放在自己计算机的任意路径下即可,不需要编译。

3.4、配置GDAL

在下载的GDAL源代码文件夹中,修改如下文件 <gdal-dir>\nmake.opt,保证SWIG, JAVA 和ANT的相关定义被合理设置。具体设置如下:(供参考,相关路径指令要保证与自己的物理路径一致。)

JAVA_HOME = “C:\Program Files\Java\jdk1.6.0_23”

JAVADOC=$(JAVA_HOME)/bin/javadoc

JAVAC=$(JAVA_HOME)/bin/javac

JAVA=$(JAVA_HOME)/bin/java

JAR=$(JAVA_HOME)/bin/jar

JAVA_INCLUDE=-I$(JAVA_HOME)\include -I$(JAVA_HOME)\include\win32

 

ANT_HOME=C:\apache-ant-1.8.2

 

SWIG=C:\OSGeo4W\apps\swigwin\swig.exe

3.5、编译JAVA版本GDAL/OGR

这一步将运行SWIG程序生成GDAL/OGR的java版本。

cd <GDAL path>\swig

nmake /f makefile.vc java

 

生成的结果中,在gdal/swig/java文件夹下,有如下文件:

gdal.jar, gdalconstjni.dll, gdaljni.dll,
ogrjni.dll and osrjni.dll

 

以上四个jni的dll都为本地库文件,与<gdal-dir>文件夹下的gdal202.dll(202为版本号,不同版本,该数字也不同。)文件一起单独放在自己新建的文件夹下,以供java调用。

gdal.jar应该位于class path路径下,作为依赖库使用。

4、Java版本的GDAL/OGR的使用环境搭建说明(绝对详细)

经过JAVA编译后,需要的dll文件有五个:gdalconstjni.dll, gdaljni.dll,
ogrjni.dll, osrjni.dll and gdal202.dll。这5个文件均为GDAL/OGR的本地库,供JAVA调用。

JAVA编译后的文件还有一个jar,gdal.jar文件。

如何应用java版的gdal/ogr呢?请看如下:(此处有一处内容有别于目前百度到的所有内容,后面会强调。)

1、 在java项目下新建一个lib文件夹,将5个dll文件copy andpaste到该文件夹下;

2、 将gdal.jar通过Java buildpath导入到项目依赖的libraries下;(以下较为关键哦,否则gdal.jar的类寻找不到本地库。)同时,展开gdal.jar,设置Native library location位置为该项目(因为5个dll路径在该项目下)。具体位置看如下截屏,不详细说:

 

5、应用案例

所有GDAL/OGR环境搭建完成之后,可以运行一个example,用以测试环境搭建是否成功。具体如下:

新建项目,创建HelloGDAL类,copy如下代码并run,如果没有提示任何错误,说明安装成功。

import org.gdal.gdal.Band;

import org.gdal.gdal.Dataset;

import org.gdal.gdal.Driver;

import org.gdal.gdal.gdal;

import org.gdal.gdalconst.gdalconstConstants;

public class HelloGDAL {

         public HelloGDAL(){

                  // TODOAuto-generated constructor stub

         }

         public staticvoid main(String[] args) {

                  // TODOAuto-generated method stub

                  gdal.AllRegister();

                  System.out.println(gdal.GetDriverCount());

        String fileName= “E:\\example.tif”;

        // 读取影像数据

        Dataset dataset= gdal.Open(fileName, gdalconstConstants.GA_ReadOnly);

        if (dataset == null){

            System.err.println(“GDALOpenfailed – ” +
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 ySzie= dataset.getRasterYSize();

        int nBandCount= dataset.getRasterCount();

        System.out.println(“Sizeis ” + xSize + “, ” + ySzie + “, ” + nBandCount);

        Band band= dataset.GetRasterBand(1);

        int type= band.GetRasterDataType();

        // type为1,代表的是Eightbit unsigned integer

        System.out.println(type);

        dataset.delete();

        gdal.GDALDestroyDriverManager();

         }

}

 

6、注:与百度中的相关GDAL/OGR应用的帖子差异说明

在研究GDAL过程中发现,通过百度搜索引擎找到的一部分帖子的内容是直接通过网站下载已经编译好的GDAL,然后配置到java项目中。需要步骤较为繁琐,其实关键的操作,就是gdal202.dll文件所在的文件夹下面的其他所有dll文件都要和gdal202.dll文件保持在一个路径下。

 

GDAL已经编译好的网站:

http://demo.geo-solutions.it/share/github/imageio-ext/releases/1.1.X/1.1.16/native/gdal/

7、其他用到JAVA版本的GDAL/OGR项目:Image I/O-Ext、JAI-EXT

这里只是简单介绍一下Image I/O-Ext,该项目的核心是gdalframework,这个gdalframework充分利用了由SWIG生成的JAVA版GDAL/OGR,提供更多数据格式的支持。

(注意:gdalframework不要安装最新发布的GDAL,尤其GDAL-2.X以上的。为啥呢?因为2.x版本的GDAL是将GDAL和OGR进一步紧紧的整合到一起,而2.x之前的版本,GDAL和OGR相当于一个独立的个体,联系不紧密。)

 

转载自:https://blog.csdn.net/lw19910913/article/details/77746164

You may also like...