gdal.Warp工具可以用于坐标系转换、投影变换、图像合并与镶嵌、地理范围裁剪、更改分辨率、矢量裁剪等方面,关键的参数在于options,可参考文档gdal.Warp的说明,通过文档中osgeo.gdal.Warp、osgeo.gdal.WarpOptions这两个模块的说明,可以了解到gdal.Warp的具体应用方式,本文主要是针对矢量裁剪的功能进行说明。
options的主要参数如下:
WarpOptions(options=None, format=None,
outputBounds=None, outputBoundsSRS=None, xRes=None, yRes=None,
targetAlignedPixels=False, width=0, height=0, srcSRS=None,
dstSRS=None, coordinateOperation=None, srcAlpha=False,
dstAlpha=False, warpOptions=None, errorThreshold=None,
warpMemoryLimit=None, creationOptions=None,
outputType=gdalconst.GDT_Unknown,
workingType=gdalconst.GDT_Unknown, resampleAlg=None,
srcNodata=None, dstNodata=None, multithread=False,
tps=False, rpc=False, geoloc=False, polynomialOrder=None,
transformerOptions=None, cutlineDSName=None,
cutlineLayer=None, cutlineWhere=None, cutlineSQL=None,
cutlineBlend=None, cropToCutline=False, copyMetadata=True,
metadataConflictValue=None, setColorInterpretation=False,
overviewLevel='AUTO', callback=None, callback_data=None)
矢量裁剪中,主要用到的是cutlineDSName、cutlineLayer、cutlineWhere、cutlineSQL、cutlineBlend、cropToCutline这几项,参考文章使用GDAL(Python)对遥感影像进行裁剪完成批量裁剪任务
代码如下:
import numpy as np
# gdal用来处理栅格数据
from osgeo import gdal
# ogr用来处理矢量数据
from osgeo import ogr
import os
from os.path import join
import shapefile
from boxplot import boxplot
import pandas as pd
from pandas import DataFrame
# 矢量以及栅格保存路径
shp_root = r'D:\...\厂区UTM50.shp'
path_root = r'D:\...\T'
save_root = r'D:\...\TG'
if not os.path.exists(save_root):
os.makedirs(save_root)
# 定义栅格的读取
gdal.AllRegister()
def ImgOpen(dir):
data = gdal.Open(dir, gdal.GA_ReadOnly)
if data == 'None':
print('图像无法加载')
return data
# 根据路径判断尾缀
path_names = sorted(os.listdir(path_root))
# 设置矢量及栅格数据的保存位置
img_path = []
# 判断文件尾缀,保存到对应的矢量或栅格列表中
for path_name in path_names:
path_namefor = os.path.splitext(path_name)[0]
path_nameend = os.path.splitext(path_name)[1]
if (path_nameend.lower() == '.tif'):
img_path.append(path_name)
# 开始读取矢量以及对应的栅格数据进行处理
for i in range(len(img_path)):
img_file = ImgOpen(join(path_root, img_path[i]))
out_name = img_path[i].split('.')[0] + 'shpcut.tif'
out_root = join(save_root, out_name)
# r = shapefile.Reader(shp_root)
ds = gdal.Warp(out_root, # 裁剪图像保存完整路径(包括文件名)
img_file, # 待裁剪的影像
format='GTiff', # 保存图像的格式
cutlineDSName=shp_root, # 矢量文件的完整路径
cropToCutline=True, # 保证裁剪后影像大小跟矢量文件的图框大小一致(设置为False时,结果图像大小会跟待裁剪影像大小一样,则会出现大量的空值区域)
# cutlineWhere="FIELD = 'whatever'",
dstNodata=0)