对于一些nc数据或者遥感影像处理时,虽然一些第三方软件可以出图,但我们往往需要借助python或者matlab软件进行数据处理,但最后保存下来数据如何导入arcgis进行分析呢?
解决办法
存为txt文件或者dat文件。
代码语言:matlab复制% 将result变量保存为result.dat
save result.dat result -ASCII;
保存结果(以提取黄河流域mask为例,图中1就是提取出的流域,已存为txt格式数据)
对应关系
变量 | 对应含义 |
---|---|
ncols | 列数 |
nrows | 行数 |
xllcorner | 起始经度 |
yllcorner | 起始维度 |
cellsize | 格网的空间分辨率,以上面为例就是分辨率为0.0833333 |
NODATA_value | 代表没有数据的值,通常为-999等,还是看别人当初怎么定义的 |
注意:
- NODATA_value不能是nan,如果是nan值,建议转换为-999再导入arcgis中,否则会报错。
2.matlab读取nc行列会倒过来,所以处理的过程中需要调整。
代码语言:matlab复制% 行列互换一下
dom=permute(precipitation,[2 1 3]);
precipitation1 = dom(:,:,1);
ncols = size(precipitation, 1); % 列数
nrows = size(precipitation, 2); % 行数
代码语言:bash复制precipitation1(isnan(precipitation1))=-999;
python代码
代码语言:python代码运行次数:0复制# -*- coding:utf-8 -*-
# @author:Ye Zhoubing
# @datetime:2024/5/16 9:35
# @software: PyCharm
# todo:claude转换的代码,后面可以修改
from netCDF4 import Dataset
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import xlwt
import numpy as np
from scipy.stats import gamma
file = r"D:yzbPrecipitation_dataPCRGLOBWBPre_poyang.nc"
data = Dataset(file, 'r') # 读取nc文件,默认就是读,这里r可以省略
# print(data) # 可以查看到变量
# 读取相关变量
lat = data.variables['lat'][:].data # 读取纬度
lon = data.variables['lon'][:].data # 读取经度
time = data.variables['time'][:].data # 读取时间
discharge = data.variables['precipitation'][:].data # todo:这里要根据你nc文件改读取流量,流量discharge三维,分别为层数(时间),纬度、经度
discharge1 = discharge[0] # 现在就显示第一层的数据
for i in range(discharge1.shape[0]): # 行
for j in range(discharge1.shape[1]): # 列
if discharge1[i, j] == -999000000.0: # todo:同样,这里无值的值也要对应修改
discharge1[i, j] = -9999
# 保存为ASCIII编码的txt文件
np.savetxt('poyang_SRI.txt', discharge1)
# 写入其他数据
nrows = discharge1.shape[0]
ncols = discharge1.shape[1]
xllcorner = min(lon)
yllcorner = min(lat)
cellsize = 0.083333
NODATA_value = -9999
str1 = "nrows " str(nrows) "n"
str2 = "ncols " str(ncols) "n"
str3 = "xllcorner " str(xllcorner) "n"
str4 = "yllcorner " str(yllcorner) "n"
str5 = "cellsize " str(cellsize) "n"
str6 = "NODATA_value " str(NODATA_value) "n"
# 将上述字符串写入poyang_SRI.txt文件头中
with open('poyang_SRI.txt', 'r') as f:
lines = f.readlines()
lines.insert(0, str1)
lines.insert(1, str2)
lines.insert(2, str3)
lines.insert(3, str4)
lines.insert(4, str5)
lines.insert(5, str6)
with open('poyang_SRI.txt', 'w') as f:
f.writelines(lines)
print("over")
另外一种方式:参考博客
在arcgis中ASCII转栅格(ASCII to Raster)
后面根据需要进行后续操作,比如我的需要重分类一下才能看出区别。
示例程序
代码语言:matlab复制clc;close all;clear;
filename1="D:valiPre_poyang_yearsum_mm.nc";
lat = ncread(filename1, 'lat'); %读入变量lat
lon = ncread(filename1, 'lon'); %读入变量lon
time = ncread(filename1, 'time'); %读入时间
precipitation = ncread(filename1, 'precipitation'); %读入单层降水量
% 行列互换一下
dom=permute(precipitation,[2 1 3]);
precipitation1 = dom(:,:,1);
% precipitation1 = precipitation(:,:,1);
precipitation1(isnan(precipitation1))=-999;
% 将precipitation数据保存为txt文件
save('D:valiPre_poyang_yearsum_mm.txt', 'precipitation1', '-ascii');
% 定义要添加的内容
% ncols = size(precipitation, 2); % 列数
% nrows = size(precipitation, 1); % 行数
% 因为之前颠倒了,所以行列是反的
ncols = size(precipitation, 1); % 列数
nrows = size(precipitation, 2); % 行数
xllcorner = min(lon); % 起始经度
yllcorner = min(lat); % 起始纬度
cellsize = 0.08333333; % 单元大小
NODATA_value = -999; % 无效值
content = ["ncols " ncols;
"nrows " nrows;
"xllcorner " xllcorner;
"yllcorner " yllcorner;
"cellsize " cellsize;
"NODATA_value " NODATA_value;];
% 读取原始文件内容
filename = 'D:valiPre_poyang_yearsum_mm.txt'; % 替换成你的文件名
fid = fopen(filename, 'r');
originalContent = fread(fid, '*char');
fclose(fid);
% 将内容写入新文件
newFilename = 'new_file.txt'; % 替换成输出的新文件名
fid = fopen(newFilename, 'w');
% 将内容写入新文件
fprintf(fid, '%sn', content');
% 将原始文件内容写入新文件
fwrite(fid, originalContent', 'char');
fclose(fid);
参考博客1
参考博客2