ASCII 文件与 TIFF 文件互转(Python 实现)(2023/03/09)
创始人
2024-05-31 11:39:10
0

ASCII 文件与 TIFF 文件互转(Python 实现)

文章目录

  • ASCII 文件与 TIFF 文件互转(Python 实现)
    • 1. 环境
      • 1.1 Linux
      • 1.2 Windows
    • 2. 代码

1. 环境

1.1 Linux

$ pip3 install --index-url https://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com rioxarray

1.2 Windows

  1. 在Archived: Python Extension Packages for Windows - Christoph Gohlke (uci.edu)库中下载对应 python 版本的 GDAL 与 Rasterio 离线包,以 python3.10 为例:
    1. https://download.lfd.uci.edu/pythonlibs/archived/GDAL-3.4.3-cp310-cp310-win_amd64.whl
    2. https://download.lfd.uci.edu/pythonlibs/archived/rasterio-1.2.10-cp310-cp310-win_amd64.whl
  2. 安装
$ pip3 install GDAL-3.4.3-cp310-cp310-win_amd64.whl$ pip3 install rasterio-1.2.10-cp310-cp310-win_amd64.whl$ pip3 install --index-url https://mirrors.aliyun.com/pypi/simple --trusted-host mirrors.aliyun.com rioxarray

2. 代码

#!/usr/bin/python3
# -*- encoding: utf-8 -*-
"""
@File    :   gis_util.py
@Desc    :   GIS 文件格式转换工具
@Version :   v1.0
@Time    :   2023/02/23
@Author  :   xiaoQQya
@Contact :   xiaoQQya@126.com
"""
import numpy as np
import rioxarray
import xarray as xrdef ascii_to_tiff(asc_path: str, tif_path: str, tif_attrs: dict = {}) -> None:"""ASCII 文件转 TIFF 文件:param asc_path: ASCII 文件路径, 例如: ./test.asc:type asc_path: str:param tif_path: TIFF 文件输出路径, 例如: ./test.tif:type tif_path: str:param tif_attrs: TIFF 文件属性, 例如: {"unit": "m"}, defaults to {}:type tif_attrs: dict, optional"""# 获取 ASCII 文件前 6 行属性值attrs: dict = {}with open(asc_path, "r") as file:for _ in range(6):line: str = file.readline().strip().split(" ")attrs[line[0].lower()] = eval(line[-1])if "xllcenter" not in attrs.keys():attrs["xllcenter"] = attrs["xllcorner"] + 0.5 * attrs["cellsize"]attrs["yllcenter"] = attrs["yllcorner"] + 0.5 * attrs["cellsize"]# 计算每个点经纬度坐标longitudes = [attrs["xllcenter"] + i * attrs["cellsize"] for i in range(attrs["ncols"])]latitudes = [attrs["yllcenter"] + i * attrs["cellsize"] for i in range(attrs["nrows"])]latitudes.reverse()# 读取 ASCII 文件矩阵数值data = np.loadtxt(asc_path, skiprows=6)data[data == attrs["nodata_value"]] = np.nanda = xr.DataArray(data, coords=[latitudes, longitudes], dims=["y", "x"])# 设置 TIFF 文件属性值tif_attrs["NODATA_VALUE"] = attrs["nodata_value"]da.attrs = tif_attrs# 设置 TIFF 文件参考系信息rioxarray.raster_array.RasterArray(da)da.rio.write_crs("epsg:4326", inplace=True)da.rio.to_raster(tif_path)def tiff_to_ascii(tif_path: str, asc_path: str) -> None:"""TIFF 文件转 ASCII 文件:param tif_path: TIFF 文件路径, 例如: ./test.tif:type tif_path: str:param asc_path: ASCII 输出文件路径, 例如: ./test.asc:type asc_path: str"""# 读取 TIFF 文件tif = rioxarray.open_rasterio(tif_path)shape = tif.rio.shapetransform = tif.rio.transform()# 获取 ASCII 文件前 6 行属性attrs: dict = {}attrs["ncols"] = shape[1]attrs["nrows"] = shape[0]attrs["xllcorner"] = transform[2]attrs["yllcorner"] = transform[5] + shape[0] * transform[4]attrs["cellsize"] = transform[0]attrs["nodata_value"] = tif.rio.nodata if tif.rio.nodata else -9999# 获取数据data = tif.values[0]data[np.isnan(data)] = attrs["nodata_value"]# 写入文件with open(asc_path, "w") as file:for key, value in attrs.items():file.write(f"{key.upper():14}{value}\n")np.savetxt(fname=file, X=data, fmt="%.2f")if __name__ == "__main__":ascii_to_tiff("./ascs/dem.asc", "./tifs/dem.tif", {"UNIT": "m"})tiff_to_ascii("./tifs/dem.tif", "./ascs/dem2.asc")

