一、環境准備
Java開發環境下使用gdal.jar,必須要有對應操作系統的動態庫才可以(windows是dll庫,linux是so庫),因為gdal是c++的源碼編寫的,底層實現都是c++語言,因此gdal.jar實際上最主要的是其中的native方法。
因此我們拿到gdal源碼之后,需要通過編譯Java庫,來獲取自己需要的動態庫和jar,
好在Windows的jar庫已經有組織幫我們編譯好了,具體見https://www.gisinternals.com/
Linux下的需要我們自己編譯,后續我會專門發一篇實際操作的文章,並親測可用后,分享出來。
二、gdal讀取tiff
gdal讀取柵格tiff,主要有以下幾步,詳見代碼如下:
package org.java.gdal.test;
import org.apache.commons.lang3.StringUtils;
import org.gdal.gdal.Dataset;
import org.gdal.gdal.ProgressCallback;
import org.gdal.gdal.gdal;
import org.gdal.gdalconst.gdalconstConstants;
import java.util.Arrays;
public class GdalReadTifTest {
/**
* 必須注冊
*/
static{
gdal.AllRegister();
}
private static final String FILE_PATH = "F:\\Gis開發\\數據\\raster\\tiff\\world.tif";
public static void main(String[] args) {
readTif(FILE_PATH);
}
private static void readTif(String file){
Dataset dataset = gdal.Open(file, gdalconstConstants.GA_ReadOnly);
//獲取到六參數數組
double[] ori_transform = dataset.GetGeoTransform();
//最小x
double minX = ori_transform[0];
//x方向分辨率
double resoutionX = ori_transform[1];
//x方向旋轉角度
double angleX = ori_transform[2];
//最大y
double maxY = ori_transform[3];
//Y方向旋轉角度
double angleY = ori_transform[4];
//y方向分辨率
double resoutionY = ori_transform[5];
//x方向的像素數
int pixelX = dataset.getRasterXSize();
//y方向像素
int pixelY = dataset.getRasterYSize();
}
}
三、gdal生成金字塔
如果是安裝版本的gdal工具,則可以使用gdaladdo.exe工具類實現,具體詳見:https://www.osgeo.cn/gdal/programs/gdaladdo.html。
Java代碼操作主要是這個方法:
public int BuildOverviews(String resampling, int[] overviewlist, ProgressCallback callback) { return gdalJNI.Dataset_BuildOverviews__SWIG_0(swigCPtr, this, resampling, overviewlist, callback); }
-
其中參數resampling 重采樣方法
nearest 臨近采樣
average 計算所有非NODATA貢獻像素的平均值。從gdal3.1開始,這是一個加權平均值,適當地考慮了源像素的權重對目標像素的影響
bilinear 應用雙線性卷積核。
-
參數overviewlist
Int[]{2,4,6,8,16} 比如2就是基礎層分辨率的1/2,以此類推。
-
參數ProgressCallback
生成金字塔的回調函數,一般重寫其中的run()方法,用來處理進度、
具體操作代碼見
package org.java.gdal.test; import org.apache.commons.lang3.StringUtils; import org.gdal.gdal.Dataset; import org.gdal.gdal.ProgressCallback; import org.gdal.gdal.gdal; import org.gdal.gdalconst.gdalconstConstants; import java.util.Arrays; public class GdalReadTifTest { /** * 必須注冊 */ static{ gdal.AllRegister(); } private static final String FILE_PATH_1 = "F:\\Gis開發\\數據\\raster\\xian18.tif"; public static void main(String[] args) { buildOverview(FILE_PATH_1); } private static void buildOverview(String file){ Dataset dataset = gdal.Open(file, gdalconstConstants.GA_ReadOnly); //調用構建金字塔接口 dataset.BuildOverviews("nearest",new int[]{2,4,6,8,16},new buildOverViewCallBack()); } //進度回調 static class buildOverViewCallBack extends ProgressCallback{ @Override public int run(double dfComplete, String pszMessage) { if (StringUtils.isNotBlank(pszMessage)){ System.out.println(pszMessage); } System.out.println(String.format("%.2f",dfComplete*100)); return 1; } } }
好了,以上就是gdal的簡單操作,后面還會持續研究java的gdal版本的api操作。