python批量转换:未知类型二进制净生产力(NEP)遥感定量反演产品数据的打开,转换为tif,可用于通用GIS、遥感软件打开。

55 篇文章 4 订阅
8 篇文章 6 订阅

python批量转换:未知类型二进制净生产力(NEP)遥感定量反演产品数据的打开,转换为tif,可用于通用GIS、遥感软件打开。

完整实例下载:未知遥感产品数据批量解析并转换为tif

问题描述:遥感没有头文件,不能使用envi等软件直接读取,也不能用gdal读取。图像格式未知,存储方式未知(只知道行列、字节数、二进制无符号短整型)。

数据集从 1981 年 1 月 1 日开始至 2019 年 12 月 31 日,每年 365期数据。为了节省存储空间和提高下载速度,对数据进行了压缩,将一年 365 期的数据压缩成一个文件。如2019NEP.zip 文件中包含了 365 个文件。文件采用 NEP_YYYY_ddd.img 的格式命名,其中 YYYY 表示年
份,ddd 表示日序。如 NEP_2019_1.img 是 2019 年第 1 天的 NEP;NEP_2019_101.img 是 2019 年累积到 101 天的 NEP,比例因子为 0.1。将相邻两天的数据相减,可以得到日NEP值。如将从NEP_2019_101.img文件读出的值减去从 NEP_2019_100.img 文件读出的值、乘以比例因子后即为第 101 天的 NEP(g C m-2 d-1)。NEP 的正值表示生态系统吸收大气中的 CO2,NEP 的负值表示生态系统向大气排放 CO2。
数据存储方式:有符号短整型二进制文件,每个的大小为 2 字节/格点×4950 格点/行×2090 行=20691000 字节。
数据存储顺序为:BSQ
在这里插入图片描述

整个解决方案过程:
(1)确定每个像素点所占字节数:
以下代码是读取一副:影像中的总字节数,运行结果为sum。由于一幅影像是由sumPixel=“行 * 列 * 波段数” 个像素点组成。所以推断每个像素点由"sum/sumPixel"字节组成。

# -*- coding: utf-8 -*-
import numpy as np
def test_readbil():
    dir =r"C:\Users\HP\Desktop\imgFolder\NEP_2019_364.img"
    f = open(dir,'rb')
    n = 0
    while True:
        s = f.read(1)
        if s == b"":
            break
        n = n+1
    print(n)   #输出:42105600

(2)读取并转存为tif格式图像

由于存储方式未知,所以根据以下三种存储格式进行测试:
一、BIL(Band Interleaved by Line):按照存储完一行的所有波段再存储下一行的存储方法。
二、BSQ格式(Band Sequential Format):按照存储完单波段整幅图像后再存储下一波段整幅的存储方法。(一般为该方法)。
三、BIP格式(Band Interleaved by Pixel):按照一个像素所有波段进行存储完,再存储下一个像素所有波段的存储方法。

import numpy as np
import gdal
import os

# 依据BSQ存储规则,按照存储完单波段整幅图像后再存储下一波段的存储方法进行提取并存入数组。
def read_as_bsq(dataarr,bands, rows, col):
    imgarr = np.zeros((bands,rows,col))
    for b in range(bands):              #取出每个波段
        start = b * rows * col
        end = start + rows * col
        arrtem = dataarr[start:end]
        for r in range(rows):           #一维数组按行取出,存入对应三维数组。
            start2 = r * col
            end2 = start2 + col
            imgarr[b,r,:] = arrtem[start2:end2]
    return  imgarr


def test_writetotif(img_dir,tif_savedir):
    #读取二进制数据并转换成Int16类型的数组
    #img_dir = r"C:\Users\HP\Desktop\imgFolder\NEP_2019_364.img"
    f = open(img_dir, 'rb')
    #数据提取关键代码:
    省略(联系我)

    #将提取的数组存储为tif格式图像.
    #注意这里未设置地理坐标和仿射变换信息,所以不能用ENVI等软件打开。
    #tif_savedir = r"C:\Users\HP\Desktop\tifFolder\NEP_2019_364.tif"
    datatype = gdal.GDT_Int16   #gdal.GDT_UInt16
    bands, high, width = imgarr.shape
    driver = gdal.GetDriverByName("GTiff")
    datas = driver.Create(tif_savedir, col, rows, bands, datatype)

    #设置地理坐标和仿射变换信息
    # datas.SetGeoTransform(image_geotrans)
    # datas.SetProjection(image_projetion)
    for i in range(bands):
        datas.GetRasterBand(i + 1).WriteArray(imgarr[i])
    del datas
    #print("save succfully")

if __name__ =="__main__":
     test_writetotif(imgPath, tifPath)

如果有疑问或者需要相关批量的遥感功能,请私信联系我。

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

木易GIS

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

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

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

打赏作者

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

抵扣说明:

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

余额充值