tif转ascii或者ascii转tif
1 ArcGIS操作
1)基于Raster to ASCII,同一遥感影像图.tif转换为.asc文件后,再将.asc文件加载到Arcmap,其字段值为什么发生了变化?
2)转换方法
(1)栅格转 ASCII
摘要
用法
- 输入栅格数据集可以是任意有效的栅格数据集。
- ASCII 文件的结构由包含一系列关键字的文件头信息组成,后跟以行优先顺序排列的像元值。
文件的格式一般为:
NCOLS xxx
NROWS xxx
XLLCORNER xxx
YLLCORNER xxx
CELLSIZE xxx
NODATA_VALUE xxx
row 1
row 2
.
.
row n
关键字的定义如下:
- NCOLS 和 NROWS 是由 ASCII 文件所定义的栅格的列数和行数。
- XLLCORNER 和 YLLCORNER 是左下角栅格像元的左下角坐标。
- CELLSIZE 是栅格像元的大小。
- NODATA_VALUE 是用于表示 NoData 像元的值。
在像元值数据流中,数据的第一行在栅格顶部,第二行在第一行下边,依此类推。
- 以下是 ASCII 栅格文件的一个示例:
- NCOLS 480
- NROWS 450
- XLLCORNER 378922
- YLLCORNER 4072345
- CELLSIZE 30
- NODATA_VALUE -32768
- 43 2 45 7 3 56 2 5 23 65 34 6 32 54 57 34
35 45 65 34 2 6 78 4 2 6 89 3 2 7 45 23 5 …
- NODATA_VALUE 是 ASCII 文件中表示输入栅格中 NoData 像元的值。此值通常留给那些“真”值未知的像元专用。
- 在该文件中,每行栅格数据的末尾均以回车符号结尾。
- 整型和浮点型栅格均可转换为 ASCII 栅格文件。
- 此工具只将左下角像元的左下角作为原点写入。ASCII 转栅格工具也支持将左下角像元的中心作为原点。
语法
RasterToASCII_conversion (in_raster, out_ascii_file)
参数 | 说明 | 数据类型 |
---|---|---|
in_raster | 输入栅格数据集。 栅格数据可为整型或浮点型。 |
Raster Layer |
out_ascii_file | 输出 ASCII 栅格文件。 | File |
代码实例
RasterToASCII 示例(Python 窗口)
将栅格数据集转换为可表示栅格数据的 ASCII 文件。
import arcpy
from arcpy import env
env.workspace = “c:/data”
arcpy.RasterToASCII_conversion(“elevation”, “c:/output/sa500.asc”)
RasterToASCII 示例(独立脚本)
将栅格数据集转换为可表示栅格数据的 ASCII 文件。
# Name: RasterToASCII_Ex_02.py
# Description: Converts a raster dataset to an ASCII file representing
# raster data.
# Requirements: None
# Import system modules
import arcpy
from arcpy import env
# Set environment settings
env.workspace = “C:/data”
# Set local variables
inRaster = “elevation”
outASCII = “c:/output/elevation.asc”
# Execute RasterToASCII
arcpy.RasterToASCII_conversion(inRaster, outASCII)
环境
3)问题
(1)Arcmap中栅格数据转ASCII的问题
Arcmap中将栅格数据转为ASCII文件可通过工具包中Conversion Tools-Raster to ASCII,会自动把栅格数据中NODATA值转为-9999,在使用txt文件时,直接忽略即可。
2 gdal
1)如何将TIFF格式的DEM数据转换成ASCII格式的数据
在linux下操作如下:
安装GDAL,使用gdal_translate,方法如下:
gdal_translate -of AAIGrid ASTGTM_N22E103_dem.tif test.asc
其中-of为指定输出格式,gdal_translate支持多种格式互转,AAIGrid为Arc/Info ASCII Grid数据,ASTGTM_N22E103_dem.tif为tiff格式的dem数据文件,test.asc为输出文件。
test.asc为文本文件,可以打开查看,其中包含有5~6行的头信息,主要内容如下:
ncols 3601 —-》行数
nrows 3601 —-》列数
xllcorner 102.999861111111 —-》x轴起点坐标,单位°
yllcorner 21.999861111111 —-》y轴起点坐标,单位°
cellsize 0.000277777778 —-》采样间隔,单位°,精度大概30m
之后是按行存储的数据,每一行即是相同经度不同纬度并以空格分隔的高程数值,行与行之间用回车分开。
3 Python处理
1)Python 对ASCII文件(及TIF文件)进行批量掩模裁剪
第一步:ASCII转TIF文件
在裁剪时我们要用到Toolbox中的工具Extract By Mask,而这个工具在python的程序语言中体现出来就是
out_extract = arcpy.sa.ExtractByMask(ras, mask) #执行按掩模提取操作
官方对于 ExtractByMask工具 的描述请看 按掩膜提取
对于ExtractByMask工具,要求输入的被裁减的文件和掩膜文件都是raster格式
需要做的第一步就是将asc文件转化为raster格式的文件,下边是经本人修改调试过的程序,一并附上最初参考的链接: ArcGIS 10 影像、栅格数据格式批量转换(https://blog.csdn.net/mygisforum/article/details/8262450?utm_source=blogxgwz9
)
# Import system modules
import sys, string, os #加载工具包
dir = ‘C:/Users/DELL/Documents/ArcGIS/Budyko_ds/MODIS_asc’ #工作环境
# Import arcpy module
import arcpy
files = os.listdir(dir)
for f in files: #遍历文件
if os.path.splitext(f)[1] == ‘.asc’:
# Script arguments…
Input_raster_file = dir + os.sep + f
# Local variables…
Output_data_type = “DOUBLE”
Raster_Format = “TIFF”
Output_Workspace = “C:/Users/DELL/Documents/ArcGIS/Budyko_ds/Conversion”
# =============== file name process ======================
basename = os.path.splitext(f)[0];
Output_raster = Output_Workspace + os.sep + basename + “.tif”;
if os.path.exists(Output_raster) == False:
print Input_raster_file
# Process: Raster To Other Format (multiple)…
arcpy.RasterToOtherFormat_conversion(Input_raster_file,
Output_Workspace, Raster_Format)
print Output_raster
print(“ALL DONE”)
所以只需要对上边程序进行修改,就将asc文件批量转为Tif文件(转为Tif是方便进行掩模裁剪, 有效的栅格类型包含TIF ——栅格数据集的标记图像文件,但不非得转成TIF,其他栅格文件也行官方对于ListRasters的定义和描述)
第二步:TIF文件的裁减
接下来就是裁减了,目前我亲测成功是以下三个链接中的第三个,现将修改后的代码附上:
利用ArcGIS Python批量拼接裁剪遥感影像(arcpy batch processing)- https://blog.csdn.net/gisboygogogo/article/details/75195760
ArcGIS Python使用及批量裁剪示例-https://blog.csdn.net/dou3516/article/details/82762789
利用python在gis中实现批量化影像裁剪(https://jingyan.baidu.com/article/22fe7ceddc632b3002617f3a.html
)
import arcpy
arcpy.CheckOutExtension(“spatial”) #检查有没有授权ArcGIS Spatial Analyst 扩展模块,没有则授权
arcpy.gp.overwriteOutput=1
arcpy.env.workspace = “C:/Users/DELL/Documents/ArcGIS/Budykods/Conversion”
rasters = arcpy.ListRasters(“*”, “tif”)
mask= “C:/Users/DELL/Documents/ArcGIS/Budyko_ds/Conversion/c630_Australia_614006_Bounda5.shp”
for raster in rasters:
print(raster)
out= “C:/Users/DELL\Documents/ArcGIS/Budyko_ds/Extraction/“+”clip“+raster
arcpy.gp.ExtractByMasksa(raster, mask, out)
print(“clip“+raster+” has done”)
print(“All done”)
需要注意的是:
把边界和待裁剪的栅格数据放到一个文件下!
把边界和待裁剪的栅格数据放到一个文件下!
把边界和待裁剪的栅格数据放到一个文件下!
[经验总结] 栅格数据批量裁剪–Python脚本
原因是:如果在不同文件夹,就得切换程序的工作环境,很麻烦
另外还需注意的是自己的边界文件(掩膜文件)是个线文件还是面文件,如果只是一条线,得到的就是下图中的那条彩色栅格环,但如果想要裁下来一个面的话就要将线用Arcgis中 Feature To Polygon 工具将之转换为面的shp文件~,可以参考
Python 批量将线元素转化为面元素
4.这样我们就完成了对于上百个asc文件的掩膜裁减任务:
最后得到的结果图(只展示一个流域):
10.lidar转换
1)TIFF转换为ASCII
功能概述
转换TIFF为ASCII工具可用于将TIFF格式的栅格图像转换为ASCII格式。
用法
参数设置
- 输入Tiff文件:用户可以从下拉列表中选择需要处理的文件到待处理列表中。
- :用户可以从外部添加待转换的文件数据。
- :用户可以选中列表中的某一个文件数据,点击该按钮将该文件从列表中移除。
- :点击该按钮可清空全部列表中的数据。
- 输出路径:输出文件夹路径,功能执行后生成转换后的新文件。