修改多波段影像像元值

需求:

用户有上千幅多波段栅格数据(.tif),由于操作失误,导致每个栅格数据在不同波段中出现nodata值的情况,用户的需求是想将栅格数据中的nodata值改成255。

思路:

(1)创建输出文件夹。创建文件夹用于存储处理后的栅格数据。

(2)遍历原始数据文件夹。

(3)对每一个遍历的栅格数据执行计算统计值、然后对每一个多波段数据的各个波段(band1、band2、band3)执行con条件函数运算、最后对每个多波段的单波段(band1、band2、band3)进行波段合成运算。

具体实现:

本次测试是通过ArcGIS10.6.1的IDLE(Python GUI)成功实现。

import arcpy
from arcpy import env
from arcpy.sa import *
import os

def mkdir(path):
      
    # 去除首位空格
    path=path.strip()
    # 去除尾部 \ 符号
    path=path.rstrip("\\")
 
    # 判断路径是否存在
    # 存在     True
    # 不存在   False
    isExists=os.path.exists(path)
 
    # 判断结果
    if not isExists:
        # 如果不存在则创建目录
        # 创建目录操作函数
        os.makedirs(path) 
 
        print path+' 创建成功'
        return True
    else:
        # 如果目录存在则不创建,并提示目录已存在
        print path+' 目录已存在'
        return False


env.workspace=r"E:\temp\output"
# 定义要创建的目录
mkpath="E:\\temp\\output\\t1\\"
mkpath1="E:\\temp\\output\\t2\\"
# 调用函数
mkdir(mkpath)
mkdir(mkpath1)
#遍历文件夹中的栅格数据
tifList=arcpy.ListRasters()
for tiftest in  tifList:
    print "打印栅格数据名称......"
    print (tiftest)
    #计算统计值
    arcpy.CalculateStatistics_management(
        tiftest, "1", "1", "",
         "SKIP_EXISTING")

    #将nodata改成255
    d = arcpy.Describe(tiftest)
    r=1
    for rb in d.children:
        print rb.name
        bandname=tiftest+"/"+rb.Name
        outCon = Con(IsNull(bandname),255, bandname)
        outCon.save(mkpath+tiftest[:-4]+"b"+str(r)+ ".tif")
        r=r+1

    b1=mkpath+tiftest[:-4]+"b1.tif"
    b2=mkpath+tiftest[:-4]+"b2.tif"
    b3=mkpath+tiftest[:-4]+"b3.tif"
    compbands=mkpath1+"compbands"+tiftest
    print compbands+"..........."
    #波段合成
    arcpy.CompositeBands_management("%s;%s;%s"%(b1,b2,b3),"%s"%(compbands))

print "ok!!!"
 

操作过程:

链接:https://pan.baidu.com/s/1Ema-wfowgIQ0IGrD1xm1Xg 
提取码:ltkv 

参考资料:

https://www.cnblogs.com/hyl2018/p/8970769.html
https://www.cnblogs.com/xunbu7/p/8074417.html

https://www.cnblogs.com/landhu/p/6497975.html    python空值为None

