基於GDAL庫,讀取.grd文件(以海洋地形數據為例)Java版


技術背景

  海洋地形數據主要是通過美國全球地形起伏數據(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】


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM