ArcPy学习心得(4)(四)大尺度空间范围可燃物载量计算方法

Python遥感图像处理应用篇(一):Arcpy遥感图像NDVI指数计算批量处理 1.使用数据MOD09A1 MOD09A1数据网上有很多介绍,这里不做详细说明了。通过MRT工具处理完之后,包含以下数据: 即主要包含1-7波段数据以及其他一些数据。空间分辨率为500m,时间分辨率为8day。 2.Modis波段主要应用领域 这里直接从其它地方复制而来可供大家参考一下: 3.NDVI指数计算公式 直接列出公式 来一段波段数据的英文说明: The MODIS sensor has 36 spectral bands, seven ofwhich are desig 阅读详情

可燃物载量表示在单位面积范围内可燃物的负荷载量总和,一般来说,可燃物载量越高,火灾隐患越大,而不同地物的可燃物载量是不同的,本文结合了可燃物载量的主流计算模型,利用NDVI、坡度、土地利用分类数据相结合的方式来对全国各地的可燃物载量进行计算(部分算法只公开思路,不公开细节),而这篇文章,主要阐述了如何使用Arcpy在大尺度空间范围下对数据进行更高效的处理及计算。

在进行代码设计之前,让我们先分析一下此次计算所需要的数据都有哪些吧!

根据计算可燃物载量的步骤,我们需要先对NDVI数据、坡度数据、土地利用数据进行读取,只有在获取到数据之后,才能够进行下一步的计算,以下为数据读取部分的代码,其中使用了arcpy的Raster方法对三类数据进行读取。


NDVITif = arcpy.Raster(NDVIPath)
SlopeTif = arcpy.Raster(SlopePath)
ReclassTif = arcpy.Raster(ReclassPath)

 

利用arcpy的Raster方法将数据读取为Raster后,需要使用arcpy的RasterToNumPyArray方法,将数据从Raster转换为Array格式的数据,其中Array为二维数组,以下为读取数据数组的代码。


NoData = Reclass.noDataValue#读取Nodata
#读取Reclass
dataReclass=arcpy.RasterToNumPyArray(Reclass,nodata_to_value=NoData)
rows,cols = dataReclass.shape#获取行数和列数
#读取NDVI
NoData = NDVI.noDataValue#读取Nodata
dataNDVI=arcpy.RasterToNumPyArray(NDVI, nodata_to_value=NoData)
#读取Slope
NoData = Slope.noDataValue#读取Nodata
dataSlope=arcpy.RasterToNumPyArray(Slope, nodata_to_value=NoData)

在获取到数据的数组后,即可对数据进行计算,然而,在大尺度空间范围下,数据计算过程中所占用的运行内存是非常多的,在数据量较大的情况下,会发生内存溢出的情况,针对于此类情况,Numpy的Array数组有一个特性,即可对Array数组进行分块处理,也可理解为切片处理,而在对Array数组进行分块处理时,可选择规则型分块,即根据数组的行数和列数,将数组分成大小相同的矩形,对其进行处理,也可利用条件表达式,对Array数组进行过滤,对过滤后的数组进行处理。

而在此次计算过程中,因为不同土地利用类型下的可燃物载量也不同,因此我们选择将土地利用类型作为筛选条件,来对数组进行过滤,并通过NDVI以及坡度分块计算各地类的可燃物载量。

以下为实现过程的代码(部分算法代码不予展示)。


S = np.zeros([rows,cols],dtype=float)
S[dataReclass==10]=FuelloadQ(dataNDVI[dataReclass==10],dataSlope[dataReclass==10],10)
S[dataReclass==20]=FuelloadQ(dataNDVI[dataReclass==20],dataSlope[dataReclass==20],20)
S[dataReclass==30]=FuelloadQ(dataNDVI[dataReclass==30],dataSlope[dataReclass==30],30)

在上段代码中,数组S为最终的计算结果,在计算过程中,首先利用了条件表达式“dataReclass==n,n=(10,20,30)”,对数组S、dataNDVI、dataSlope进行了分块,分别提取出了其中以农田、林地、草地为下垫面的数组,随后将分块后的数据传入至FuelloadQ方法中对其进行可燃物载量的计算,即可在最大程度上节省脚本运行时所花费的时间成本与空间成本。

最后,将计算好的数组S通过arcpy的NumPyArrayToRaster方法转换为Raster,随后对这个Raster进行保存,即可完成所有计算步骤。以下为保存数组S的代码。


