当前位置: 首页 > news >正文

ASCII 文件与 TIFF 文件互转(Python 实现)(2023/03/09)

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博客

相关文章:

ASCII 文件与 TIFF 文件互转(Python 实现)(2023/03/09)

ASCII 文件与 TIFF 文件互转(Python 实现) 文章目录ASCII 文件与 TIFF 文件互转(Python 实现)1. 环境1.1 Linux1.2 Windows2. 代码1. 环境 1.1 Linux $ pip3 install --index-url https://mirrors.aliyun.com/pypi/simple --tru…...

思科模拟器 | 交换机与路由器的配置汇总【收藏备用】

文章目录一、vlan配置【实现同一vlan的主机通信】1、基本配置和接线2、vlan配置与端口连接3、测试连接二、truck配置【实现连接在不同交换机上的同一vlan的主机通信】1、基本配置和接线2、vlan配置与端口连接3、打truck做连接3、测试连接三、静态路由配置1、自定义IP地址2、基本…...

电子台账:软件运行环境要求与功能特点

1 运行环境要求为满足大部分应用环境,软件开发时综合考虑各种各种不同因素影星,包括:操作系统、硬件、辅助软件、安装、运行、补丁、数据库、网络、人员等因素。目前台账软件需求为:操作系统:目前能运行的任意版本wind…...

计算机科学导论笔记(六)

目录 八、算法 8.1 概念 8.1.1 非正式定义 8.1.2 示例 8.1.3 定义动作 8.1.4 细化 8.1.5 泛化 8.2 三种结构 8.2.1 顺序 8.2.2 判断 8.2.3 循环 8.3 算法的表示 8.3.1 UML 8.3.2 伪代码 8.4 更正式的定义 8.5 基本算法 8.5.1 求和 8.5.2 求积 8.5.3 最大和最…...

嵌入式从业10年,聊聊我对工业互联网和消费物联网的看法 | 文末赠书4本

嵌入式从业10年,聊聊我对工业互联网和消费物联网的看法 工业互联网和消费物联网,有何异常点?本文,博主将结合自己的亲身经历,现身说法,聊聊博主对工业互联网和消费物联网的看法。 文章目录1 写在前面2 我眼…...

python的django框架从入门到熟练【保姆式教学】第一篇

当今,Python已成为最受欢迎的编程语言之一。而Django是一个基于Python的Web框架,它能够帮助你快速、高效地开发Web应用程序。如果你是一名初学者,学习Django框架可能会让你感到有些困惑。不过,不用担心,我们将为你提供…...

浏览记录或者购物车的去重处理

