作者:Allen
关键词:Python;ASCII;ArcGIS;txt;数组;
最近小编接到一个任务是将txt格式的数据处理后在arcgis中进行展示,即将数据转化为二维的栅格数据。栅格数据是由若干行或列的单元或者像素构成的二维矩阵,每个单元代表一个数值。栅格数据大多数以图片的形式进行存储和表达,但是也可以通过ASCII文本文件进行存储。接下来将分享将txt转化为asc的方法及注意事项:
一、ASCII网格文件的构成
ASCII网格文件格式由Esri发明,一个ASCII网格文件就是包含行列(x,y)值的简单文本,栅格数据的空间信息由头文件(header)进行说明,其格式如下:
ncols
value
列的数目
nrows
value
行的数目
xllcorner
value
网格左下角x坐标
yllcorner
value
网格左下角y坐标
cellsize
value
绘制区域单元大小
NODATA_value
value
无数据值(通常为-9999)
构建前需要提前计算头文件的参数。
二、文件处理
1、首先导入txt文本数据,我的数据是51265*4的一个二维数组,每行分别代表的是行号、横坐标、纵坐标以及对应数值。
2、接着分别计算横坐标、纵坐标的最大值和最小值,并根据绘制单元的大小(cellsize)构建序列等差序列,得到一个n*m的矩阵。我的数据cellsize为10m,转化后为(279,486)的矩阵。
初始化矩阵tar_df,给矩阵初始值都赋值为-9999。
3、由于目标矩阵行索引为0~278,列索引为0~485,因此将原始数据的横坐标和纵坐标也缩放到这个范围内。缩放的公式为:
对于横坐标,从左往右依次增大的,公式为:
对于纵坐标,从上往下是依次减小的,公式为:
4、利用zip函数将(index_x,index_y)值成对打包为索引值。遍历所有行数,将每一行的Z值添加到目标矩阵tar_df相应的坐标。
三、文件输出
5、构建.asc网格文件的头文件header。
6、输出文件
四、Arcgis展示
利用Arcgis打开.asc文件,设置颜色映射后,结果如图所示。
注意事项:构建目标矩阵时,需要提前判断横纵坐标的变化规律,本文的纵坐标是从上到下递减的,因此索引的时候需要用(总行数-1)-相应的索引值。
希望小编的分享能够帮助到各位~
本文作者:Allen
后有彩蛋,代码全文:
完整代码如下:
“””
处理.OUT格式的数据,并转为.asc格式
“””
import os
import numpy as np
import pandas as pd
# 设置工作路径
os.chdir(r”C:\Users\64980\Desktop\pic_4″)
# 设置输出文件名称
Out_File = [“a20_1.asc”, “a20_2.asc”, “a50_1.asc”, “a50_2.asc”, “a100_1.asc”, “a100_2.asc”]
# 处理函数
def txt2asc(i):
“””
将txt格式的数据整理成asc格式的数据,并输出。
:param i: 索引的第i个文件
:return:
“””
data=pd.read_csv(file_useful[i],sep=’\s+’,header=’infer’, skiprows=1,names=[“No”,”X”,”Y”,”Z”])
data = data.drop(“No”,axis=1)
print(data)
# 最大范围网格
min_x, max_x = min(data[‘X’]), max(data[‘X’])
min_y, max_y = min(data[‘Y’]), max(data[‘Y’])
# 计算网格总数
x = np.arange(min_x, max_x+10, 10)
y = np.arange(min_y, max_y+10, 10)
# 构建初始网格矩阵
target = np.ones((np.shape(y)[0], np.shape(x)[0]), dtype=np.float)
target[::] = -9999
tar_df = pd.DataFrame(target)
# tar_df
# 索引对应网格号(x,y)
index_x = np.array(((data[‘X’] – min_x)/10).astype(“int”))
# 纵坐标从上往下依次减小
index_y = (np.shape(y)[0] – 1) – np.array(((data[‘Y’] – min_y)/10).astype(“int”))
# 多重索引
t = 0
for item in zip(index_y, index_x):
tar_df.iloc[item[0], item[1]] = data[‘Z’][t]
# print([i[0], i[1]])
t += 1
# .asc头文件
header = “ncols {}\n”.format(tar_df.shape[1])
header += “nrows {}\n”.format(tar_df.shape[0])
header += “xllcorner {}\n”.format(min_x)
header += “yllcorner {}\n”.format(min_y)
header += “cellsize {}\n”.format(10.0)
header += “NODATA_value {}\n”.format(-9999.0000)
# print(header)
# 写入grids
with open(Out_File[i],”wb”) as f:
f.write(bytes(header,”UTF-8″))
np.savetxt(f,tar_df,fmt=”%1.4f”)
print(“完成{}文件的输出”.format(Out_File[i]))
# 导入数据
file_useful = [f for f in os.listdir() if “OUT” in f]
# print(file_useful)
for i in range(6):
# 处理函数
txt2asc(i)