NoData = 0#读取Nodata
ExtentXmin = tif.extent.XMin#取x坐标最小值
ExtentYmin = tif.extent.YMin#取y坐标最小值
lowerLeft = arcpy.Point(ExtentXmin,ExtentYmin)#取得数据起始点坐标(左下角坐标)
Widthcellsize=tif.meanCellWidth#像元宽度
Heightcellsize=tif.meanCellHeight#像元高度
new_raster=arcpy.NumPyArrayToRaster(S,lowerLeft,Widthcellsize,Heightcellsize,value_to_nodata=NoData)
new_raster.save(SavePath)
arcpy.BuildPyramids_management(SavePath)

其中,NumPyArrayToRaster方法所需要的参数有:数组S、数据的起始点坐标(左下角坐标)、像元宽度、像元高度、NoData等参数。

Arcpy中的BuildPyramids_management方法的作用是为保存后的Raster建立金字塔。

以下内容为此次代码的部分内容(不包含可燃物载量算法)。


import numpy as np
import arcpy

def Fuelload(NDVI,Reclass,Slope):
    #获取数据矩阵
    NoData = Reclass.noDataValue#读取Nodata
    dataReclass = arcpy.RasterToNumPyArray(Reclass, nodata_to_value=NoData)
    rows,cols = dataReclass.shape#获取行数和列数
    #读取NDVI
    NoData = NDVI.noDataValue#读取Nodata
    dataNDVI = arcpy.RasterToNumPyArray(NDVI, nodata_to_value=NoData)
    
    #读取Slope
    NoData = Slope.noDataValue#读取Nodata
    dataSlope = arcpy.RasterToNumPyArray(Slope, nodata_to_value=NoData)

    S = np.zeros([rows,cols],dtype=float)
    
    S[dataReclass == 10] = FuelloadQ(dataNDVI[dataReclass == 10],dataSlope[dataReclass == 10],10)#农田
    S[dataReclass == 20] = FuelloadQ(dataNDVI[dataReclass == 20],dataSlope[dataReclass == 20],20)#林地
    S[dataReclass == 30] = FuelloadQ(dataNDVI[dataReclass == 30],dataSlope[dataReclass == 30],30)#草地
    del dataNDVI,dataReclass,dataSlope
    gc.collect()
    return S

def Run(NDVIPath,ReclassPath,SlopePath,SavePath):
    NDVITif = arcpy.Raster(NDVIPath)
    ReclassTif = arcpy.Raster(ReclassPath)
    SlopeTif = arcpy.Raster(SlopePath)

    S = Fuelload(NDVITif,ReclassTif,SlopeTif)

    #保存
    NoData = 0#读取Nodata
    ExtentXmin = tif.extent.XMin#取x坐标最小值
    ExtentYmin = tif.extent.YMin#取y坐标最小值
    lowerLeft = arcpy.Point(ExtentXmin,ExtentYmin)#取得数据起始点坐标(左下角坐标)
    Widthcellsize=tif.meanCellWidth#像元宽度
    Heightcellsize=tif.meanCellHeight#像元高度

    new_raster = arcpy.NumPyArrayToRaster(S,lowerLeft,Widthcellsize,Heightcellsize,value_to_nodata=NoData)
    new_raster.save(SavePath)
    arcpy.BuildPyramids_management(SavePath)

【ArcPy】如何用Python批量计算影像光谱指数:全面提升遥感数据分析效率 NDVI是最常用的光谱指数之一,其计算公式为:其中,NIR为近红外波段,Red为红色波段。"""计算NDVI并保存为栅格文件:param red_band: 红色波段路径:param nir_band: 近红外波段路径:param output_ndvi: 输出NDVI栅格路径"""# 使用arcpy.ia.NDVI工具计算NDVI# 保存NDVI栅格print(f"NDVI计算完成,结果保存为:计算NDVI并保存为栅格文件:param red_band: 红色波段路径。 阅读详情

相关推荐

【ArcPy】 Python批量提取多张遥感影像的NDVI值

在处理遥感影像时,理解影像的波段结构和坐标系统非常重要。一般来说,遥感影像会包含多个波段,每个波段代表特定的光谱范围。Red波段:通常对应于第三波段(在Landsat影像中为Band 3)。NIR波段:通常对应于第四波段(在Landsat影像中为Band 4)。通过本文的介绍,你已经学会了如何使用Python批量提取多张遥感影像的NDVI值。这一技能在遥感影像分析中具有广泛的应用前景,可以帮助你更高效地分析植被覆盖情况。

陈书予 851

NDVI批量计算Python代码.zip_Arcpy_NDVI_beanf2l_python_最大值合成法

NDVI最大值合成法批量计算Python代码

Xilinx系列学习(一) BRAM的使用,并用PL读取BRAM数据

