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

2023-10-26

之前写过一篇文章,介绍了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)

结果如下图所示:

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

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

  • 无法“安装”plpython3u - postgresql

    我正在尝试在 postgresql 中使用 python 语言 像这样的事情 create or replace function test a integer returns integer as if a 2 0 return even
  • 使用 pythonbrew 编译 Python 3.2 和 2.7 时出现问题

    我正在尝试使用构建多个版本的 python蟒蛇酿造 http pypi python org pypi pythonbrew 0 7 3 但我遇到了一些测试失败 这是在运行的虚拟机上 Ubuntu 8 04 32 位 当我使用时会发生这种情
  • 在 python 程序中合并第三方库的最佳实践是什么?

    下午好 我正在为我的工作编写一个中小型Python程序 该任务需要我使用 Excel 库xlwt and xlrd 以及一个用于查询 Oracle 数据库的库 称为CX Oracle 我正在通过版本控制系统 即CVS 开发该项目 我想知道围
  • OpenCV Python cv2.mixChannels()

    我试图将其从 C 转换为 Python 但它给出了不同的色调结果 In C Transform it to HSV cvtColor src hsv CV BGR2HSV Use only the Hue value hue create
  • Python(Selenium):如何通过登录重定向/组织登录登录网站

    我不是专业程序员 所以请原谅任何愚蠢的错误 我正在做一些研究 我正在尝试使用 Selenium 登录数据库来搜索大约 1000 个术语 我有两个问题 1 重定向到组织登录页面后如何使用 Selenium 登录 2 如何检索数据库 在我解决
  • 通过最小元素比较对 5 个元素进行排序

    我必须在 python 中使用元素之间的最小比较次数来建模对 5 个元素的列表进行排序的执行计划 除此之外 复杂性是无关紧要的 结果是一个对的列表 表示在另一时间对列表进行排序所需的比较 我知道有一种算法可以通过 7 次比较 总是在元素之间
  • 使用 matplotlib 绘制时间序列数据并仅在年初显示年份

    rcParams date autoformatter month b n Y 我正在使用 matpltolib 来绘制时间序列 如果我按上述方式设置 rcParams 则生成的图会在每个刻度处标记月份名称和年份 我怎样才能将其设置为仅在每
  • 从字符串中删除识别的日期

    作为输入 我有几个包含不同格式日期的字符串 例如 彼得在16 45 我的生日是1990年7月8日 On 7 月 11 日星期六我会回家 I use dateutil parser parse识别字符串中的日期 在下一步中 我想从字符串中删除
  • 如何在 Python 中检索 for 循环中的剩余项目?

    我有一个简单的 for 循环迭代项目列表 在某些时候 我知道它会破裂 我该如何退回剩余的物品 for i in a b c d e f g try some func i except return remaining items if s
  • 从 Flask 访问 Heroku 变量

    我已经使用以下命令在 Heroku 配置中设置了数据库变量 heroku config add server xxx xxx xxx xxx heroku config add user userName heroku config add
  • Flask如何获取请求的HTTP_ORIGIN

    我想用我自己设置的 Access Control Allow Origin 标头做出响应 而弄清楚请求中的 HTTP ORIGIN 参数在哪里似乎很混乱 我在用着烧瓶 0 10 1 以及HTTP ORIGIN似乎是这个的特点之一object
  • Python 的“zip”内置函数的 Ruby 等价物是什么?

    Ruby 是否有与 Python 内置函数等效的东西zip功能 如果不是 做同样事情的简洁方法是什么 一些背景信息 当我试图找到一种干净的方法来进行涉及两个数组的检查时 出现了这个问题 如果我有zip 我可以写这样的东西 zip a b a
  • 在Python中获取文件描述符的位置

    比如说 我有一个原始数字文件描述符 我需要根据它获取文件中的当前位置 import os psutil some code that works with file lp lib open path to file p psutil Pro
  • 每个 X 具有多个 Y 值的 Python 散点图

    我正在尝试使用 Python 创建一个散点图 其中包含两个 X 类别 cat1 cat2 每个类别都有多个 Y 值 如果每个 X 值的 Y 值的数量相同 我可以使用以下代码使其工作 import numpy as np import mat
  • 对年龄列进行分组/分类

    我有一个数据框说df有一个柱子 Ages gt gt gt df Age 0 22 1 38 2 26 3 35 4 35 5 1 6 54 我想对这个年龄段进行分组并创建一个像这样的新专栏 If age gt 0 age lt 2 the
  • 类型错误:预期单个张量时的张量列表 - 将 const 与 tf.random_normal 一起使用时

    我有以下 TensorFlow 代码 tf constant tf random normal time step batch size 1 1 我正进入 状态TypeError List of Tensors when single Te
  • Conda SafetyError:文件大小不正确

    使用创建 Conda 环境时conda create n env name python 3 6 我收到以下警告 Preparing transaction done Verifying transaction SafetyError Th
  • 使用 Python 绘制 2D 核密度估计

    I would like to plot a 2D kernel density estimation I find the seaborn package very useful here However after searching
  • 从列表指向字典变量

    假设你有一个清单 a 3 4 1 我想用这些信息来指向字典 b 3 4 1 现在 我需要的是一个常规 看到该值后 在 b 的位置内读写一个值 我不喜欢复制变量 我想直接改变变量b的内容 假设b是一个嵌套字典 你可以这样做 reduce di
  • Python 类继承 - 诡异的动作

    我观察到类继承有一个奇怪的效果 对于我正在处理的项目 我正在创建一个类来充当另一个模块的类的包装器 我正在使用第 3 方 aeidon 模块 用于操作字幕文件 但问题可能不太具体 以下是您通常如何使用该模块 project aeidon P

