技術背景
海洋地形數據主要是通過美國全球地形起伏數據(GMT)獲得,數據格式為grd(GSBG)二進制數據,打開軟件通過是Surfer軟件,surfer軟件可進行數據的編輯處理,以及進一步的可視化表達等功能操作;由於Surfer軟件不支持二次開發,沒有提供相應的SDK供開發者進行使用,所以這一切只能通過相應類似的技術進行實現,首先,數據的讀取,如何通過編程實現數據的讀取操作呢?這里就要說一下GIS軟件所使用的一個開源庫-GDAL,GDAL庫的具體解釋資料,請查閱官方網站【https://www.gdal.org/index.html】,由於后期要進行數據入庫的步驟,所以本文提供的是一種采用Java語言進行讀取的方法,前面的GDAL庫的編譯方法請參考博客1【GDAL從源碼到JAVA應用】,下面具體講一下環境配置。
首先講GDAL庫文件進行整理,將jdal.jar、gdalalljni.dll、gdalalljni.exp、gdalalljni.lib四個文件拷到bin文件夾下,然后將bin文件夾拷貝到任一位置並更名為gdal,然后將該文件夾,設置入系統環境變量path內,這一步完成即成功了一半;然后打開Eclipse,創建項目gdalDemo,右擊項目選擇“構建路徑”(Build Path),然后選擇“configure Build Path”,再選擇“Java Build Path”,選擇“庫”,點擊“添加額外的JAR文件”,具體如下圖所示
添加完成以后,創建Java類,開始編輯讀取代碼,話不多說,代碼奉上
1 package gdalDemo; 2 3 import org.gdal.gdal.Band; 4 import org.gdal.gdal.Dataset; 5 import org.gdal.gdal.Driver; 6 import org.gdal.gdal.gdal; 7 import org.gdal.gdalconst.gdalconstConstants; 8 import org.gdal.ogr.ogr; 9 10 public class gealTest { 11 12 public static void main(String[] args) { 13 14 // 注冊所有的驅動 15 ogr.RegisterAll(); 16 // 為了支持中文路徑,請添加下面這句代碼 17 gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8","YES"); 18 // 為了使屬性表字段支持中文,請添加下面這句 19 gdal.SetConfigOption("SHAPE_ENCODING",""); 20 21 String fileName_tif = "E:/test/E135N30_sf.grd"; 22 23 //使用只讀方式打開圖像 24 Dataset hDataset = gdal.Open(fileName_tif, gdalconstConstants.GA_ReadOnly); 25 if (hDataset == null) 26 { 27 System.err.println("GDALOpen failed - " + gdal.GetLastErrorNo()); 28 System.err.println(gdal.GetLastErrorMsg()); 29 System.exit(1); 30 } 31 32 //輸出圖像的格式信息 33 Driver hDriver = hDataset.GetDriver(); 34 System.out.println("Driver: " + hDriver.getShortName() + "/" + hDriver.getLongName()); 35 36 //輸出圖像的大小和波段個數 37 int iXSize = hDataset.getRasterXSize(); //列數 38 int iYSize = hDataset.getRasterYSize(); //行數 39 int iBandCount = hDataset.getRasterCount(); //元素(因素)數 40 System.out.println("Size is " + iYSize + " x " + iXSize + "\n" + "BandCount: " + iBandCount); 41 42 Band band = hDataset.GetRasterBand(1); 43 int itype = band.GetRasterDataType(); 44 System.out.println("dataType: "+itype); 45 46 //輸出圖像的坐標和分辨率信息 47 double [] adfGeoTransform = new double[6]; 48 hDataset.GetGeoTransform( adfGeoTransform); 49 System.out.printf( "Origin =(%.6f,%.6f)\n",adfGeoTransform[0], adfGeoTransform[3]); 50 System.out.printf( "PixelSize = (%.6f,%.6f)\n",adfGeoTransform[1], adfGeoTransform[5]); 51 52 //獲取該波段的最大值最小值,如果獲取失敗,則進行統計 53 Double [] bGotMin = new Double [2]; 54 Double [] bGotMax = new Double [2]; 55 band.GetMinimum( bGotMin); 56 band.GetMaximum( bGotMax); 57 if(bGotMin[0] != null && bGotMax[0] != null){ 58 System.out.printf( "Z value Min=%.3f,Max=%.3f\n", bGotMin[0], bGotMax[0]); 59 } 60 61 System.out.println("\nexample Data(10x10):"); 62 //讀取一行數據 63 float buf[] = new float[iXSize]; 64 65 for(int i=0; i<10/*iYSize*/; i++) 66 { 67 band.ReadRaster(0, i, iXSize, 1, buf); //讀取一行數據 68 69 // 下面是輸出像元值,為了方便,我只輸出了左上角 10×10的范圍內的數據 70 for(int j=0; j<10/*iXSize*/; j++) 71 System.out.print(buf[j] + ", "); 72 System.out.println("\n"); 73 } 74 75 hDataset.delete(); 76 77 // 關閉驅動 78 gdal.GDALDestroyDriverManager(); 79 } 80 81 }
讀取結果
至此,文件讀取完成。
致謝
感謝李民錄老師的指導,以及相關技術博主的技術分享,謝謝!
參考博客
1、GDAL從源碼到JAVA應用【https://blog.csdn.net/lw19910913/article/details/77746164】
2、Build Instructions for GDAL/OGR In Java【http://trac.osgeo.org/gdal/wiki/GdalOgrInJavaBuildInstructions】
3、GDAL-JavaAPI【https://gdal.org/java/overview-summary.html】
4、Java使用GDAL【https://blog.csdn.net/liminlu0314/article/details/8395622】