学习笔记4_强大的gdal转换工具库warp

参数介绍

gdal.WarpOptions(options = [], format = 'GTiff', outputBounds = None, 
                 outputBoundsSRS = one, xRes = None, yRes = None, 
                 targetAlignedPixels = False, width = 0, height = 0, srcSRS = None,
                 dstSRS = None, srcAlpha = False, dstAlpha = False, warpOptions = None,
                 errorThreshold = None, warpMemoryLimit = None, creationOptions = None,
                 outputType = GDT_Unknown, workingType = 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, 
                 ropToCutline = False, copyMetadata = True, metadataConflictValue = None,
                 setColorInterpretation = False, callback = None, callback_data = None):

 options — 可以是一个字符串数组,一个字符串或者令其为空值,但是使用后面其他的参数来定义。
format — 输出的格式 (例如"GTiff"等)。
outputBounds — 在目标空间参考系统的输出数据集的范围,形式为 (minX,minY, maxX, maxY) 。
outputBoundsSRS — 如果在dstSRS中没有定义的话,使用这个关键字定义输出数据集的边界的空间参考系统。
xRes, yRes — 在目标参考系统中的像元大小。
targetAlignedPixels —是否强制输出边界为输出分辨率的倍数。
width — 输出栅格的像素列数。
height — 输出栅格的像素行数。
srcSRS —源空间参考系统。
dstSRS — 输出空间参考系统。
srcAlpha — 是否强制将输入数据集的最后一个波段作为alpha波段。
dstAlpha — 是否强制创建一个输出数据集的alpha波段。
outputType — 输出类型 (例如gdal.GDT_Byte等)
workingType — working type (gdal.GDT_Byte, etc…)
warpOptions —变形选项列表。
errorThreshold --近似转换的误差阈值(用像素表示) 。
warpMemoryLimit — 工作缓存大小,单位是bytes。
resampleAlg — 重采样模式。
creationOptions — 创建选项列表。
srcNodata — 源数据的nodata值。
dstNodata — 输出数据的nodata值。
multithread — 是否多线程计算和输入输出操作。
tps— 是否使用Thin Plate Spline GCP 转换器。
rpc— 是否使用RPC转换器。
geoloc — 是否使用GeoLocation数组转换器。
polynomialOrder — 多项式GCP插值的阶数。
transformerOptions — 转换参数
cutlineDSName — 剪切线数据集名称。这里的剪切线是指对影像进行剪切的时候所使用的矢量图层。
cutlineLayer — 剪切线图层名称。
cutlineWhere — 剪切线的WHERE语句。
cutlineSQL — 剪切线的SQL 语句。
cutlineBlend — 以像素为单位的剪切线混合距离。
cropToCutline — 是否使用剪切线的extent作为输出的界线。
copyMetadata — 是否拷贝源数据的元数据。
metadataConflictValue — 元数据冲突值。
setColorInterpretation — 是否强制将输入波段的颜色解释赋予输出波段。
callback — 回调函数。
callback_data — 回调函数数据

使用范例:

一、重采样

对于栅格数据的重投影可以使用Warp来实现
Warp(destNameOrDestDS, srcDSOrSrcDSTab,**kwargs)

  • destNameOrDestDS是数据集变量或者新保存的目标文件地址。
  • srcDSOrSrcDSTab可以是源数据集或文件名,即被重投影的数据集,也可以是包含了若干数据集或文件名的一个array。
  • kwargs关键字参数是可以是一个WarpOptions对象,也可以是一个字符串数组,包含了WarpOptions的若干条件,具体内容与WarpOptions的参数一致。如果已经使用了一个WarpOptions对象,则所使用的其他关键字参数都会被忽略掉。

二、校正

 参考以下文章 

Python GDAL 学习笔记(二) | 码农家园目录一、自定义空间坐标系使用EPSG或EPSGA编号进行初始化使用WKT字符串进行初始化使用PROJ字符串进行初始化附录二、遥感影像几何校正利用卫星自带的地理定位...https://www.codenong.com/cs105927745/

Python 利用GDAL对图像进行几何校正 - 行走的蓑衣客 - 博客园https://www.cnblogs.com/suoyike1001/p/15230883.html

 三、影像裁剪

