zoukankan      html  css  js  c++  java
  • Java使用GDAL

    在使用Java调用GDAL之前,先说明一下编译。在编译的时候,需要JRE、Ant和SWIG这三个东西,没有的先下载这两个东西,下载完之后,安装,ANT和SWIG直接解压就行,不用安装。接下来用记事本打开nmake.opt,找到第86行左右的地方,如下:

    # SWIG Java settings
    !IFNDEF JAVA_HOME
    JAVA_HOME = "C:\Program Files\Java\jdk1.6.0_26"
    !ENDIF
    !IFNDEF ANT_HOME
    ANT_HOME=F:\Work\GDAL\gdal_need\apache-ant-1.8.4
    !ENDIF
    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
    
    将上面的JAVA_HOME和ANT_HOME后面的路径修改为本地Java和Ant的路径,只要修改到主文件夹即可(就是有bin文件夹的那个文件夹),如果文件夹路径有空格的话,把路径用双引号括起来。然后把SWIG的目录也换成本机的目录。接下来就可以编译了。具体步如下:


    1、编译Java版本的GDAL:

    首先使用命令行,编译C++版本的GDAL,具体步骤参考博客:http://blog.csdn.net/liminlu0314/article/details/6937194,这里使用命令行编译。

    编译完成之后,使用cd命令切换到swig目录,然后执行编译,命令依次如下:

    #下面三句是编译C++版本的,其实只要第一句即可,后面两句是用来安装的C:\warmerda\bld
    nmake /f makefile.vc
    nmake /f makefile.vc install
    nmake /f makefile.vc devinstall
    
    #接下来是编译Java版本的GDAL
    cd swig
    nmake /f makefile.vc java
    正常情况下,执行完上面的,Java版本的GDAL应该就编译完成了。你会在swig\java目录中看到编译出来的一些文件,主要有下面几个文件:
    gdalconstjni.dll
    gdaljni.dll
    ogrjni.dll
    osrjni.dll
    gdal.jar
    如果有上面的文件的话,那就说明编译成功,如果没看,查看命令行编译的时候输出信息,根据输出信息排除错误重新生成。将上面五个文件以及编译GDAL的时候生成的gdal19.dll拷贝到一个新建的文件夹,用于后续的调用。

    2、使用Eclipse新建一个工程,名字叫GDALTest,然后在这个工程中新建一个类叫GDALTestApp完成。打开GDALTestApp.java,修改里面的内容为下面的内容,然后保存,如图1所示。


    图1 Eclipse界面

    import org.gdal.gdal.Dataset;
    import org.gdal.gdal.Driver;
    import org.gdal.gdal.gdal;
    import org.gdal.gdalconst.gdalconstConstants;
    
    public class GDALTestApp {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) 
    	{
    		String fileName_tif = "F:\\Data\\11NOV23034214-P2AS_R3C3-052581320010_03_P001.TIF";  
    		gdal.AllRegister();
    
    		Dataset hDataset = gdal.Open(fileName_tif, gdalconstConstants.GA_ReadOnly);
    		if (hDataset == null)
    		{
    			System.err.println("GDALOpen failed - " + gdal.GetLastErrorNo());
    			System.err.println(gdal.GetLastErrorMsg());
    
    			System.exit(1);
    		}
    
    		Driver hDriver = hDataset.GetDriver();
    		System.out.println("Driver: " + hDriver.getShortName() + "/" + hDriver.getLongName());
    
    		System.out.println("Size is " + hDataset.getRasterXSize() + ", "
    				+ hDataset.getRasterYSize());
    
    		hDataset.delete();
    		
    		// 可选
    		gdal.GDALDestroyDriverManager();
    	}
    }
    保存完之后,将刚才生成的那些dll和jar文件拷贝到工程所在文件夹中,然后在工程右键,选择Build Path->configure build path,弹出属性对话框,然后切换到libraries标签,点击Add Jars,选择gdal.jar和名字中有ini的dll文件,添加到lib中,如图2所示,然后确定。


    图2 Java配置界面

    接下来,点击运行,正常情况下,会在控制台输出类似下面的文字,第一行是图像的驱动格式,第二行是图像的大小。

    Driver: GTiff/GeoTIFF
    Size is 8499, 3403

    ……………………………………………………华丽的分割线…………………………………………………
    ……………………………………以下内容更新于2013年1月30日…………………………………………

    之前的例子没有显示怎么读取数据,今天补上,先上代码吧:

    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 GDALTestApp {
    
    	/**
    	 * @param args
    	 */
    	public static void main(String[] args) 
    	{
    		String fileName_tif = "E:\\Austra\\DEM\\srtm_65_18.tif";  
    		gdal.AllRegister();
    
    		Dataset hDataset = gdal.Open(fileName_tif, gdalconstConstants.GA_ReadOnly);
    		if (hDataset == null)
    		{
    			System.err.println("GDALOpen failed - " + gdal.GetLastErrorNo());
    			System.err.println(gdal.GetLastErrorMsg());
    
    			System.exit(1);
    		}
    
    		Driver hDriver = hDataset.GetDriver();
    		System.out.println("Driver: " + hDriver.getShortName() + "/" + hDriver.getLongName());
    		int iXSize = hDataset.getRasterXSize();
    		int iYSize = hDataset.getRasterYSize();
    		System.out.println("Size is " + iXSize + ", " + iYSize);
    
    		Band band = hDataset.GetRasterBand(1);
    		//这里是DEM数据,所以声明一个int数组来存储,如果是其他数据类型,声明相应的类型即可
    		int buf[] = new int[iXSize];	
    		
    		for(int i=0; i<10/*iYSize*/; i++)
    		{
    			band.ReadRaster(0, i, iXSize, 1, buf);	//读取一行数据
    			
    			// 下面是输出像元值,为了方便,我只输出了左上角 10×10的范围内的数据
    			for(int j=0; j<10/*iXSize*/; j++)
    				System.out.print(buf[j] + ", ");
    			System.out.println("\n");
    		}
    		hDataset.delete();
    		
    		// 可选
    		gdal.GDALDestroyDriverManager();
    	}
    }

    Java中,读取数据用的接口是ReadRaster,这个函数已经针对所有的数据类型进行了重载,所以读取某种类型的数据,只需要声明对应的类型即可。运行上面的程序,会输出下面的内容:

    Driver: GTiff/GeoTIFF
    Size is 6001, 6001
    64, 64, 64, 63, 62, 62, 64, 63, 61, 61, 
    61, 62, 63, 66, 64, 64, 63, 63, 62, 61, 
    62, 61, 63, 64, 65, 62, 63, 61, 63, 64, 
    64, 63, 63, 62, 63, 65, 64, 64, 62, 63, 
    64, 61, 63, 63, 63, 64, 65, 63, 62, 64, 
    64, 63, 62, 63, 62, 62, 63, 64, 64, 64, 
    64, 63, 63, 64, 65, 62, 61, 63, 62, 63, 
    62, 64, 63, 64, 63, 60, 62, 61, 62, 63, 
    62, 65, 63, 63, 62, 60, 64, 63, 61, 62, 
    63, 65, 64, 63, 62, 61, 64, 63, 60, 61, 

  • 相关阅读:
    CDN网络(二)之配置和优化CDN核心缓存软件--squid
    CDN网络(一)之典型的CND架构与HTTP协议的缓存控制
    http+mysql结合keepalived做热备
    网络存储(四)之ISCSI的进阶
    Nginx系列3之Nginx+tomcat
    Nginx系列2之Nginx+php
    Nginx系列1之部分模块详解
    网络存储(三)之ISCSI搭建的入门
    网络存储(二)之ISCSI原理
    Testing
  • 原文地址:https://www.cnblogs.com/xiaowangba/p/6313994.html
Copyright © 2011-2022 走看看