一种特殊的NC文件转TIF——知道每个像元的坐标值怎么转为TIF

news2025/1/7 12:09:14

之前写过一篇文章,介绍了NetCDF文件格式,并详细讲解了如何使用Python对NetCDF文件进行读写操作,进而介绍了NetCDF文件的地理参考,最后以两个数据为例讲解了怎么将NetCDF格式的数据转GeoTIFF格式的数据。

但是上次介绍的NC文件的地理参考是比较标准的,即数据都有经度和维度这两个维度来表示其在地理空间的位置,并且这两个维度都有与其对应的坐标变量。在标准的NC文件中,坐标变量都是一维的。而不标准的NC文件的坐标变量则会是二维的,比如经度坐标变量存储的是每个像元的经度。通常情况下,这种NC数据甚至不能称为是栅格数据,因为需要这么存储的NC数据基本上每个像元的大小是不一致。而以TIF格式存储的栅格数据必须要求每个像元大小一致,所以这种数据处理起来就比较麻烦。下面介绍一下我碰到这种数据是怎么处理的,也欢迎有更好的方法的同学交流。关注公众号GeodataAnalysis,回复20230818获取示例数据和代码。

首先,既然知道每个像元的坐标值,那么可以把它转为点数据看一下。这是整体的每个点的分布,这种分布的情况下即使不考虑像元大小不一致的问题,我也没找到方法计算它的GeoTransform。

再看一下局部,显然点分布的密度差异很大,说明像元大小是不一致的。

综上,在处理这种NC数据时,我是将其转为CSV格式,三列分别表示经度、维度和像元值,再使用GDAL的Grid函数把它插值为TIF格式的栅格数据。

下面以从哨兵 5 下载SO2数据为例,分享一下处理的代码(关注公众号GeodataAnalysis,回复20230818获取示例数据和代码):

import os
import numpy as np
import netCDF4 as nc
from osgeo import gdal

ds = nc.Dataset('./0228SO2.nc')
data = ds['PRODUCT']['sulfurdioxide_total_vertical_column'][0, ...].filled(np.NAN)

lon = ds['PRODUCT']['longitude'][0, ...].data
lat = ds['PRODUCT']['latitude'][0, ...].data

with open('./0228SO2.csv', 'w') as fp:
    fp.write('x,y,z\n')
    for x, y, z in zip(lon.flatten(), lat.flatten(), data.flatten()):
        if not np.isnan(z):
            fp.write(f'{x},{y},{z}\n')

vrt_path = './0228SO2.vrt'
with open(vrt_path, 'w') as fn_vrt:
    layer_name = '0228SO2'
    fn_vrt.write('<OGRVRTDataSource>\n')
    fn_vrt.write('\t<OGRVRTLayer name="%s">\n' % layer_name)
    # 下面这个路径最好使用绝对路径
    fn_vrt.write('\t\t<SrcDataSource>%s</SrcDataSource>\n' % './0228SO2.csv')
    fn_vrt.write('\t\t<GeometryType>wkbPoint</GeometryType>\n')
    fn_vrt.write('\t\t<GeometryField encoding="PointFromColumns" x="x" y="y" z="z"/>\n')
    fn_vrt.write('\t</OGRVRTLayer>\n')
    fn_vrt.write('</OGRVRTDataSource>\n')

# 命令中的各个命令最好都用绝对路径
# 自行设置输出的分辨率或者输出的行列数,以及输入的坐标系
tif_path = './0228SO2.tif'
order = f'gdal_grid -a invdist:power=2.0:smoothing=1.0:nodata=-10000 -txe {lon.min()} {lon.max()} -tye {lat.min()} {lat.max()} -outsize 594 416 -a_srs EPSG:4326 -l {layer_name} {vrt_path} {tif_path} --config GDAL_NUM_THREADS ALL_CPUS'
result = os.system(order)
print(result)

结果如下图所示:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/923638.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

1212页Kubernetes学习指南,几乎涵盖所有K8S核心技术点,建议收藏!