随机推荐

  • es批量修改数组动态增加并去重

    es创建测试的index和type 对应mysql的数据库和表 PUT uniq test idx1 mappings uniq test properties comId type long customerName type keywo
  • Your branch is ahead of 'origin/master' by 2 commits.

    遇到这种问题 表示在你之前已经有2个commit而没有push到远程分支上 所以需要先git push origin 将本地分支提到远程仓库 也可以直接git reset hard HEAD x解决 这里的x表示的就是在这之前已经有多少次的
  • 分享一些你觉得在Linux上顺理成章,换到Windows上就可能令人费解的事

    Linux与Windows都是十分常见的电脑操作系统 相信你对它们二者都有所了解 在你的使用过程中 是否有什么事让你觉得在Linux上顺理成章 换到Windows上就令你费解 亦或者关于这二者你有任何想要分享的 都可以在这里留下你的看法 方
  • PSM倾向得分匹配

    1 简要介绍 我们以 是否上大学 对 收入 的影响为例来说明这个问题 这里 先讲二者的关系设定为如下线性模型 显然 在模型 1 的设定中 我们可能忽略了一些同时影响 解释变量 是否上大学 和 被解释变量 收入 的因素 例如 家庭背景 能力
  • Transformer模型简介

    简介 Transformer 是 Google 团队在 17 年 6 月提出的 NLP 经典之作 由 Ashish Vaswani 等人在 2017 年发表的论文 Attention Is All You Need 中提出 Transfor
  • gitlab分支保护_如何删除gitlab上默认受保护的master主分支

    今天开发在检查代码的时候 发现master分支有问题 现在准备删除此主分支 并且重新提交正确的代码 不过在删除时发现 master分支不能被删除 ps 主分支一般都是线上分支 需要开发确认后并且做好备份才能动 本次是因为master分支已经
  • 使用ngx_log_if模块,对阿里云SLB健康检测产生的大量日志进行过滤处理

    阿里云1000元通用代金券点此领取 最近公司购买了阿里云的SLB服务 健康检测使用的是http和https协议 直接访问web 后端的80端口是nginx 阿里云会按设置的健康检测时间使用get方法 去访问域名下的检查路径 判断web是否存
  • 【ES从入门到实战】十、全文检索-ElasticSearch-进阶-QueryDSL基本使用&match_all

    接第9节 2 Query DSL 在上一节中使用的形如 GET bank search query match all sort account number asc balance desc 的查询语言风格 我们称之为 Query DSL
  • 03-neo4j的命令

    1 查看某个联系格式 MATCH p n 开始Label r 关系名称 m 结束Label RETURN p LIMIT 25 MATCH p n Person r hive m Address RETURN p LIMIT 25 2 连续
  • Jupyterlab离线安装及windows环境多Python内核设置

    一 安装前准备 请浏览 安装多版本python 建立虚拟环境 建立虚拟python环境 假设原python路径为 D Program Files Python310 虚拟环境将建立在d mpy python3108 打开 Windows P
  • Unity今日小结1

    今天在看M Studio老师的视频学了很多东西 这里想要给自己小结一下 首先 在M studio的3DRPG课程中编写敌人追击发现玩家的脚本文件 里面我印象比较深刻的两个函数是Transform LookAt和Physics Overlap
  • openMP的一点使用经验

    最近在看多核编程 简单来说 由于现在电脑CPU一般都有两个核 4核与8核的CPU也逐渐走入了寻常百姓家 传统的单线程编程方式难以发挥多核CPU的强大功能 于是多核编程应运而生 按照我的理解 多核编程可以认为是对多线程编程做了一定程度的抽象
  • 用C#制作塔防游戏

    有点简陋 呵呵 首先一个塔防游戏的主要大类肯定是塔类 怪物类以及地图类了 塔类代码 class Ta public static List
  • 作为一个上班族,有哪些Python兼职项目?兼顾练手和创收?

    普通人学Python有意义吗 Python作为一种跨平台的计算机程序设计语言 近些年来越来越受到企业和IT从业者的青睐 那么 普通人是否需要学习Python呢 学会Python有什么意义呢 今天小编就和大家聊一聊这个话题 Python有效提
  • 统计学第七周 python验证正态分布/卡方分布/T

    统计学第七周 一 知识回顾 上周已经学习过正态分布 卡方分布 T分布等知识 但是如何选择那 正态分布 卡方分布 T分布 二 实践 1 场景 泰坦尼克号数据 主要是age年龄 Fare价格即船票价格 Embark登船的港口 需要验证数据是否服
  • centos MQTT安装和php使用mosquitto的实例

    php安装mqtt 扩展 yum install y php devel yum install y mosquitto devel usr local php bin pecl install Mosquitto alpha 安装过程提示
  • selenium实现zhilian招聘的爬取

    一 主要目的 最近在玩Python网络爬虫 然后接触到了selenium这个模块 就捉摸着搞点有意思的 顺便记录一下自己的学习过程 二 前期准备 操作系统 windows10 浏览器 谷歌浏览器 Google Chrome 浏览器驱动 ch
  • Python——re.search().group()

    import re a 123abc456 print re search 0 9 a z 0 9 a group 0 123abc456 返回整体 print re search 0 9 a z 0 9 a group 1 123 pri
  • 智能楼宇计算机网络,[计算机应用] 智能楼宇D的计算机网络研究和设计

    第一章 引言 智能楼宇是现代建筑技术与信息技术相结合的产物 是以系统功能集成 计算机网络与通信办公自动化等多种技术集成为基础 通过有效分配 利用人员 设备及其资源产生综合效益 满足用户对现代化建筑功能性 经济性 管理性等方面的要求 智能楼宇
  • 一种特殊的NC文件转TIF——知道每个像元的坐标值怎么转为TIF

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