matlab、python矩阵导入ArcGIS(绘制空间图)

2024-08-14 09:14:06 浏览数 (1)

对于一些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等,还是看别人当初怎么定义的

注意:
  1. 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

0 人点赞