Kubernetes&#xff08;简称K8S&#xff09;是一个开源的容器编排平台&#xff0c;主要用于自动化部署、扩展和管理容器化应用程序。由于K8S在容器编排方面的优势&#xff0c;它已经成为了现代化应用程序部署和管理的事实标准 因此&#xff0c;对于运维人员来说&#xff0c;学…

数电票红利悄然而至 百望云数据驱引“供应链协同”新纪元

2023年&#xff0c;全面数字化的电子发票政策正如飞驰的列车在各地试点推广中加速前行&#xff0c;“以数治税”的全新时代即将来临&#xff0c;基于数电票赋能的企业数字化红利正在悄然释放。借着政策快速落地的东风&#xff0c;财税数字化也进入到全面建设的新周期&#xff0…

打造B2B2C商城系统成功的关键要素有哪些?

电子商务的蓬勃发展&#xff0c;B2B2C商城系统成为了越来越多企业的选择。然而&#xff0c;在激烈的市场竞争中&#xff0c;要想打造一款成功的B2B2C商城系统并不容易。下面就B2B2C商城系统成功的关键要素作一些简单介绍&#xff0c;希望对大家有帮助(仅供参考)。 一、整合供应…

VIT 论文精读 | transformer架构引入CV的开创性工作

目录 1. 背景 2. 方法 2.1 怎么把2D图像变成1D序列输入到transformer中 像素&#xff1f; 先提取特征图&#xff1f; 打成多个patch 2.2 transformer和卷积网络比较 2.3 结构 1. 背景 VIT是基于transformer的在图像分类大放异彩的变体&#xff0c;transformer是VIT的亲…

LeetCode面试经典150题(day 2)

26. 删除有序数组中的重复项 难度:简单 给你一个 升序排列 的数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使每个元素 只出现一次 &#xff0c;返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯…

【LeetCode-中等题】56. 合并区间

题目 题解一&#xff1a;排序 思路&#xff1a; 1、对数组按第一个元素大小进行排序&#xff0c;使得数组按大小连续排列 2、先将第一个数组提前放入list集合&#xff0c;因为肯定是从第一个开始算起的 3、接着对下一个数组的左边界和list集合最后一个元素的右边界对比&#x…

go学习之go的语法知识

文章目录 1.go语言开发注意事项2.golang常用的转义字符(escape char)3.golang开发常用的问题小结与提示&#xff1a; 4.go语言注释类型&#xff08;1&#xff09;.注释类型1&#xff09;行注释2&#xff09;块注释(多行注释) &#xff08;2&#xff09;使用细节&#xff1a;1&a…

CnetSDK .NET OCR SDK Crack

CnetSDK .NET OCR SDK Crack CnetSDK.NET OCR库SDK是一款高度准确的.NET OCR扫描仪软件&#xff0c;用于使用手写、文本和其他符号等图像进行字符识别。它是一款.NET OCR库软件&#xff0c;使用Tesseract OCR引擎技术&#xff0c;可将字符识别准确率提高99%。通过将此.NET OCR扫…

React原理 - React Virtual DOM 原理

目录 扩展学习资料 Virtual DOM 是什么【虚拟dom】 React渲染 Virtual DOM VS 原生DOM【vDom是否比原生Dom更高效】 Virtual DOM数据结构 Virtaual DOM Diff【虚拟dom前后比对&#xff0c;更新不同dom的算法】 源码解读 react源码组织方式&#xff1a; React Stack Rec…

2.含电热联合系统的微电网运行优化

含电热联合系统的微电网运行优化 MATLAB代码&#xff1a;含电热联合系统的微电网运行优化 关键词&#xff1a;微网 电热联合系统 优化调度 参考文档&#xff1a;《含电热联合系统的微电网运行优化》完全复现 仿真平台&#xff1a;MATLAB yalmipcplex [火]主要内容&#xf…

网络安全(黑客)自学剖析