注意:ASCII 文件与 TIFF 文件除了存在格式差异,还存在元空间表达方式的差异。ASCII 文件坐标值在像元的左下角,而 TIFF 文件坐标值在像元的左上角,因此在格式转换时需要注意坐标转换问题。

参考资料:

  • 使用python转换netCDF与GeoTIFF格式_沉研的博客-CSDN博客
  • Getting Started — rioxarray 0.13.3 documentation (corteva.github.io)
  • 学习笔记 | Python处理矢栅数据(1)_open_rasterio翻转_GeoSuper的博客-CSDN博客
  • 学习笔记 | Python处理矢栅数据(2)_python处理 osgb_GeoSuper的博客-CSDN博客
  • 利用Python+GDAL的脚本模式实现的一些基础gis功能集合_前端hsp矢量数据_一指流沙叹风华的博客-CSDN博客

相关内容

热门资讯

安卓系统模拟win7,轻松实现... 你有没有想过,在安卓手机上也能体验Windows 7的韵味呢?没错,这就是今天我要跟你分享的神奇之旅...
安卓系统查公交车 你有没有想过,在繁忙的都市生活中,如何轻松地查找到你心仪的公交车呢?别急,今天就来给你支个招——利用...
强悍的安卓10系统下载,强悍性... 你有没有听说最近安卓系统又升级啦?没错,就是那个强悍的安卓10系统!你是不是已经迫不及待想要体验一下...
安卓不开机怎么重置系统,轻松恢... 手机突然不开机了,是不是心里慌得一批?别急,今天就来教你一招,让你的安卓手机重置系统,恢复活力! 一...
安卓怎么移植到苹果系统,揭秘跨... 你是不是也和我一样,手里拿着安卓手机,却对那苹果系统的诱惑无法抗拒?想要把安卓上的宝贝应用和资料搬到...
安卓9系统特点在哪,系统革新与... 你有没有发现,你的安卓手机最近是不是变得有点不一样了?没错,就是那个默默无闻的安卓系统,它悄悄地升级...
苹果手机系统操作安卓版,轻松迁... 你有没有想过,为什么苹果手机的系统那么受欢迎,而安卓版却总是被大家调侃呢?今天,就让我带你从多个角度...
麦芽安装安卓系统怎么安装,轻松... 你有没有想过,把安卓系统装到麦芽上,是不是就像给老式收音机配上蓝牙功能那么酷炫呢?想象你的麦芽设备瞬...
直板安卓系统手机游戏,直板安卓... 你有没有发现,最近手机游戏界又掀起了一股热潮?没错,就是那些让你一玩就停不下来的直板安卓系统手机游戏...
nolia是安卓系统吗,安卓系... 你有没有听说过Nolia这个操作系统?最近它在科技圈里可是小火了一把呢!很多人都在问,Nolia是安...
改善后的安卓系统,探索安卓系统... 你知道吗?最近安卓系统可是来了一次大变身,简直就像是换了个新灵魂一样! 作为一个紧跟科技潮流的数码达...
安卓系统小票机如何使用,轻松实... 你有没有想过,在繁忙的超市、商场或者餐厅,那些快速打印出小票的机器竟然是运行在安卓系统上的呢?没错,...
rm1090刷安卓系统 你有没有想过,给手机换个新系统,就像给它换了个新灵魂?今天,就让我带你一起探索如何用rm1090刷安...
369出行安卓系统,智慧导航新... 你有没有发现,最近出行软件界又掀起了一股热潮?没错,就是那个备受瞩目的369出行安卓系统!今天,就让...
韩国请假系统下载安卓版,享受便... 你知道吗?最近有个超级实用的韩国请假系统在咱们安卓用户中传得沸沸扬扬的!这个系统不仅操作简单,而且功...
支持安卓2.2系统的apk,兼... 你有没有想过,手机上的那些老古董应用,竟然还能在最新的安卓系统上运行?没错,就是那些支持安卓2.2系...
老款奥迪升级安卓系统 你有没有想过,你的老款奥迪也能焕发青春呢?没错,就是那个陪伴你走过风风雨雨的老伙计,现在有了升级安卓...
安卓系统只有英文翻译,Andr... 你知道吗?在咱们这个科技飞速发展的时代,手机已经成了我们生活中不可或缺的好伙伴。而说起手机,安卓系统...
安卓电视装苹果系统教程,轻松实... 亲爱的电视迷们,你是否曾梦想过在安卓电视上体验苹果系统的流畅与优雅?别再羡慕了,今天就来手把手教你如...
安卓系统换电池的方法 手机用久了,电池续航能力大不如前,是不是你也想给安卓手机来个“换血重生”呢?别急,今天就来手把手教你...