1、矢量裁剪栅格

①使用gdal.Warp进行裁剪

    from osgeo import gdal

    input_shape = r"C:\Users\Administrator\Desktop\English\sample1.shp"
    input_raster = r'C:\Users\Administrator\Desktop\English\BOA Reflectance-10m_MTD_MSIL2A.tif'
    # tif输入路径,打开文件
    output_raster = r"C:\Users\Administrator\Desktop\English\Landsat8.tif"
    # 矢量文件路径,打开矢量文件
    input_raster = gdal.Open(input_raster)
    # 开始裁剪,一行代码,爽的飞起
    ds = gdal.Warp(output_raster,#输出栅格路径
                   input_raster,#输入栅格路径
                   format='GTiff',#影像保存格式
                   cutlineDSName=input_shape,#输入矢量路径
                   cropToCutline=False,  # (为True时,结果会与输入矢量大小一致。为False时,结果会与待裁剪的输入栅格大小一致。看情况使用)
                   # cutlineWhere="FIELD = 'whatever'",
                   dstSRS='EPSG:4326',  # 参考系:WGS84
                   outputType=gdal.GDT_Int16,#数据类型
                   dstNodata=0)# 目标图像无值时填充值
    # 关闭文件
    ds = None

②使用mask掩膜裁剪

import fiona
import rasterio as rio
import rasterio.mask

def clipRasterByShapefile(src, shpdatafile, dst, nodata=0):
    #src:待裁剪栅格路径
    #shpdatafile:裁剪矢量路径
    #dst:裁剪结果路径
    # 读取shp
    with fiona.open(shpdatafile, "r") as shapefile:
        features = [feature["geometry"] for feature in shapefile]
    # 读取原始影像
    src = rio.open(src)

    # 调用函数执行裁剪
    out_image, out_transform = rio.mask.mask(src, features,
                                             all_touched=True,
                                             crop=False,
                                             nodata=nodata)
    # 元数据信息复制
    out_meta = src.meta.copy()
    out_meta.update({"driver": "GTiff",
                     "height": out_image.shape[1],
                     "width": out_image.shape[2],
                     "transform": out_transform})
    # 输出文件
    output_file = rasterio.open(dst, "w", compress="LZW", **out_meta)
    output_file.write(out_image)
    output_file.close()

2、矢量裁剪矢量 

import os
import gdal
from osgeo import ogr

def ShapeClip(baseFilePath,maskFilePath,saveFolderPath):
    """
    矢量裁剪
    :param baseFilePath: 要裁剪的矢量文件路径
    :param maskFilePath: 掩膜矢量文件路径
    :param saveFolderPath: 裁剪后的矢量文件保存目录
    :return:
    """
    ogr.RegisterAll()
    gdal.SetConfigOption("GDAL_FILENAME_IS_UTF8", "YES")
    # 载入要裁剪的矢量文件
    baseData = ogr.Open(baseFilePath)
    baseLayer = baseData.GetLayer()
    spatial = baseLayer.GetSpatialRef()
    geomType = baseLayer.GetGeomType()
    baseLayerName = baseLayer.GetName()
    # 载入掩膜矢量文件
    maskData = ogr.Open(maskFilePath)
    maskLayer = maskData.GetLayer()
    maskLayerName = maskLayer.GetName()
    # 生成裁剪后的矢量文件
    outLayerName = maskLayerName + "_Clip_" + baseLayerName
    outDataName = os.path.join(saveFolderPath, outLayerName)
    if not os.path.exists(outDataName):
        os.makedirs(outDataName)
    outFileName = outLayerName + ".shp"
    outFilePath = os.path.join(outDataName, outFileName)
    gdal.SetConfigOption("SHAPE_ENCODING", "GBK")
    driver = ogr.GetDriverByName("ESRI Shapefile")
    outData = driver.CreateDataSource(outFilePath)#创建输出文件
    outLayer = outData.CreateLayer(outLayerName, spatial, geomType)#创建带有与输入矢量相同地理信息的图层
    baseLayer.Clip(maskLayer, outLayer)#进行裁剪
    outData.Release()
    baseData.Release()
    maskData.Release()
    return outFilePath

  • 6
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值