在使用Java調用GDAL之前,先說明一下編譯。在編譯的時候,需要JRE、Ant和SWIG這三個東西,沒有的先下載這兩個東西,下載完之後,安裝,ANT和SWIG直接解壓就行,不用安裝。接下來用記事本開啟nmake.opt,找到第86行左右的地方,如下:
# SWIG Java settings!IFNDEF JAVA_HOMEJAVA_HOME = "C:\Program Files\Java\jdk1.6.0_26"!ENDIF!IFNDEF ANT_HOMEANT_HOME=F:\Work\GDAL\gdal_need\apache-ant-1.8.4!ENDIFJAVADOC=$(JAVA_HOME)\bin\javadocJAVAC=$(JAVA_HOME)\bin\javacJAVA=$(JAVA_HOME)\bin\javaJAR=$(JAVA_HOME)\bin\jarJAVA_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\bldnmake /f makefile.vcnmake /f makefile.vc installnmake /f makefile.vc devinstall#接下來是編譯Java版本的GDALcd swignmake /f makefile.vc java
正常情況下,執行完上面的,Java版本的GDAL應該就編譯完成了。你會在swig\java目錄中看到編譯出來的一些檔案,主要有下面幾個檔案:
gdalconstjni.dllgdaljni.dllogrjni.dllosrjni.dllgdal.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/GeoTIFFSize 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/GeoTIFFSize is 6001, 600164, 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,