个人整理的python地理信息库,本文代码也在其中,欢迎使用: https://github.com/Adam0429/geo-py

顺便帮公司打个广告,欢迎遥感类专家的加入~~

投简历戳这里,英视睿达欢迎您!

原始图像是这样的
目标是剪裁出指定大小的若干小tif

代码很简单,直接放了

from tqdm import tqdm
from osgeo import gdal,ogr,osr
import numpy as np
from glob import globdef read_tif(tif_path):ds = gdal.Open(tiff_path)row = ds.RasterXSizecol = ds.RasterYSizeband = ds.RasterCountfor i in range(band):data = ds.GetRasterBand(i+1).ReadAsArray()data = np.expand_dims(data , 2)if i == 0:allarrays = dataelse:allarrays = np.concatenate((allarrays, data), axis=2)return {'data':allarrays,'transform':ds.GetGeoTransform(),'projection':ds.GetProjection(),'bands':band,'width':row,'height':col}# 左上角点坐标 GeoTransform[0],GeoTransform[3] Transform[1] is the pixel width, and Transform[5] is the pixel heightdef write_tif(fn_out, im_data, transform,proj=None):'''功能:----------将矩阵按某种投影写入tif,需指定仿射变换矩阵,可选渲染为rgba参数:----------fn_out:str输出tif图的绝对文件路径im_data: np.arraytif图对应的矩阵transform: list/tuple gdal-like仿射变换矩阵,若im_data矩阵起始点为左上角且投影为4326,则为(lon_x.min(), delta_x, 0, lat_y.max(), 0, delta_y)proj: str(wkt格式)投影,默认投影坐标为4326,可用osr包将epsg转化为wkt格式,如srs = osr.SpatialReference()# establish encodingsrs.ImportFromEPSG(4326)    # WGS84 lat/lonproj = srs.ExportToWkt()    # create wkt fromat of proj# 设置投影,proj为wkt formatif proj is None:proj = 'GEOGCS["WGS 84",\DATUM["WGS_1984",\SPHEROID["WGS 84",6378137,298.257223563, \AUTHORITY["EPSG","7030"]], \AUTHORITY["EPSG","6326"]], \PRIMEM["Greenwich",0, \AUTHORITY["EPSG","8901"]], \UNIT["degree",0.0174532925199433, \AUTHORITY["EPSG","9122"]],\AUTHORITY["EPSG","4326"]]'# 渲染为rgba矩阵# 设置数据类型if 'int8' in im_data.dtype.name:datatype = gdal.GDT_Byteelif 'int16' in im_data.dtype.name:datatype = gdal.GDT_UInt16else:datatype = gdal.GDT_Float32# 将(通道数、高、宽)顺序调整为(高、宽、通道数)# print('shape of im data:', im_data.shape)im_bands = min(im_data.shape)im_shape = list(im_data.shape)im_shape.remove(im_bands)im_height, im_width = im_shapeband_idx = im_data.shape.index(im_bands)# 找出波段是在第几个# 创建文件driver = gdal.GetDriverByName("GTiff")dataset = driver.Create(fn_out, im_width, im_height, im_bands, datatype)# if dataset is not None:dataset.SetGeoTransform(transform)  # 写入仿射变换参数dataset.SetProjection(proj)  # 写入投影if im_bands == 1:# print(im_data[:, 0,:].shape)if band_idx == 0:dataset.GetRasterBand(1).WriteArray(im_data[0, :, :])elif band_idx == 1:dataset.GetRasterBand(1).WriteArray(im_data[:, 0, :])elif band_idx == 2:dataset.GetRasterBand(1).WriteArray(im_data[:, :, 0])else:for i in range(im_bands):if band_idx == 0:dataset.GetRasterBand(i + 1).WriteArray(im_data[i, :, :])elif band_idx == 1:dataset.GetRasterBand(i + 1).WriteArray(im_data[:, i, :])elif band_idx == 2:dataset.GetRasterBand(i + 1).WriteArray(im_data[:, :, i])dataset.FlushCache()del datasetdriver = Nonedef split(origin_data,origin_transform,output_size):origin_size = origin_data.shapex = origin_transform[0]y = origin_transform[3]x_step = origin_transform[1]y_step = origin_transform[5]output_x_step = x_stepoutput_y_step = y_stepfor i in range(origin_size[0]//output_size[0]):for j in range(origin_size[1]//output_size[1]):output_data = origin_data[i*output_size[0]:(i+1)*output_size[0],j*output_size[1]:(j+1)*output_size[1],:]output_transform = (x+j*output_x_step*output_size[0],output_x_step,0,y+i*output_y_step*output_size[0],0,output_y_step) write_tif(f'test/{i}_{j}.tif', output_data, output_transform)data = read_tif('/Users/0_20210508GF2.tif')
split(origin_data=data['data'],origin_transform=data['transform'],output_size=(255,255))

放下最终效果,中心部分就是截取出的小tif,覆盖在原tif之上会有色差,这是因为软件对不同tif文件显示不同色域的原因。