Xilinx系列学习(一) BRAM的使用,并用PL读取BRAM数据一,Xilinx BRAM介绍二,BRAM对应的IP核调用和使用1,BRAM对应的IP核介绍2,BMG例化IP核的调用 一,Xilinx BRAM介绍 BRAM 就是Block Memory,是Zynq的PL端的存储RAM单元。可以利用BRAM,在PS和PL之间进行数据的交换。Zynq中还有一类存储器,称为分布式随机访问存储器(D...

weixin_43941525的博客 3万+

如何实现SOLIDWORKS阵列的“智能变更”?

有时,我们在设计一个零件时,零件上有一排阵列孔,同时零件有不同的长度,我们又希望可以做到零件长度改变时,这排孔可以按长度等距增减孔阵列的个数;或是零件长度加长或缩短时,这排孔保持个数不变,按零件长度增减孔距。 那具体要怎么做呢?接下来,我们一起来看看怎么用SOLIDWORKS中简单的操作来实现这两种智能的变更: 零件长度加长或缩短时,这排孔要按长度等距增减孔阵列的个数。 零件长度加长或缩短时,这排孔保持个数不变,按零件长度增减孔距。 那接下来,我们一起来看看怎么用简单的操作来实现这两种智能的

SOLIDWORKS艾金米 2079

解决vscode无法运行npm命令的问题(cmd可行)

Powershell以及vscode中npm命令使用不了

无痕坚守本心的博客 2750

程序化广告行业(2/89):从程序化广告深挖数据处理技巧

大家好!我一直希望能和大家在技术学习的道路上携手共进,这也是我写这一系列博客的初衷。上次我们一起学习了Python基础的数据处理知识,这次咱们借助一本程序化广告手册,深入挖掘数据处理的更多技巧。这本手册涵盖了程序化广告从概念到技术实现的诸多方面,而其中处处都涉及到数据处理,相信会给我们带来不少收获

yyy173611的博客 4572

【kafka】控制台默认不能发送大数据 4096 4095 4129

1.概述 因为某些原因,需要做一个测试,然后我想往topic中,发送一条消息,然后再消费它。但是消息有点大,一条消息是36K. 消费者 [root@1 kafka]# bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic xxx.devicealarm | grep 网络攻击 生产者,生产者发送了一个消息消息是一个json,json中有这个数据特征 网络攻击 [root@1 kafka]# bin/kafka-console-p

九师兄 586

使用 Visual Studio Code 连接 ABAP On-Premise 系统做开发的详细配置步骤

本文详细介绍了如何在Visual Studio Code中通过ABAP Development Tools扩展连接ABAP On-Premise系统。关键步骤包括:通过Ctrl+Shift+P打开命令行面板选择「ABAP: New Destination...」创建RFC连接(仅支持SSO单点登录),选择本地SAPGUI中已有的系统,输入Client ID、语言和用户名(无需密码),最后将目标系统添加到工作区即可开始开发。文章强调了企业安全考虑下仅支持SSO的设计理念,并展示了连接配置的JSON格式示例。整

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 987

3、Tone Mapping色调映射(Advanced High Dynamic Range Imaging )

3、Tone Mapping色调映射(Advanced High Dynamic Range Imaging) 如今,大多数可用的显示设备无法本地显示HDR内容。 入门级显示器的对比度仅为200:1。 尽管高端液晶电视具有更高的对比度,但平均对比度约为10,000:1,但通常每个色彩通道的离散度为8位,很少为10位。 这意味着色调限制为255。在过去的二十年中,研究人员花费了大量时间和精力来压缩HDR图像和视频的范围,以便可以在LDR显示器上更“自然”地看到数据。 图3.1 色调映射和真实场景之间.

ISP行业的忠实粉丝 1866

Android16 rk3576添加触摸点数上限到40个点

本文介绍了在Android 16系统上实现40点触摸支持的修改方案。相比Android 15,Android 16对API添加有更严格的要求,需要在MotionEvent.java中添加@FlaggedApi批注。主要修改包括:1)在input_framework.aconfig中定义flag;2)在MotionEvent.java中添加40个AXIS_GENERIC轴常量并添加批注;3)将32位指针ID处理改为64位适配;4)更新相关API文档。修改涉及多个核心文件,包括PointerController

tzj1058756809的博客 382

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

上一篇: ArcPy学习心得系列(3)局部高程点的提取方法+坡度图实现
下一篇: ArcPy学习心得系列(5)遥感数据中值滤波与均值滤波实现方法(不计入NoDATA)
sky
J
博客等级 码龄5年 3533粉丝 225原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

sky J

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值