想自学网络安全&#xff08;黑客技术&#xff09;首先你得了解什么是网络安全&#xff01;什么是黑客&#xff01; 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全…

基于Jenkins CICD的代码发布与回滚-------从小白到大神之路之学习运维第87天

第四阶段提升 时 间&#xff1a;2023年8月24日 地 点&#xff1a;2304教室 授课人&#xff1a;李凤海 参加人&#xff1a;全班人员 内 容&#xff1a; 基于Jenkins CICD的代码发布与回滚 目录 一、案例概述 二、案例知识点 三、案例环境 &#xff08;一&#xff0…

C++类成员的访问权限以及类的封装

C通过 public、protected、private 三个关键字来控制成员变量和成员函数的访问权限&#xff0c;它们分别表示公有的、受保护的、私有的&#xff0c;被称为成员访问限定符。所谓访问权限&#xff0c;就是你能不能使用该类中的成员。 Java、C# 程序员注意&#xff0c;C 中的 publ…

大数据-玩转数据-Flink时间滚动动窗口

一、说明 时间窗口包含一个开始时间戳(包括)和结束时间戳(不包括), 这两个时间戳一起限制了窗口的尺寸. 在代码中, Flink使用TimeWindow这个类来表示基于时间的窗口. 这个类提供了key查询开始时间戳和结束时间戳的方法, 还提供了针对给定的窗口获取它允许的最大时间戳的方法(m…

HTTP原理与实现

一、基本概念 一、基本原理* 1、全称&#xff1a; HyperText Transfer Protocol (超文本传输协议) 2、底层实现协议&#xff1a;建立在 TCP/IP 上的无状态连接。 3、基本作用&#xff1a;用于客户端与服务器之间的通信&#xff0c;规定客户端和服务器之间的通信格式。包括请…

PTS性能测试工具-使用记录

因为PTS使用是要收费的&#xff0c;所以文中会有大量图片记录&#xff0c;为我自己以后工作中&#xff0c;可能会再次使用PTS做个参照&#xff0c;以免时间长&#xff0c;容易忘记~ 目录 一、创建场景 二、填写一个压测节点 1、填写节点基本信息 2、Body / Header填写 …

牡丹宣言|对国潮化妆品品牌的理解

化妆品的国潮概念&#xff1f; ■ 是中国的时代潮流。 ■ 是传统元素与现代元素的碰撞。 ■ 是一股年轻的力量。 ■ 是大国崛起的象征。 ■ 是中国文化自信的体现。 如何正确认知化妆品&#xff1f; ■ 化妆品不是药品 ■ 化妆品是一种观念 ■ 化妆品是一种习惯 ■ 化…

自动化测试工具:Airtest入门教程

目录 1.什么是Airtest&#xff1f; 2.AirtestIDE下载安装 3.如何开始使用 4.Airtest入门特例教程 5.总结 1.什么是Airtest&#xff1f; Airtest是一款基于 Python 的、跨平台的UI自动化测试框架。因为它基于 图像识别 的原理&#xff0c;所以适用于所有 Android、 iOS和 …

Linux系统安装(虚拟机安装;系统分区;Linux系统安装;远程登录管理工具)

文章目录 1. VMware虚拟机安装与使用2. 系统分区2.1 磁盘分区2.2 格式化2.3 硬件设备文件名2.4 分区设备文件名2.5 挂载2.6 文件系统结构2.7 总结 3. Linux系统安装4. 远程登录管理工具 1. VMware虚拟机安装与使用 VMware是一个虚拟PC的软件&#xff0c;可以在现有的操作系统上…

opencv 车牌号的定位和识别+UI界面识别系统

目录 一、实现和完整UI视频效果展示 主界面&#xff1a; 识别结果界面&#xff1a;&#xff08;识别车牌颜色和车牌号&#xff09; 查看历史记录界面&#xff1a; 二、原理介绍&#xff1a; 车牌检测->图像灰度化->Canny边缘检测->膨胀与腐蚀 边缘检测及预处理…