栅格数据创建与保存

2024-05-02 14:18
文章标签 保存 创建 栅格数据

本文主要是介绍栅格数据创建与保存,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

栅格数据创建与保存

作者:阿振

邮箱:tanzhenyugis@163.com

博客:https://blog.csdn.net/theonegis/article/details/80089375

修改时间:2018-05-24

声明:本文为博主原创文章,转载请注明原文出处


思路与方法

使用Python进行栅格数据处理,很多时候,我们会将GDAL的Dataset对象转化为NumPy的ndarray对象,这样我们可以使用很多通用的Python库对数据进行处理,然后再借助GDAL库将数据写回到文件。

不同于普通的二进制文件,空间栅格数据的写需要注意两点:

  1. 数据的投影信息(确定了平面坐标系)
  2. 数据的地理坐标信息(确定了图像在给定坐标系下的位置)

在GDAL中,我们首先需要创建Dataset对象,然后给Dataset对象填充数据以及元数据信息就OK了。

Driver或者说GDALDriver(Python版本的API中对象名称好像都去掉了前缀GDAL,而C/C++版本的API很多对象前面都是有GDAL前缀的,如GDALDataset对象在Python中对应的是Dataset对象)有两个方法:Create()CreateCopy()

所以,相应地,我们也有两种思路去创建一个Dataset对象:

  1. 如果我们有一个原型数据,比如我们对原始数据进行了处理,处理之后,空间信息,波段等都没有变化,则可以将原始数据作为原型数据,使用CreateCopy()方法创建一个和原始数据一样的Dataset对象,然后在创建好的对象中填充一个ndarray数据就好了。
  2. 如果我们没有一个原型数据,那么我们首先需要使用Create()方法创建一个空的Dataset对象,然后手动设置对象的波段,尺寸,空间信息等,然后再在对应的波段填空ndarray具体的数据。

实现函数

我把上面两种实现思路编码成一个函数,具体实现如下:

def array2raster(f_name, np_array, driver='GTiff',prototype=None,xsize=None, ysize=None,transform=None, projection=None,dtype=None, nodata=None):"""将ndarray数组写入到文件中:param f_name: 文件路径:param np_array: ndarray数组:param driver: 文件格式驱动:param prototype: 文件原型:param xsize: 图像的列数:param ysize: 图像的行数:param transform: GDAL中的空间转换六参数:param projection: 数据的投影信息:param dtype: 数据存储的类型:param nodata: NoData元数据"""# 创建要写入的数据集(这里假设只有一个波段)# 分两种情况:一种给定了数据原型,一种没有给定,需要手动指定Transform和Projectiondriver = gdal.GetDriverByName(driver)if prototype:dataset = driver.CreateCopy(f_name, prototype)else:if dtype is None:dtype = gdal.GDT_Float32if xsize is None:xsize = np_array.shape[-1]  # 数组的列数if ysize is None:ysize = np_array.shape[-2]  # 数组的行数dataset = driver.Create(f_name, xsize, ysize, 1, dtype)  # 这里的1指的是一个波段dataset.SetGeoTransform(transform)dataset.SetProjection(projection)# 将array写入文件dataset.GetRasterBand(1).WriteArray(np_array)if nodata is not None:dataset.GetRasterBand(1).SetNoDataValue(nodata)dataset.FlushCache()return f_name

在使用该函数的时候,要么传进去一个prototype原型数据集,要么传进去transformprojection等信息,这样写入的文件才具有空间参考。

测试案例

下面是一个计算NDVI(Normalized Difference Vegetation Index,归一化植被指数)和DVI(Difference Vegetation Index,差值植被指数)的例子。我们首先计算NDVI,然后通过从原始数据中读取的空间投影和空间变换六元组信息创建输出文件;然后再计算DVI,通过NDVI文件作为原型数据集,以创建DVI的输出数据集。

具体实现如下:

# 打开栅格数据集
ds = gdal.Open('example.tif') # example.tif有三个波段,分别是蓝,红,近红外# 获取数据集的一些信息
x_size = ds.RasterXSize  # 图像列数
y_size = ds.RasterYSize  # 图像行数proj = ds.GetProjection()  # 返回的是WKT格式的字符串
trans = ds.GetGeoTransform()  # 返回的是六个参数的tuple# 在数据集层面ReadAsArray方法将每个波段都转换为了一个二维数组
image = ds.ReadAsArray()# 获得波段对应的array
bnd_red = image[1].astype(float)  # 红波段
bnd_nir = image[2].astype(float)  # 近红外波段idx_ndvi = (bnd_nir - bnd_red) / (bnd_nir + bnd_red)  # 计算NDVI指数out1_file = 'NDVI.tif'
array2raster(out1_file, idx_ndvi,xsize=x_size, ysize=y_size,transform=trans, projection=proj,dtype=gdal.GDT_Float32)idx_dvi = bnd_nir - bnd_red  # 计算DVI指数out2_file = 'DVI.tif'
# 这里我们使用out1_file作为原型图像作为参考来保存out2_file
array2raster(out2_file, idx_ndvi, prototype=gdal.Open(out1_file))# 关闭数据集
ds = None

