土壤HWSD处理流程

任务描述

获取研究区HWSD数据集中:沙含量、淤泥含量、黏土含量、有机碳含量等。

技术流程

1.数据下载
2.影像连接数据库
3.提取所需土壤图层

1.数据下载

所需数据在寒区旱区科学数据中心下载HWSD中国土壤数据集
下载的数据包包括:数据说明pdf、img格式、mdb数据库
土壤HWSD处理流程_第1张图片

2.影像连接数据库

*比较关键的处理步骤为:img+link+dbf数据库。个人理解:img中只是展示各类土壤的地理分布,像元值代表其土壤分类,用唯一ID值与dbf数据库的各类土壤属性相链接。具体操作可以参考链接

3.提取所需土壤图层

代码思路是:逐像元读取土壤ID→凭借ID读取excel表中对应土壤属性值→将属性值赋值给像元生成新的土壤图层影像
*土壤属性表格(自己整理出来)
土壤HWSD处理流程_第2张图片
具体代码:

# 读写遥感数据

import gdal
import numpy as np
from collections import Counter

import xlrd #导入操作excel的库
import xlwt
import os

excel = xlrd.open_workbook('F:\\土壤数据\\白银WHSD表格数据大范围.xlsx')
table = excel.sheets() [0]#选择sheet
nrows = table.nrows #获取行数,用来指导循环多少次
print (nrows)

filename = (r'F:\\土壤数据\\HWSD_Baiyin_Clip.tif') #文件路径

data = gdal.Open(filename) #打开文件
cols = data.RasterXSize #读取图像列数
rows = data.RasterYSize #读取图像行数

im_geotrans = data.GetGeoTransform()
# 仿射矩阵,左上角像素的大地坐标和像素分辨率。
# 共有六个参数,分表代表左上角x坐标;东西方向上图像的分辨率;如果北边朝上,地图的旋转角度,0表示图像的行与x轴平行;左上角y坐标;
# 如果北边朝上,地图的旋转角度,0表示图像的列与y轴平行;南北方向上地图的分辨率。
im_proj = data.GetProjection()  # 地图投影信息
im_data = data.ReadAsArray(0, 0, cols, rows)  # 此处读取整张图像
# ReadAsArray(, , , )
# 读出从(xoff,yoff)开始,大小为(xsize,ysize)的矩阵。
#print (im_data)

del data  # 释放内存,如果不释放,在arcgis,envi中打开该图像时会显示文件被占用
print ( cols, rows)

list = []
MU_GLOBAL_List = []
T_GRAVEL_List = [] #碎石体积百分比
T_SAND_List = [] #沙含量
T_SILT_List = [] #淤泥含量
T_CLAY_List = [] #粘土含量
T_USDA_TEX_CLASS_List = [] #USDA土壤质地分类
T_REF_BULK_DENSITY_List = [] #USDA土壤质地分类
T_OC_List = [] #有机碳含量
T_PH_H2O_List = [] #酸碱度
T_CEC_CLAY_List = [] #粘性层土壤的阳离子交换能力
T_CEC_SOIL_List = [] #土壤的阳离子交换能力
T_BS_List = [] #基本饱和度
T_TEB_List = [] #交换性盐基
T_CACO3_List = [] #碳酸盐或石灰含量
T_CASO4_List = [] #硫酸盐含量
T_ESP_List = [] #可交换钠盐
T_ECE_List = [] #电导率

#读取土壤ID
for k in range(1,nrows):
    MU_GLOBAL = int(table.cell(k, 0).value)
    MU_GLOBAL_List.append(MU_GLOBAL)
    T_GRAVEL = int(table.cell(k, 1).value)
    T_GRAVEL_List.append(T_GRAVEL)
    T_SAND = int(table.cell(k, 2).value)
    T_SAND_List.append(T_SAND)
    T_SILT = int(table.cell(k, 3).value)
    T_SILT_List.append(T_SILT)
    T_CLAY = int(table.cell(k, 4).value)
    T_CLAY_List.append(T_CLAY)
    T_USDA_TEX_CLASS = int(table.cell(k, 5).value)
    T_USDA_TEX_CLASS_List.append(T_USDA_TEX_CLASS)
    T_REF_BULK_DENSITY = float(table.cell(k, 6).value)
    T_REF_BULK_DENSITY_List.append(T_REF_BULK_DENSITY)
    T_OC = float(table.cell(k, 7).value)
    T_OC_List.append(T_OC)
    T_PH_H2O = float(table.cell(k, 8).value)
    T_PH_H2O_List.append(T_PH_H2O)
    T_CEC_CLAY = int(table.cell(k, 9).value)
    T_CEC_CLAY_List.append(T_CEC_CLAY)
    T_CEC_SOIL = int(table.cell(k, 10).value)
    T_CEC_SOIL_List.append(T_CEC_SOIL)
    T_BS = int(table.cell(k, 11).value)
    T_BS_List.append(T_BS)
    T_TEB = float(table.cell(k, 12).value)
    T_TEB_List.append(T_TEB)
    T_CACO3 = float(table.cell(k, 13).value)
    T_CACO3_List.append(T_CACO3)
    T_CASO4 = float(table.cell(k, 14).value)
    T_CASO4_List.append(T_CASO4)
    T_ESP = int(table.cell(k, 15).value)
    T_ESP_List.append(T_ESP)
    T_ECE = float(table.cell(k, 16).value)
    T_ECE_List.append(T_ECE)
#print (MU_GLOBAL_List,T_GRAVEL_List,T_SAND_List,T_SILT_List,T_CLAY_List,T_USDA_TEX_CLASS_List,T_REF_BULK_DENSITY_List,T_OC_List,
#           T_PH_H2O_List,T_CEC_CLAY_List,T_CEC_SOIL_List,T_BS_List,T_TEB_List,T_CACO3_List,T_CASO4_List,T_ESP_List,T_ECE_List)


for col in range (rows):
    for row in range (cols):
        value = im_data[col][row]
        list.append(value)
        for k in range(1, nrows):
            MU_GLOBAL = int(table.cell(k, 0).value)
            if value == MU_GLOBAL:
                NewValue = int(table.cell(k, 2).value) #沙含量
                #im_data = im_data.astype(np.float) #强行转换为float格式
                im_data[col][row] = NewValue
            else:
                continue
#print (im_data)
#print (list)
#result = Counter(list)# 统计不同土壤类型出现的次数,即区域内有多少类型的土壤
#print (result)


driver = gdal.GetDriverByName('GTiff')  # 数据类型必须有,因为要计算需要多大内存空间
#data = driver.Create('F:\\土壤数据\\有机碳含量.tif', cols, rows, 1,gdal.GDT_Float32 ) #用来输出浮点型影像
data = driver.Create('F:\\土壤数据\\沙含量.tif', cols, rows) #用来输出整型影像
data.SetGeoTransform(im_geotrans)  # 写入仿射变换参数
data.SetProjection(im_proj)  # 写入投影
data.GetRasterBand(1).WriteArray(im_data)  # 写入数组数据

del data

注:
*im_data = im_data.astype(np.float) #强行转换为float格式
此句为强行转化为float格式,因为im_data最开始读取的img格式为整型,当土壤属性值为整数时,可以正常读写;但当土壤属性值为浮点型时,则输出图像还未整型,值错误,所以要进行强行转化。

*data = driver.Create(‘F:\土壤数据\有机碳含量.tif’, cols, rows, 1,gdal.GDT_Float32 ) #用来输出浮点型影像
此句与上句配套,以便合适输出浮点型影像。

你可能感兴趣的:(土壤HWSD处理流程)