栅格数据的批量镶嵌(附Python脚本)
博客小序:在数据处理的过程中,会遇到需要大量镶嵌的情况,当数据较多时手动镶嵌较为麻烦,自己最近对分省的DEM数据进行镶嵌,由于利用python进行镶嵌较为方便,特撰此博文以记之。
参考博客:
https://blog.csdn.net/qq_15642411/article/details/79187787
https://blog.csdn.net/XBR_2014/article/details/85255412
1.脚本处理情况说明
本实例中,处理的数据是分省的DEM数据,每个省由若干数量不同的tif文件,本脚本主要的功能只有一个即: 对分省的DEM数据进行分省镶嵌
2.脚本代码
#添加一个计时器
import time
start = time.time()
import os, shutil, glob
from osgeo import gdal
# 定义一个镶嵌的函数,传入的参数是需要镶嵌的数据的列表,以及输出路径
def mosaic(data_list, out_path):
# 读取其中一个栅格数据来确定镶嵌图像的一些属性
o_ds = gdal.Open(data_list[0])
# 投影
Projection = o_ds.GetProjection()
# 波段数据类型
o_ds_array = o_ds.ReadAsArray()
if 'int8' in o_ds_array.dtype.name:
datatype = gdal.GDT_Byte
elif 'int16' in o_ds_array.dtype.name:
datatype = gdal.GDT_UInt16
else:
datatype = gdal.GDT_Float32
# 像元大小
transform = o_ds.GetGeoTransform()
pixelWidth = transform[1]
pixelHeight = transform[5]
del o_ds
minx_list = []
maxX_list = []
minY_list = []
maxY_list = []
# 对于每一个需要镶嵌的数据,读取它的角点坐标
for data in data_list:
# 读取数据
ds = gdal.Open(data)
rows = ds.RasterYSize
cols = ds.RasterXSize
# 获取角点坐标
transform = ds.GetGeoTransform()
minX = transform[0]
maxY = transform[3]
pixelWidth = transform[1]
pixelHeight = transform[5] # 注意pixelHeight是负值
maxX = minX + (cols * pixelWidth)
minY = maxY + (rows * pixelHeight)
minx_list.append(minX)
maxX_list.append(maxX)
minY_list.append(minY)
maxY_list.append(maxY)
del ds
# 获取输出图像坐标
minX = min(minx_list)
maxX = max(maxX_list)
minY = min(minY_list)
maxY = max(maxY_list)
# 获取输出图像的行与列
cols = int((maxX - minX) / pixelWidth)
rows = int((maxY - minY) / abs(pixelHeight))# 注意pixelHeight是负值
# 计算每个图像的偏移值
xOffset_list = []
yOffset_list = []
i = 0
for data in data_list:
xOffset = int((minx_list[i] - minX) / pixelWidth)
yOffset = int((maxY_list[i] - maxY) / pixelHeight)
xOffset_list.append(xOffset)
yOffset_list.append(yOffset)
i += 1
# 创建一个输出图像
driver = gdal.GetDriverByName("GTiff")
dsOut = driver.Create(out_path + ".tif", cols, rows, 1, datatype)
bandOut = dsOut.GetRasterBand(1)
i = 0
#将原始图像写入新创建的图像
for data in data_list:
# 读取数据
ds = gdal.Open(data)
data_band = ds.GetRasterBand(1)
data_rows = ds.RasterYSize
data_cols = ds.RasterXSize
data = data_band.ReadAsArray(0, 0, data_cols, data_rows)
bandOut.WriteArray(data, xOffset_list[i], yOffset_list[i])
del ds
i += 1
# 设置输出图像的几何信息和投影信息
geotransform = [minX, pixelWidth, 0, maxY, 0, pixelHeight]
dsOut.SetGeoTransform(geotransform)
dsOut.SetProjection(Projection)
del dsOut
def main():
input_folder = "D:\\cnblogs\\data\\china"
file_list = glob.glob(input_folder + "\\*")
out_file = "D:\\cnblogs\\data\\china_moasic"
if os.path.exists(out_file):
shutil.rmtree(out_file)
os.mkdir(out_file)
else:
os.mkdir(out_file)
for file in file_list:
basename = os.path.basename(file)
out_path = out_file + "\\" + basename
data_list = glob.glob(file + "\\" + "*.tif")
print(data_list)
try:
mosaic(data_list, out_path)
print(file + "镶嵌结束")
except:
bad_list.append(file)
print(file + "数据超过4G或其他原因导致无法镶嵌")
bad_list = []
main()
print("无法镶嵌的文件包括如下")
print (bad_list)
end = time.time()
print ("程序运行时间{:.2f}分钟".format((end-start)/60.0))
3.问题总结
1.多幅栅格数据镶嵌时,由于镶嵌后的栅格数据大小超过4G,python的会报错。
2.此脚本只考虑了栅格数据只有一个波段的情形,多波段栅格数据的镶嵌未来有机会遇到再补充。
3.由于新生成的镶嵌数据是规则的矩形,但是用于镶嵌的数据不一定能刚好完美的覆盖新的图层,导致没有数据用来镶嵌的部分的值0,此问题较为重要,需要注意。
本文作者:DQTDQT
限于作者水平有限,如文中存在任何错误,欢迎不吝指正、交流。
联系方式:
QQ:1426097423
e-mail:duanquntaoyx@163.com
本文版权归作者和博客园共有,欢迎转载、交流,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,如果觉得本文对您有益,欢迎点赞、探讨。
栅格数据的批量镶嵌(附Python脚本)的更多相关文章
- Linux Shell输出颜色字符学习笔记(附Python脚本实现自动化定制生成)
齿轮发出咔嚓一声,向前进了一格.而一旦向前迈进,齿轮就不能倒退了.这就是世界的规则. 0x01背景 造了个轮子:御剑师傅的ipintervalmerge的Python版本.觉得打印的提示信息如果是普通 ...
- 使用NuGet打包并发布至ProGet过程 (步骤详细,附python脚本)【上篇】
一.基本知识 (1)NuGet : NuGet是一个为大家所熟知的Visual Studio扩展,通过这个扩展,开发人员可以非常方便地在Visual Studio中安装或更新项目中所需要的第三方组件, ...
- Discuz!X 3.4 任意文件删除漏洞复现过程(附python脚本)
今天看下群里在讨论Discuz!X 3.4 任意文件删除漏洞,自己做了一些测试,记录一下过程.结尾附上自己编写的python脚本,自动化实现任意文件删除. 具体漏洞,请查看 https://paper ...
- 【NuGet】使用NuGet打包并发布至ProGet过程 (步骤详细,附python脚本)【上篇】
一.基本知识 (1)NuGet : NuGet是一个为大家所熟知的Visual Studio扩展,通过这个扩展,开发人员可以非常方便地在Visual Studio中安装或更新项目中所需要的第三方组件, ...
- Redis 未授权访问漏洞(附Python脚本)
0x01 环境搭建 #下载并安装 cd /tmp wget http://download.redis.io/releases/redis-2.8.17.tar.gz tar xzf redis-.t ...
- Variance Inflation Factor (VIF) 方差膨胀因子解释_附python脚本
python信用评分卡(附代码,博主录制) https://study.163.com/course/introduction.htm?courseId=1005214003&utm_camp ...
- DVWA SQL-injection 附python脚本
SQL-Injection low等级 首先我们将dvwa等级调到low 如图 接下来选择SQL Injection,并在提交框中输入正常值1,查看返回结果 接下来检测是否存在注入,分别输入 1' a ...
- 利用Dnspod api批量更新添加DNS解析【python脚本】 - 推酷
利用Dnspod api批量更新添加DNS解析[python脚本] - 推酷 undefined
- ansible批量分发免密钥登陆python脚本
最近看了看强大的号称自动化运维的三大利器之一的--ansible,ok,亲测之后,确实感觉,对于我们这种DBA工作者来说,确实很受益. 值得注意的是ansible要求被管理服务器python版本不低于 ...
随机推荐
- [Abp vNext 源码分析] - 6. DDD 的应用层支持 (应用服务)
一.简要介绍 ABP vNext 针对于应用服务层,为我们单独设计了一个模块进行实现,即 Volo.Abp.Ddd.Application 模块. PS:最近博主也是在恶补 DDD 相关的知识,这里推 ...
- 入门训练-1.A+B问题
问题描述 输入A.B,输出A+B. 说明:在“问题描述”这部分,会给出试题的意思,以及所要求的目标. 输入格式 输入的第一行包括两个整数,由空格分隔,分别表示A.B. 说明:“输入格式”是描述在测试你 ...
- 转 java - 如何判断单链表有环
转自 https://blog.csdn.net/u010983881/article/details/78896293 1.穷举遍历 首先从头节点开始,依次遍历单链表的每一个节点.每遍历到一个新节点 ...
- handlerMapping的初始化以及查找handler
前提:HttpServletBean初始化了一些servlet配置,接着FrameWorkServlet创建了WebApplicationContext,最后DispatcherServlet初始化一 ...
- solr集群
一.所需环境 1.linux系统(内存分大点) 2.JDK 3.zookeeper 4.solr 二.安装zookeeper 1.此次安装3个zookeeper 2.tar -zxf zookeepe ...
- Linux学习笔记04
文件查找命令find 文件查找命令: which locate find which:查找命令字所在的位置 locate:模糊匹配(只要包含关键字的文件都查找出来) 不是实时的,基于数据库查找, up ...
- Linux平台 Oracle 19c RAC安装Part2:GI配置
三.GI(Grid Infrastructure)安装 3.1 解压GI的安装包 3.2 安装配置Xmanager软件 3.3 共享存储LUN的赋权 3.4 使用Xmanager图形化界面配置GI 3 ...
- Zabbix 中使用 Percona Monitoring Plugins 监控 MySQL
1.先安装agent客户端 tar zxvf zabbix-3.2.6.tar.gz cd zabbix-3.2.6 ./configure --prefix=/data/zabbix --enabl ...
- IT技术管理者的自我修养
1. 前言 本来写<IT技术管理者的自我修养>与<IT技术人员的自我修养>是一开始就有的想法.但发表<IT技术人员的自我修养>后,收到了不少良好的反馈,博客园的编辑 ...
- php 获取未来七天的日期和星期
php获取未来七天的日期和星期代码 for($i=4;$i<8;$i++){ $dateArray[$i]=date('Y-m-d',strtotime(date('Y-m- ...