一、使用gdal.Warp

gdalwarp 实用程序是一种图像拼接、重投影和扭曲实用程序。该程序可以重新投影到任何支持的投影。如果图像是带有控制信息的“原始”图像,也可以存储原始图像的投影信息。
gdal.warp官网链接:
https://gdal.org/api/python/osgeo.gdal.html#osgeo.gdal.Warp

def extractTiff(input_shape,input_raster,output_raster):#裁剪input_raster = gdal.Open(input_raster)# 开始裁剪result = gdal.Warp(output_raster,input_raster,format='GTiff',cutlineDSName=input_shape,cropToCutline=True)result.FlushCache()del result

gdal.Warp主要参数如下:

gdal.Warp(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 — 回调函数数据

cropToCutline为True时,使用剪切线的extent作为输出的界线;dstNodata='NULL’时,可将背景值设置为空。此方法非常好用,强烈推荐。
注意cropToCutline默认为False,默认界限为输入矢量图的界限,使用默认设置会导致裁剪后的图片非常大(见下图设置不同的dstNodata后的文件大小)。另外还可以参考这篇文章的说明:python批量遥感影像裁剪的三种方法

二、使用PIL结合GDAL

基本原理可以参考:GDAL和 Pillow 的互操作
网上公开的代码是通过PIL与GDAL栅格数据互操作,将栅格数据转换为PIL中的对象,使用PyShp读取矢量边界,裁剪PIL,最后通过数组,转回栅格数据。以下是完整代码

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
'''
@File    :   k_factor.py
@Time    :   2022/09/26 08:45:09
@Author  :   Junlai
@Version :   1.0
@Desc    :   None
'''
import os,shapefile
from osgeo import gdal, gdal_array, ogr
from PIL import Image, ImageDrawdef image2Array(i):"""将一个Python图像库的数组转换为一个gdal_array图片"""a = gdal_array.numpy.frombuffer(i.tobytes(), 'b')a.shape = i.im.size[1], i.im.size[0]return adef world2Pixel(geoMatrix, x, y):"""使用GDAL库的geomatrix对象((gdal.GetGeoTransform()))计算地理坐标的像素位置"""ulx = geoMatrix[0]uly = geoMatrix[3]xDist = geoMatrix[1]yDist = geoMatrix[5]rtnX = geoMatrix[2]rtnY = geoMatrix[4]pixel = int((x - ulx) / xDist)line = int((uly - y) / abs(yDist))return (pixel, line)def extractFromShp(input_raster,input_shape,output_raster):# 用于裁剪的栅格数据raster = input_raster# 裁剪后的栅格数据output = output_raster# 将数据源作为gdal_array载入srcArray = gdal_array.LoadFile(raster)# 同时载入gdal库的图片从而获取geotransformsrcImage = gdal.Open(raster)geoTrans = srcImage.GetGeoTransform()geoProj = srcImage.GetProjection()# # 使用PyShp库打开shp文件shp = input_shaper = shapefile.Reader("{}.shp".format(shp))# # 将图层扩展转换为图片像素坐标minX, minY, maxX, maxY = r.bboxulX, ulY = world2Pixel(geoTrans, minX, maxY)lrX, lrY = world2Pixel(geoTrans, maxX, minY)# 计算新图片的尺寸pxWidth = int(lrX - ulX)pxHeight = int(lrY - ulY)clip = srcArray[ulY:lrY, ulX:lrX]# 为图片创建一个新的geomatrix对象以便附加地理参照数据geoTrans = list(geoTrans)geoTrans[0] = minXgeoTrans[3] = maxY# 在一个空白的8字节黑白掩膜图片上把点映射为像元# 边界线pixels = []for p in r.shape(0).points:pixels.append(world2Pixel(geoTrans, p[0], p[1]))rasterPoly = Image.new("L", (pxWidth, pxHeight), 1)# 使用PIL创建一个空白图片用于绘制多边形rasterize = ImageDraw.Draw(rasterPoly)rasterize.polygon(pixels, 0)# 使用PIL图片转换为Numpy掩膜数组mask = image2Array(rasterPoly)# 根据掩膜图层对图像进行裁剪clip = gdal_array.numpy.choose(mask, (clip, 0)).astype(gdal_array.numpy.uint8)print(clip.max())# 保存为tiff文件gdal_array.SaveArray(clip, "{}.tif".format(output),format="GTiff")if __name__ == '__main__':pj_path = os.path.abspath(os.path.dirname(os.path.abspath(os.path.dirname(__file__))))fpath = os.path.join(pj_path, 'data')input_shape = f'{fpath}\\boundary\\input'output_raster = f'{fpath}\\out'# tif输入路径,打开文件input_raster = f'{fpath}\\lu\\input.tif'# 矢量裁剪栅格extractFromShp(input_raster,input_shape,output_raster)

该方法存在一个小bug,当矢量文件属性表存在中文,会出现以下报错,

解决方法可以简单粗暴,直接修改PyShp源码:
self.encoding = kwargs.pop('encoding', 'utf-8')修改为self.encoding = kwargs.pop('encoding', 'gbk')
笔者尝试直接用ogr替代PyShp,完成上述操作,完全可行,结果一致,在此不表,感兴趣的可以自行尝试。

三、使用ArcTools裁剪

过于简单粗暴,在此不表

四、BUG

有个小的BUG,暂时还没摸清楚原因,MARK一下:
使用GDAL结合PIL裁剪后的栅格图,会比ArcTool少一行,GDAL.WRAP裁剪时会少两行一列。

  • 使用ArcTool裁剪
  • 使用PIL结合GDAL裁剪时
  • 使用GDAL.WRAP裁剪时

Python使用GDAL矢量裁剪栅格,设置背景值为空白(已解决)相关推荐

  1. python矢量裁剪栅格代码_Python中使用面状矢量裁剪栅格影像,并依据Value值更改矢量属性...

    本文整体思路:在Python中使用Geopandas库,依次读取shp文件的每一个面状要素,获取其空间边界信息并裁剪对应的栅格影像,计算所裁剪影像Value值的众数,将其设置为对应面状要素的NewTY ...

  2. ArcGIS中矢量裁剪栅格影像及影像合并【附练习数据下载】

    关于栅格影像数据的裁剪跟合并我们之前发过很多相关教程,工作中小助手经常用的软件是ArcGIS和Global Mapper 关于Global Mapper相关裁切技巧大家可以看之前发过的一篇→Globa ...

  3. QLabel 设置背景图片的方法和解决图片太大不能完显示办法

    #QLabel 设置背景图片的方法和解决图片太大不能完显示办法 文章目录 1.通过`QPixmap`来设置 方法 注意 2.通过`QSS`设置 方法 注意 1.通过QPixmap来设置 方法 // 获 ...

  4. Python GDAL矢量转栅格详解

    前言:挺久没有更新博客了,前段时间课程实验中需要用代码将矢量数据转成栅格,常见的点栅格化方法通过计算将点坐标(X,Y)转换到格网坐标(I,J),线栅格化方法主要有DDA算法.Bresenham算法等, ...

  5. c++ gdal 矢量转栅格_QGIS中的矢量图形绘制机制

    QGIS 软件是地理信息界最受欢迎的开源GIS软件之一.QGIS支持常见的矢量编辑.矢量分析功能,能够满足地理信息行业从业者的基本的地理数据处理需求.由于QGIS提供了便利的插件更新开发方式,支持Py ...

  6. python使用GDAL/OGR/OSR时设置GDAL_DATA环境变量

    版权声明:转载请注明作者(独孤尚良dugushangliang)出处: https://blog.csdn.net/dugushangliang/article/details/89377625 右键 ...

  7. ENVI背景值nodata或NAN解决方法/ArcGIS栅格影像背景颜色去除

    可见红十字线指向的背景处值为NAN(nodata同理) 在Arcgis中打开显示为nodata且背景值有颜色不方便设色制图 添加一个shp文件作为裁剪 裁剪功能位置:工具箱\系统工具箱\Data Ma ...

  8. 利用python读取点矢量对应栅格值

    每行代码都有详细注解 所需库 # GDAL是栅格和矢量地理空间数据格式的转换器库 # 旧版本加载库的方法 #import gdal,gdalconst # from 语句让你从模块中导入一个指定的部分 ...

  9. c++ gdal 矢量转栅格_GDAL矢量转栅格

    gdal版本1.8.0. 首先尝试使用gdal_rasterize小工具,但是不支持新生成输出栅格文件.官方说1.8版本后已经支持.但仍然无效. 栅格的元数据赋值和仿射变换以后需要进一步研究. 代码实 ...

最新文章

  1. 改变,从跨出第一步開始——记海大ITAEM团队首次IT讲座掠影
  2. 行锁mysql怎么执行_Mysql调用什么情况会用到行锁与表锁
  3. 麻瓜编程python爬虫微专业_麻瓜编程 - 主页
  4. 分布式事务科普(初识篇)
  5. pycharm中如何调用Anoconda的库
  6. codeforces E. Game with String 概率
  7. SVN merge(合并) 的三种方式
  8. linux centos7安装ngix,centos7 环境下安装nginx--Linux
  9. java实现坐标图进行拖拉拽放_js实现限定区域范围拖拉拽效果
  10. pos机未能连接服务器,pos 机链接不了服务器
  11. 买到同类票的概率(洛谷P2719题题解,Java语言描述)
  12. vc6.0转vc2010编程中遇到的问题
  13. 【深入理解JVM】运行时数据区域:java虚拟机栈
  14. ios十进制、十六进制字符串,byte,data等之间的转换
  15. 膝盖中了一箭之康复篇-第九个月暨3月份目标总结
  16. 图书管理系统c++_图书管理功能
  17. MoSonic:对SubSonic的分布式存储、缓存改进方案尝试(1)
  18. 安卓WebView调起本地文件选择
  19. 可以去视频水印的软件 抖音的玩法和技巧图解
  20. 基于python的论文摘要怎么写_Python实现文章摘要的提取方式

热门文章

  1. ES集群+Kibana部署
  2. IPhone4S中QuickDo神器安装
  3. 服务器——购买云服务器
  4. 【论文笔记】:DetectoRS: Detecting Objects with Recursive Feature Pyramid and Switchable Atrous Convolution
  5. 模式识别技术,目前主要应用于哪几方面?
  6. s3c2450下AC97驱动研究
  7. 华为HCNA——配置telnet登陆设备
  8. 中心睿典计算机考试题,中星睿典全国专业技术人员计算机应用能力考试模拟试题库答案_WindowsXP的窗口...
  9. 计算机室规章制度英语作文,书面表达 英语作文 80字你的学校新建了一个阅览室,学校要制定一些阅览室的规章制度,根据下列提示写一篇英语作文 告诉同学...
  10. ln - 软链接与硬链接区别