saveHistory(){// 获取缓存数据let historyArr uni.getStorageSync(historyArr) || []//需要添加的数据let item{id:this.detail.id,classid:this.detail.classid,title:this.detail.title,picurl:this.detail.picurl,looktime:parseTime(Date.now())};// forEach和findIndex的…...

Ubantu docker学习笔记(二)拉取构建,属于你的容器

文章目录一、拉取启动容器二、本地镜像初解三、构建镜像3.1使用docker commit构建镜像切换阿里镜像3.2使用dockerfile构建镜像四、总个结吧这里的话,就详细说说小唐对于容器的配置,对了!小唐参考的书籍是Linux容器云实战!&#xf…...

指针数组 数组指针 常量指针 指针常量 函数指针 指针函数

一、指针常量与常量指针 1、指针常量 本质上是一个常量,常量的类型是指针,表示该常量是一个指针类型的常量。在指针常量中,指针本身的值是一个常量,不可以改变,始终指向同一个地址。在定义的时候,必须要初…...

前端js学习

1. js入门 1.1 js是弱类型语言 1.2 js使用方式 1.2.1 在script中写 1.2.2 引入js文件 1.2.3 优先级 1.3 js查错方式 1.4 js变量定义 1.4 js数据类型 数据类型英文表示示例数值类型number1.1 1字符串类型string‘a’ ‘abc’ “abc”对象类型object布尔类型booleannumber函数…...

“华为杯”研究生数学建模竞赛2007年-【华为杯】A题:食品卫生安全保障体系数学模型及改进模型(附获奖论文)

赛题描述 我国是一个拥有13亿人口的发展中国家,每天都在消费大量的各种食品,这批食品是由成千上万的食品加工厂、不可计数的小作坊、几亿农民生产出来的,并且经过较多的中间环节和长途运输后才为广大群众所消费,加之近年来我国经济发展迅速而环境治理没有能够完全跟上,以至…...

转战C#---day2

定义数组: using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace Relay_Sin_Com {class Program{static void Main(string[] args){int[] ages1 {3240,242,34};Console.WriteLine(age…...

【vue2源码学习】— diff

vue更新还是调用了 vm._update 会进入下面这一步 vm.$el vm.__patch__(prevVnode, vnode) 又回到了patch方法 会通过sameVnode 判断是不是相同的vnode// patch代码片段 const isRealElement isDef(oldVnode.nodeType) if (!isRealElement && sameVnode(oldVnode, vno…...

更换 Linux 自带的 jdk 环境

如下,我要把 Linux 默认的 jdk 版本换成我自己的 jdk 版本。 Linux 自带的 jdk 环境: 要更换的 jdk 环境: 1、切换到 root 用户进行操作; 2、在根目录下创建一个 /export/server/ 目录; [rootcentos /]# mkdir -p /e…...

MySQL8读写分离集群

文章目录前言MySQL读写分离原理搭建MySQL读写分离集群MySQL8.0之前MySQL8.0之后后记前言 上一期介绍并实现了MySQL的主从复制,由于主从复制架构仅仅能解决数据冗余备份的问题,从节点不对外提供服务,依然存在单节点的高并发问题 所以在主从复…...

蓝桥冲刺31天之第七天

目录 A:三角回文数 B:数数 C:数组切分 D:倍数问题 一星陨落,黯淡不了星空灿烂; 一花凋零,荒芜不了整个春天。 如果命运是世界上最烂的编剧, 你就要争取做人生最好的演员。 即使生…...

【Python百日进阶-Web开发-Vue3】Day550 - Vue3 商城后台 10:Veux4-02基本使用

文章目录 二、Vuex的基本使用2.4 Mutations 应用 :同步更新state2.4.1 `src/store/index.js`2.4.2 `src/views/index.vue`2.5 Module的应用:分模块2.5.1 `src/store/modules/product.js`2.5.2 `src/store/modules/cart.js`2.5.3 `src/store/index.js`2.5.4 `src/views/index.…...

ESP32驱动-红外寻迹传感器驱动

红外寻迹传感器驱动 1、红外寻迹传感器介绍 红外寻迹传感器具有一对红外线发射管与接收管,发射管发射出一定频率的红外线,当检测方向遇到障碍物(反射面)时,红外线反射回来被接收管接收,经过比较器电路处理之后,输出接口会输出一个数字信号(低电平或高电平,取决于电路…...

【TS】TypeScript泛型 T 的用法详解

一、什么是泛型? 泛型,从字面上理解,泛型就是一般的,广泛的的意思。 TypeScript中泛型(Generics)是指在定义函数、接口或类的时候,不预先指定具体类型,而是在使用的时候再指定类型…...

Vue 3.0 单文件组件 【Vue3 从零开始】

#介绍 在很多 Vue 项目中,我们使用 app.component 来定义全局组件,紧接着用 app.mount(#app) 在每个页面内指定一个容器元素。 这种方式在很多中小规模的项目中运作的很好,在这些项目里 JavaScript 只被用来加强特定的视图。但当在更复杂的…...

树莓派超全系列教程文档--(61)树莓派摄像头高级使用方法

树莓派摄像头高级使用方法 配置通过调谐文件来调整相机行为 使用多个摄像头安装 libcam 和 rpicam-apps依赖关系开发包 文章来源: http://raspberry.dns8844.cn/documentation 原文网址 配置 大多数用例自动工作,无需更改相机配置。但是,一…...

Qt的学习(一)

1.什么是Qt Qt特指用来进行桌面应用开发(电脑上写的程序)涉及到的一套技术Qt无法开发网页前端,也不能开发移动应用。 客户端开发的重要任务:编写和用户交互的界面。一般来说和用户交互的界面,有两种典型风格&…...

数据结构:泰勒展开式:霍纳法则(Horner‘s Rule)

目录 🔍 若用递归计算每一项,会发生什么? Horners Rule(霍纳法则) 第一步:我们从最原始的泰勒公式出发 第二步:从形式上重新观察展开式 🌟 第三步:引出霍纳法则&…...

深入解析 ReentrantLock:原理、公平锁与非公平锁的较量

ReentrantLock 是 Java 中 java.util.concurrent.locks 包下的一个重要类,用于实现线程同步,支持可重入性,并且可以选择公平锁或非公平锁的实现方式。下面将详细介绍 ReentrantLock 的实现原理以及公平锁和非公平锁的区别。 ReentrantLock 实现原理 基本架构 ReentrantLo…...

C++中vector类型的介绍和使用

文章目录 一、vector 类型的简介1.1 基本介绍1.2 常见用法示例1.3 常见成员函数简表 二、vector 数据的插入2.1 push_back() —— 在尾部插入一个元素2.2 emplace_back() —— 在尾部“就地”构造对象2.3 insert() —— 在任意位置插入一个或多个元素2.4 emplace() —— 在任意…...

CVE-2023-25194源码分析与漏洞复现(Kafka JNDI注入)

漏洞概述 漏洞名称:Apache Kafka Connect JNDI注入导致的远程代码执行漏洞 CVE编号:CVE-2023-25194 CVSS评分:8.8 影响版本:Apache Kafka 2.3.0 - 3.3.2 修复版本:≥ 3.4.0 漏洞类型:反序列化导致的远程代…...

Linux入门课的思维导图

耗时两周,终于把慕课网上的Linux的基础入门课实操、总结完了! 第一次以Blog的形式做学习记录,过程很有意思,但也很耗时。 课程时长5h,涉及到很多专有名词,要去逐个查找,以前接触过的概念因为时…...

MLP实战二:MLP 实现图像数字多分类

任务 实战(二):MLP 实现图像多分类 基于 mnist 数据集,建立 mlp 模型,实现 0-9 数字的十分类 task: 1、实现 mnist 数据载入,可视化图形数字; 2、完成数据预处理:图像数据维度转换与…...

深入理解 C++ 左值右值、std::move 与函数重载中的参数传递

在 C 编程中,左值和右值的概念以及std::move的使用,常常让开发者感到困惑。特别是在函数重载场景下,如何合理利用这些特性来优化代码性能、确保语义正确,更是一个值得深入探讨的话题。 在开始之前,先提出几个问题&…...

从0开始学习R语言--Day17--Cox回归

Cox回归 在用医疗数据作分析时,最常见的是去预测某类病的患者的死亡率或预测他们的结局。但是我们得到的病人数据,往往会有很多的协变量,即使我们通过计算来减少指标对结果的影响,我们的数据中依然会有很多的协变量,且…...