GDAL根据Shape文件切图(java)

9 篇文章 5 订阅

目地

用Java实现类似QGIS中【按掩膜图层裁剪栅格】的功能。
其实QGIS本身调用的就是gdalwarp.exe。

官方文档:https://gdal.org/programs/gdalwarp.html#gdalwarp

gdalwarp [--help-general] [--formats]
    [-s_srs srs_def] [-t_srs srs_def] [-ct string] [-to "NAME=VALUE"]* [-novshiftgrid]
    [-order n | -tps | -rpc | -geoloc] [-et err_threshold]
    [-refine_gcps tolerance [minimum_gcps]]
    [-te xmin ymin xmax ymax] [-te_srs srs_def]
    [-tr xres yres] [-tap] [-ts width height]
    [-ovr level|AUTO|AUTO-n|NONE] [-wo "NAME=VALUE"] [-ot Byte/Int16/...] [-wt Byte/Int16]
    [-srcnodata "value [value...]"] [-dstnodata "value [value...]"]
    [-srcalpha|-nosrcalpha] [-dstalpha]
    [-r resampling_method] [-wm memory_in_mb] [-multi] [-q]
    [-cutline datasource] [-cl layer] [-cwhere expression]
    [-csql statement] [-cblend dist_in_pixels] [-crop_to_cutline]
    [-if format]* [-of format] [-co "NAME=VALUE"]* [-overwrite]
    [-nomd] [-cvmd meta_conflict_value] [-setci] [-oo NAME=VALUE]*
    [-doo NAME=VALUE]*
    srcfile* dstfile
参数意义意义
-s_srs原坐标系统+proj=longlat +datum=WGS84 +no_defs
-t_srs目标坐标系统+proj=tmerc +lat_0=0 +lon_0=111 +k=1 +x_0=500000 +y_0=0 +a=6378140 +b=6356755.288157528 +units=m +no_defs
-to变换选项暂时未知
-order n变换多项式顺序 1-3
-tps强制基于已知控制点使用样条函数进行变换只需输入设定即可
-rpc强制使用rpc模型只需输入设定即可
-geoloc强制使用元数据中的地理位置数组详细格式请参照:https://trac.osgeo.org/gdal/wiki/rfc4_geolocate
-eterr_threshold 变换允许的偏差值像素为单位
-refine_gcps tolerance minimum_gcps精化后控制点的最少数量
-te xmin ymin xmax ymax输出文件地理范围最大最小x、y值
-te_srs srs_def特殊指定SRS输出文件的地理参照GDAL/OGR forms, complete WKT, PROJ.4, EPSG:n or a file containing the WKT
-trxres yres 输出图像的分辨率xres yres
-tap输出图像范围的坐标系校正到图像分辨率一致只需输入设定即可
-ts width height设置输出图像的宽和高像素数
-ovr levelAUTOAUTO-n
-wo “NAME=VALUE”这里可以特别指定重投影选项重投影选项都可以
-ot type输出数据类型type
-wt type处理时使用的数据类型type
-r resampling_method设定重采样算法resampling_method
-srcnodata value [value…]源图像无数据处的值value
-dstnodata value [value…]输出图像无数据处的值value
-dstalpha创建输出数据集中的透明波段以辨识无数据值只需输入设定即可
-wm memory_in_mb设定该应用程序内存memory_in_mb
-multi是否使用多线程只需输入设定即可
-q是否在控制台输出运行步骤提示只需输入设定即可
-offormat 输出格式format
-co“NAME=VALUE”格式驱动所支持的选项
-cutline datasource激活OGR支持的矢量作为数据分割线datasource
-cl layername指定特定名称的图层layername
-cwhere expression基于属性查询分割线expression
-csql query使用sql语句选择在-cl指定图层上的分割线要素
-cblenddistance设置混合距离按像素
-crop_to_cutline按照分割线裁剪数据集只需输入设定即可
-overwrite是否覆写目标数据集只需输入设定即可
-nomd不复制元数据只需输入设定即可
-cvmd meta_conflict_value冲突元数据信息值“”
-setci参照输入数据集的色彩索引表建立输出数据集波段的色彩索引表只需输入设定即可
-oo NAME=VALUE打开选项驱动打开选项
-doo NAME=VALUE输出选项驱动输出选项
srcfile输入文件raw_spot.tif
dstfile输出文件utm11.tif

QGIS执行的命令类似如下:

gdalwarp -of GTiff -cutline D:/qgis/mask.shp -cl small -crop_to_cutline D:/qgis/src_dem.tif D:/qgis/clip.tif

Java实现

  1. Tif文件的读取。

  2. 准备gdalwarp 参数WarpOptions 。

  3. 调用gdal的warp方法。

  4. 释放文件句柄资源。

import org.gdal.gdal.Dataset;
import org.gdal.gdal.ProgressCallback;
import org.gdal.gdal.WarpOptions;
import org.gdal.gdal.gdal;
import org.gdal.gdalconst.gdalconstConstants;
import java.util.Vector;

public class GDALClipBySharp {

    public static void clip(String srcFile, String dstFile, String shpFile,String shpLayerName) {
        // 读取要切的原图
        Dataset srcDs = gdal.Open(srcFile, gdalconstConstants.GA_ReadOnly);
        if (srcDs == null) {
            System.err.println("GDALOpen failed - " + gdal.GetLastErrorNo());
            System.err.println(gdal.GetLastErrorMsg());
            return;
        }
        
        // 构建warp参数
        Vector options = new Vector();
        options.add("-of");
        options.add("GTiff");
        options.add("-cutline");//按照矢量图像线裁剪
        options.add(shpFile);
        options.add("-cl");
        options.add(shpLayerName);
        options.add("-crop_to_cutline"); //裁剪后图层范围使用矢量图层大小
        options.add("-dstnodata");
        options.add("-10001.0"); //nulldata的值
        
        WarpOptions wo = new WarpOptions(options);
        Dataset warp = gdal.Warp(dstFile, new Dataset[]{srcDs}, wo);
        
        // 获取切图的原点坐标信息
        double[] warpTransform = warp.GetGeoTransform();
        System.out.println("warp原点坐标   = " + warpTransform[0] + "," + warpTransform[3]);
        System.out.println("warp像素坐标差 = " + warpTransform[1] + "," + warpTransform[5]);

        srcDs.delete();
    }

    public static void main(String[] args) {
        gdal.AllRegister();
        GDALClipBySharp.clip("D:\\qgis\\src_dem.tif",
                "D:\\qgis\\clip.tif",
                "D:\\qgis\\mask.shp",
                "mask");
        gdal.GDALDestroyDriverManager();
    }
}
  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值