Gdal—Java 簡單API操作


一、環境准備

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操作。

 

 


免責聲明!

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



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