这篇关于栅格数据创建与保存的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/954443

相关文章

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

在cscode中通过maven创建java项目

在cscode中创建java项目 可以通过博客完成maven的导入 建立maven项目 使用快捷键 Ctrl + Shift + P 建立一个 Maven 项目 1 Ctrl + Shift + P 打开输入框2 输入 "> java create"3 选择 maven4 选择 No Archetype5 输入 域名6 输入项目名称7 建立一个文件目录存放项目,文件名一般为项目名8 确定

Java 创建图形用户界面(GUI)入门指南(Swing库 JFrame 类)概述

概述 基本概念 Java Swing 的架构 Java Swing 是一个为 Java 设计的 GUI 工具包,是 JAVA 基础类的一部分,基于 Java AWT 构建,提供了一系列轻量级、可定制的图形用户界面(GUI)组件。 与 AWT 相比,Swing 提供了许多比 AWT 更好的屏幕显示元素,更加灵活和可定制,具有更好的跨平台性能。 组件和容器 Java Swing 提供了许多

顺序表之创建,判满,插入,输出

文章目录 🍊自我介绍🍊创建一个空的顺序表,为结构体在堆区分配空间🍊插入数据🍊输出数据🍊判断顺序表是否满了,满了返回值1,否则返回0🍊main函数 你的点赞评论就是对博主最大的鼓励 当然喜欢的小伙伴可以:点赞+关注+评论+收藏(一键四连)哦~ 🍊自我介绍   Hello,大家好,我是小珑也要变强(也是小珑),我是易编程·终身成长社群的一名“创始团队·嘉宾”

Maven创建项目中的groupId, artifactId, 和 version的意思

文章目录 groupIdartifactIdversionname groupId 定义:groupId 是 Maven 项目坐标的第一个部分,它通常表示项目的组织或公司的域名反转写法。例如,如果你为公司 example.com 开发软件,groupId 可能是 com.example。作用:groupId 被用来组织和分组相关的 Maven artifacts,这样可以避免

批处理以当前时间为文件名创建文件

批处理以当前时间为文件名创建文件 批处理创建空文件 有时候,需要创建以当前时间命名的文件,手动输入当然可以,但是有更省心的方法吗? 假设我是 windows 操作系统,打开命令行。 输入以下命令试试: echo %date:~0,4%_%date:~5,2%_%date:~8,2%_%time:~0,2%_%time:~3,2%_%time:~6,2% 输出类似: 2019_06

ORACLE 11g 创建数据库时 Enterprise Manager配置失败的解决办法 无法打开OEM的解决办法

在win7 64位系统下安装oracle11g,在使用Database configuration Assistant创建数据库时,在创建到85%的时候报错,错误如下: 解决办法: 在listener.ora中增加对BlueAeri-PC或ip地址的侦听,具体步骤如下: 1.启动Net Manager,在“监听程序”--Listener下添加一个地址,主机名写计

PHP7扩展开发之类的创建

本篇文章主要将如何在扩展中创建一个对象。创建的对象的过程,其实和一个小孩出生,成长的过程有些类似。 第一步,办准生证 生孩子第一步,先办准生证。声明我要生孩子了。对象创建的时候,如何办准生证呢?只要定义一个zend_class_entry变量即可。代码如下: zend_class_entry ce; zend_class_entry 是啥?可以认为它使一个原型,定义了一些对象应该有哪些东西

创建表时添加约束

查询表中的约束信息: SHOW KEYS FROM 表名; 示例: 创建depts表包含department_id该列为主键自动增长,department_name列不允许重复,location_id列不允许有空值。 create table depts(department_id int primary key auto_increment,department_name varcha

UML- 统一建模语言(Unified Modeling Language)创建项目的序列图及类图

陈科肇 ============= 1.主要模型 在UML系统开发中有三个主要的模型: 功能模型:从用户的角度展示系统的功能,包括用例图。 对象模型:采用对象、属性、操作、关联等概念展示系统的结构和基础,包括类图、对象图、包图。 动态模型:展现系统的内部行为。 包括序列图、活动图、状态图。 因为要创建个人空间项目并不是一个很大的项目,我这里只须关注两种图的创建就可以了,而在开始创建UML图