前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >matlab、python矩阵导入ArcGIS(绘制空间图)

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

原创
作者头像
用户6841540
发布2024-08-14 09:14:06
1880
发布2024-08-14 09:14:06

对于一些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:\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)

后面根据需要进行后续操作,比如我的需要重分类一下才能看出区别。

示例程序

代码语言:matlab
复制
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);

参考博客1

参考博客2

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 解决办法
    • 对应关系
    • python代码
      • 示例程序
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档