<think>好的,我现在需要解决ArcGIS中波段影像波长显示未知的问题。首先,我要理解用户的问题:他们在使用ArcGIS处理多波段影像时,波段的波长信息显示为未知。这可能影响到后续的分析,比如遥感中的波段选择或分类。 接下来,我需要回忆ArcGIS处理栅格数据的相关知识。波段波长信息通常存储在元数据中,尤其是遥感影像如卫星或航空影像,比如Landsat或Sentinel数据。如果元数据缺失或未被正确读取,ArcGIS可能无法显示波长信息。 可能的原因有几个: 1. 数据源本身没有包含波长信息。比如用户自己合成的影像,或者某些未正确导出元数据的处理软件生成的数据。 2. ArcGIS未能正确读取元数据。可能文件格式不支持,或者元数据存储的位置不符合ArcGIS的解析规则。 3. 数据在转换或处理过程中丢失了元数据。例如,将HDF格式转换为TIFF时,如果没有正确导出元数据,波长信息可能丢失。 接下来,我需要考虑解决方案。首先检查元数据是否存在。用户可以使用ArcCatalog查看栅格属性,检查波段属性是否有波长信息。如果元数据确实存在但未被识别,可能需要调整元数据格式或位置。 如果元数据缺失,用户需要手动添加波长信息。这可以通过修改栅格属性表或者使用ArcPy脚本进行批量处理。例如,使用“波段属性”工具或在Python环境中更新波段的描述字段。 另外,可能需要确认数据格式是否支持存储波长信息。例如,ENVI格式的.hdr文件通常包含波长信息,而普通的TIFF可能不支持。转换到支持的格式可能有助于解决问题。 最后,如果数据来源是已知的传感器(如Landsat 8),用户可以直接输入标准的波长值,因为这些信息通常是公开的。例如,Landsat 8的波段波长可以在USGS官网上找到,并手动输入到每个波段中。 在验证解决方案时,用户应重新加载数据,检查波段属性是否更新。如果手动输入后仍不显示,可能需要检查ArcGIS的版本是否有已知问题,或者尝试重启软件。 此外,参考GIS发展趋势中的标准化和三维GIS方向,数据标准化的重要性在此问题中凸显。确保元数据遵循行业标准,能有效避免此类问题[^1]。 相关问题可能涉及如何批量处理多个影像的元数据,或者在不同GIS软件之间保持元数据兼容性,以及如何利用Python脚本自动化这一过程。</think>### 分步解决方案 **问题描述**:在ArcGIS中使用多波段影像时,波段波长信息显示为“未知”,影响遥感分析(如波段组合、光谱分析等)。 #### 原因分析: 1. **元数据缺失**:原始数据未包含波长信息(如非标准数据源或处理过程中丢失)。 2. **格式兼容性**:当前文件格式不支持存储元数据(如普通TIFF未包含ENVI头文件)。 3. **读取错误**:ArcGIS未正确解析元数据(如格式不兼容或元数据存储位置异常)。 --- #### 解决方案步骤: **步骤1:检查元数据是否存在** 1. 在**ArcCatalog**或**目录视图**中右键点击栅格数据,选择**属性** > **源**。 2. 查看波段属性中是否存在“波长”(Wavelength)字段。若显示“未知”,则需手动添加。 **步骤2:手动添加波长信息** 1. **通过栅格波段属性修改**: - 打开**ArcMap**或**ArcGIS Pro**,加载影像- 右键点击栅格图层 > **属性** > **符号系统**。 - 在“波段组合”中选中需要修改的波段,查看右侧属性面板。 - 若有“波长”字段,直接输入数值(单位:纳米);若无此选项,需通过其他方法。 2. **使用ArcPy脚本批量修改**(适用于多波段影像): ```python import arcpy raster_path = "C:/data/image.tif" # 替换为实际路径 wavelengths = [450, 560, 650] # 输入各波段波长值 raster = arcpy.Raster(raster_path) for i in range(raster.bandCount): band = raster[i] arcpy.management.CalculateStatistics(band) # 确保统计信息已生成 arcpy.management.AlterRasterBandProperties( band, "波长", wavelengths[i], "ADD") ``` - 运行后刷新数据,重新查看波段属性。 **步骤3:转换数据格式(可选)** - 若原始数据为TIFF且无头文件,转换为**ENVI格式**(保留.hdr元数据): 1. 使用**栅格转其他格式**工具(Conversion Tools > To Raster > Raster to Other Format)。 2. 选择输出类型为“ENVI”,生成.dat和.hdr文件。 3. 在文本编辑器中打开.hdr文件,添加波长信息: ``` wavelength = {450, 560, 650} # 按波段顺序填写 ``` **步骤4:验证结果** - 重新加载修改后的数据,检查波段属性中的波长是否更新。 --- #### 附加说明: - **标准传感器数据**:若影像来自Landsat、Sentinel等卫星,可直接查询官方波段波长(如Landsat 8波段波长见[USGS官网](https://www.usgs.gov/))并手动输入。 - **数据标准化建议**:遵循遥感数据存储规范(如ENVI格式),确保元数据完整[^1]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值