Python 将tif文件分割成多个小tif相关推荐

  1. 如何将一个文件分割成多个小文件

    你也许会遇到到这样一个问题?当你有一个较大的软件,而无法用一张软盘将其全部拷下时,你也许会想 到该将它分解开,分盘拷回去后,再将它们合并起来.现在的这种分割工具很多,你想自己动手做一个适合自己的分割工 ...

  2. c语言文件分割与合并程序详解,如何实现将一个文件分割成多个小文件

    你也许会遇到到这样一个问题?当你有一个较大的软件,而无法用一张软盘将其全部拷下时,你也许会想到该将它分解开,分盘拷回去后,再将它们合并起来.现在的这种分割工具很多,你想自己动手做一个适合自己的分割工具 ...

  3. python将大文件拆分成多个小文件,同时对各小文件处理以节省时间

    # test.py import json import osroot_path = os.path.dirname(__file__)def f(x):return xtest_datas = [] ...

  4. 怎么把tif文件转成jpg?试试这几招吧!值得收藏

    怎么把tif文件转成jpg?将TIF 格式的图片文件转换为 JPG 格式可以提高图片文件的可用性和互通性,并且有着广泛的应用场景和重要的作用.因为在不同的环境中,TIF 格式的图片文件可能会遇到浏览器 ...

  5. 使用python实现大文件分割与合并

    在平常的生活中,我们会遇到下面这样的情况: 你下载了一个比较大型的游戏(假设有10G),现在想跟你的同学一起玩,你需要把这个游戏拷贝给他. 然后现在有一个问题是文件太大(我们不考虑你有移动硬盘什么的情 ...

  6. c语言 拆分 文件,linux 将一个大文件分割成小的碎片文件 命令:csplit

    csplit命令用于将一个大文件分割成小的碎片,并且将分割后的每个碎片保存成一个文件.碎片文件的命名类似"xx00","xx01".csplit命令是split ...

  7. Python 将 HTML 文件转成指定的编码

    Python 将 HTML 文件转成指定的编码 import sys import chilkat charset = chilkat.CkCharset() #  Any string argume ...

  8. Python中将字节流文件转换成图片文件

    Python中将字节流文件转换成图片文件 import urllib3 import os #PIL图像处理标准库 from PIL import Image from io import Bytes ...

  9. 分享三种高效的方法,快速将一个PDF文件分割成两个!

    如何将一个PDF分割成两个?PDF文件在学习和工作中都是常用的文件格式,但是有时候我们可能只需要其中的一部分内容,这时候就需要将PDF文件分割成两个或多个.本文将分享三种不同的方法,供大家参考. 一. ...

  10. 用Python将word文件转换成html(转)

    用Python将word文件转换成html 序 最近公司一个客户大大购买了一堆医疗健康方面的科普文章,希望能放到我们正在开发的健康档案管理软件上.客户大大说,要智能推送!要掌握节奏!要深度学习!要让用 ...

最新文章

  1. Linux用init命令关机、重启、切换模式
  2. PAT甲级1112 Stucked Keyboard:[C++题解]卡住的键盘、双指针、去重
  3. chrome调试工具常用功能整理
  4. BZOJ4432 : [Cerc2015]Greenhouse Growth
  5. 最懂男人心的内裤,戳100个洞透气,超舒服
  6. java中8种数据类型和默认值所占字节数
  7. 关于开源分布式事务中间件Fescar,我们总结了开发者关心的13个问题
  8. [转]Windows Shell编程 第十五章【来源:http://blog.csdn.net/wangqiulin123456/article/details/7988016】...
  9. Nvidia League Player:来呀比到天荒地老
  10. interface接口_Java程序设计--接口interface(笔记)
  11. linux匹配数字正则,51CTO博客-专业IT技术博客创作平台-技术成就梦想
  12. C++统计博客园写过的代码行数
  13. 这就是XcodeGhost作者的原话
  14. Linux环境下安装SVN
  15. 浅谈内存分配方式以及堆和栈的区别
  16. 删库跑路 php,程序员删库跑路事件,php中文网的几点声明!
  17. java seek_java中seek()的用法
  18. python连接sap接口_基于Python的SAP流程自动化
  19. Java汇集接口、异常处理、常用使用类和集合等技术的实验项目
  20. c++最近公共祖先LCA(倍增算法和tarjan)

热门文章

  1. java集合终极总结
  2. google谷歌登录sdk失败错误码12500
  3. 测试用例以及相关问题
  4. API网关(什么是API网关、如何设计统一网关?),java面试手册升级版
  5. access()函数的用法
  6. 百度给创新员工发2000w奖金........
  7. 留一份名单,以供研究:2009中国企业500强全名单
  8. 安装win7时缺少所需的CDDVD驱动器设备驱动程序
  9. html5页面命名,html命名规则
  10. pstl连接数据库时出现ORA-12154:TNS:could not resolve service name错误。