python 多数据输出到txt_【Python】利用Python将txt格式数据转换为asc并在ArcGIS中显示(后附代码)...

作者: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的一个二维数组,每行分别代表的是行号、横坐标、纵坐标以及对应数值。

1-1.png

2、接着分别计算横坐标、纵坐标的最大值和最小值,并根据绘制单元的大小(cellsize)构建序列等差序列,得到一个n*m的矩阵。我的数据cellsize为10m,转化后为(279,486)的矩阵。

初始化矩阵tar_df,给矩阵初始值都赋值为-9999。

2-1.png

3、由于目标矩阵行索引为0~278,列索引为0~485,因此将原始数据的横坐标和纵坐标也缩放到这个范围内。缩放的公式为:

对于横坐标,从左往右依次增大的,公式为:

3.png

对于纵坐标,从上往下是依次减小的,公式为:

4.png

4、利用zip函数将(index_x,index_y)值成对打包为索引值。遍历所有行数,将每一行的Z值添加到目标矩阵tar_df相应的坐标。

5.png

三、文件输出

5、构建.asc网格文件的头文件header。

6.png

6、输出文件

7.png

四、Arcgis展示

利用Arcgis打开.asc文件,设置颜色映射后,结果如图所示。

8.png

注意事项:构建目标矩阵时,需要提前判断横纵坐标的变化规律,本文的纵坐标是从上到下递减的,因此索引的时候需要用(总行数-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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值