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