对于一些nc数据或者遥感影像处理时,虽然一些第三方软件可以出图,但我们往往需要借助python或者matlab软件进行数据处理,但最后保存下来数据如何导入arcgis进行分析呢?
存为txt文件或者dat文件。
% 将result变量保存为result.dat
save result.dat result -ASCII;
保存结果(以提取黄河流域mask为例,图中1就是提取出的流域,已存为txt格式数据)
变量 | 对应含义 |
---|---|
ncols | 列数 |
nrows | 行数 |
xllcorner | 起始经度 |
yllcorner | 起始维度 |
cellsize | 格网的空间分辨率,以上面为例就是分辨率为0.0833333 |
NODATA_value | 代表没有数据的值,通常为-999等,还是看别人当初怎么定义的 |
2.matlab读取nc行列会倒过来,所以处理的过程中需要调整。
% 行列互换一下
dom=permute(precipitation,[2 1 3]);
precipitation1 = dom(:,:,1);
ncols = size(precipitation, 1); % 列数
nrows = size(precipitation, 2); % 行数
precipitation1(isnan(precipitation1))=-999;
# -*- 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:\yzb\Precipitation_data\PCRGLOBWB\Pre_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)
后面根据需要进行后续操作,比如我的需要重分类一下才能看出区别。
clc;close all;clear;
filename1="D:\vali\Pre_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:\vali\Pre_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:\vali\Pre_poyang_yearsum_mm.txt'; % 替换成你的文件名
fid = fopen(filename, 'r');
originalContent = fread(fid, '*char');
fclose(fid);
% 将内容写入新文件
newFilename = 'new_file.txt'; % 替换成输出的新文件名
fid = fopen(newFilename, 'w');
% 将内容写入新文件
fprintf(fid, '%s\n', content');
% 将原始文件内容写入新文件
fwrite(fid, originalContent', 'char');
fclose(fid);
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。