基于python的gdal读写遥感影像
GDAL(Geospatial Data Abstraction Library)主要用来读取地理空间数据,现在的GDAL包并不是单独的GDAL,而是集成了GDAL和OGR的。OGR用于处理矢量数据。因此,GDAL既可以用来处理栅格也可以处理矢量文件。
下面代码主要为读写tif的代码,图像其实就是一个二维矩阵,其他格式的遥感影像都可以参考。包括nc,hdf等等。
# 调包
from osgeo import gdal
import numpy as np
# 打开图像并创建空间
data = gdal.Open(filename)
driver = gdal.GetDriverByName('GTiff')
# 数据集的基本信息
print('Raster Driver : {d}\n'.format(d=driver.ShortName))
print('影像的波段数: ', data.RasterCount)
img_width, img_height = data.RasterXSize, data.RasterYSize
print('影像的列,行数: {r}rows * {c}colums'.format(r=img_width, c=img_height))
print('栅格数据的空间参考:{}'.format(data.GetGeoTransform())) # 栅格数据的6参数
print('投影信息:{}\n'.format(data.GetProjection())) # 栅格数据的投影
输出如下:
关于数据的基本信息,其中数据的空间参考和投影信息最为重要。在写影像时是必不可少的参数。GetGeoTransform()为获取数据的仿射变换矩阵,6个参数,记录了影像的左上角坐标,旋转,xy方向上的分辨率;GetProjection()为获取影响的投影信息,即影像的地理参考,一般都为WGS84。
若数据格式为NC或者HDF,仿射变换矩阵需要计算。
Raster Driver : GTiff
影像的波段数: 6
影像的列行数: 1143rows * 721colums
栅格数据的空间参考:(429255.0, 30.0, 0.0, 4429725.0, 0.0, -30.0)
投影信息:PROJCS["WGS 84 / UTM zone 50N",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"]],PROJECTION["Transverse_Mercator"],PARAMETER["latitude_of_origin",0],PARAMETER["central_meridian",117],PARAMETER["scale_factor",0.9996],PARAMETER["false_easting",500000],PARAMETER["false_northing",0],UNIT["metre",1,AUTHORITY["EPSG","9001"]],AXIS["Easting",EAST],AXIS["Northing",NORTH],AUTHORITY["EPSG","32650"]]
# 读取第一个波段并将其转为array
band_1 = data.GetRasterBand(1)
band_1 = band_1.ReadAsArray(0, 0, img_width, img_height) # 行,列
写一个遥感影像分为两部分:①完成这张图像,包括图像的行列号,像素点的数据类型。②影像在地球上的位置,即空间信息。包括仿射变换矩阵和地理位置。
# ①存储参数设置
driver = gdal.GetDriverByName("GTiff")
etype = gdal.GDT_Float32
# ②orginal_file为原始影像,获取原始影像的空间参考和投影信息。将其写入新的影像
proj = gdal.Open(orginal_file).GetProjection()
transform = gdal.Open(orginal_file).GetGeoTransform()
# 创建存储影像基本信息:
# result_file结果影像
# arr为需要存储的影像矩阵(行*列),写如的格式为先列后行。band表示波段数量,etype是数据类型
ds = driver.Create(result_file, arr.shape[1], arr.shape[0], band, etype)
# eg.写单波段图像,并且将空间参考和投影信息写入。
ds.GetRasterBand(1).WriteArray(arr)
ds.SetGeoTransform(transform)
ds.SetProjection(proj)
ds.FlushCache()
del ds
两个函数,分别为文件的读写。此处随意选择一张tif格式的数据尝试,对需要更改的参数进行了详细的说明。
# 导入所需要的包
from osgeo import gdal
import numpy as np
# 读取遥感影像,获取影像的基本信息
def read_tif(filename, b=1):
'''
filename为文件名称,b为波段数量;读取遥感影像并将其每个band转化为一列变量。
b=1是默认参数,如果读取单波段影像,不需要输入;当输入影像为多波段时,需要将b改为影像的波段数。
'''
# 打开图像并创建空间
data = gdal.Open(filename)
driver = gdal.GetDriverByName('GTiff')
# driver = data.GetDriver()
# 数据集的基本信息
print('Raster Driver : {d}\n'.format(d=driver.ShortName))
print('影像的波段数: ', data.RasterCount)
img_width, img_height = data.RasterXSize, data.RasterYSize
print('影像的列,行数: {r}rows * {c}colums'.format(r=img_width, c=img_height))
print('栅格数据的空间参考:{}'.format(data.GetGeoTransform())) # 栅格数据的6参数
print('投影信息:{}\n'.format(data.GetProjection())) # 栅格数据的投影
# 读取影像的元数据,获取各个波段的信息
print(data.GetMetadata())
band = None
for i in range(b):
band_1 = data.GetRasterBand(i + 1)
band_1 = band_1.ReadAsArray(0, 0, img_width, img_height).flatten() # 行,列
if band is None:
band = band_1
else:
band = np.vstack((band, band_1))
return band.T
def arr2raster(self, orginal_file, result_file, arr, band=1):
'''
orginal_file为原始影像;目的为获取原始影像的地理参考。
result_file为要保存的文件的名称,arr为转存的矩阵,proj和transform分别为投影信息和仿射变换矩阵
band=1,表示默认情况生成单波段图像,若要多波段图像,在输入的时候更改band为要创建的波段数
'''
driver = gdal.GetDriverByName("GTiff")
etype = gdal.GDT_Float32
proj = gdal.Open(orginal_file).GetProjection()
transform = gdal.Open(orginal_file).GetGeoTransform()
# no_data_value = ''
if band == 1:
ds = driver.Create(result_file, arr.shape[1], arr.shape[0], band, etype) # 行,列
# 写单波段图像
ds.GetRasterBand(1).WriteArray(arr)
else:
ds = driver.Create(result_file, arr.shape[2], arr.shape[1], band, etype)
# 写多波段图像
for i in range(band):
ds.GetRasterBand(i + 1).WriteArray(arr[i, :, :])
ds.SetGeoTransform(transform)
ds.SetProjection(proj)
ds.FlushCache()
del ds
# 案例演示:读取影像
# 使用的是landsat5/TM影像,查看演示效果
filename=r'C:\Users\lenovo\Desktop\test.tif'
datasets = read_tif(filename, b=6)
# 案例演示:写入影像
# 实际中,会对影像进行操作,将结果再次转为tif。例如:将分类结果转为tif影像
# arr为需要转存的矩阵,格式是行*列。此处将原始影像的band1转为tif,行列号721 * 1143
arr = datasets[:,0].reshape(721, 1143)
result_file = r'C:\Users\lenovo\Desktop\result.tif'
arr2raster(filename, result_file, arr, band=1)


关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚
好的,所以我的目标是轻松地将一些数据保存到磁盘以备后用。您如何简单地写入然后读取一个对象?所以如果我有一个简单的类classCattr_accessor:a,:bdefinitialize(a,b)@a,@b=a,bendend所以如果我从中非常快地制作一个objobj=C.new("foo","bar")#justgaveitsomerandomvalues然后我可以把它变成一个kindaidstring=obj.to_s#whichreturns""我终于可以将此字符串打印到文件或其他内容中。我的问题是,我该如何再次将这个id变回一个对象?我知道我可以自己挑选信息并制作一个接受该信
这个问题在这里已经有了答案:关闭10年前。PossibleDuplicate:Pythonconditionalassignmentoperator对于这样一个简单的问题表示歉意,但是谷歌搜索||=并不是很有帮助;)Python中是否有与Ruby和Perl中的||=语句等效的语句?例如:foo="hey"foo||="what"#assignfooifit'sundefined#fooisstill"hey"bar||="yeah"#baris"yeah"另外,类似这样的东西的通用术语是什么?条件分配是我的第一个猜测,但Wikipediapage跟我想的不太一样。
什么是ruby的rack或python的Java的wsgi?还有一个路由库。 最佳答案 来自Python标准PEP333:Bycontrast,althoughJavahasjustasmanywebapplicationframeworksavailable,Java's"servlet"APImakesitpossibleforapplicationswrittenwithanyJavawebapplicationframeworktoruninanywebserverthatsupportstheservletAPI.ht
无论您是想搭建桌面端、WEB端或者移动端APP应用,HOOPSPlatform组件都可以为您提供弹性的3D集成架构,同时,由工业领域3D技术专家组成的HOOPS技术团队也能为您提供技术支持服务。如果您的客户期望有一种在多个平台(桌面/WEB/APP,而且某些客户端是“瘦”客户端)快速、方便地将数据接入到3D应用系统的解决方案,并且当访问数据时,在各个平台上的性能和用户体验保持一致,HOOPSPlatform将帮助您完成。利用HOOPSPlatform,您可以开发在任何环境下的3D基础应用架构。HOOPSPlatform可以帮您打造3D创新型产品,HOOPSSDK包含的技术有:快速且准确的CAD
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
华为OD机试题本篇题目:明明的随机数题目输入描述输出描述:示例1输入输出说明代码编写思路最近更新的博客华为od2023|什么是华为od,od薪资待遇,od机试题清单华为OD机试真题大全,用Python解华为机试题|机试宝典【华为OD机试】全流程解析+经验分享,题型分享,防作弊指南华为o
我想解析一个已经存在的.mid文件,改变它的乐器,例如从“acousticgrandpiano”到“violin”,然后将它保存回去或作为另一个.mid文件。根据我在文档中看到的内容,该乐器通过program_change或patch_change指令进行了更改,但我找不到任何在已经存在的MIDI文件中执行此操作的库.他们似乎都只支持从头开始创建的MIDI文件。 最佳答案 MIDIpackage会为您完成此操作,但具体方法取决于midi文件的原始内容。一个MIDI文件由一个或多个音轨组成,每个音轨是十六个channel中任何一个上的
C#实现简易绘图工具一.引言实验目的:通过制作窗体应用程序(C#画图软件),熟悉基本的窗体设计过程以及控件设计,事件处理等,熟悉使用C#的winform窗体进行绘图的基本步骤,对于面向对象编程有更加深刻的体会.Tutorial任务设计一个具有基本功能的画图软件**·包括简单的新建文件,保存,重新绘图等功能**·实现一些基本图形的绘制,包括铅笔和基本形状等,学习橡皮工具的创建**·设计一个合理舒适的UI界面**注明:你可能需要先了解一些关于winform窗体应用程序绘图的基本知识,以及关于GDI+类和结构的知识二.实验环境Windows系统下的visualstudio2017C#窗体应用程序三.