GDAL:Warning 1: All options related to creation ignored in update mode

news2024/12/23 17:34:27

01 警告说明

首先贴出相关代码:

out_file_name = 'Rs_{:4.0f}{:02.0f}.tiff'.format(year, month)
out_path = os.path.join(out_dir, out_file_name)
mem_driver = gdal.GetDriverByName('MEM')
mem_ds = mem_driver.Create('', len(lon), len(lat), 1, gdal.GDT_Float32)
srs = osr.SpatialReference()
srs.ImportFromEPSG(4326)
mem_ds.SetProjection(srs.ExportToWkt())
mem_ds.SetGeoTransform(geo_transform)
mem_ds.GetRasterBand(1).WriteArray(cur_Rs)
mem_ds.GetRasterBand(1).SetNoDataValue(-9999)  # 设置无效值
driver = gdal.GetDriverByName('GTiff')
ds = driver.Create(out_path, len(lon), len(lat), 1, gdal.GDT_Float32)
ds.SetGeoTransform(geo_transform)
ds.SetProjection(srs.ExportToWkt())
gdal.Warp(ds, mem_ds, cropToCutline=True, cutlineDSName=mask_path, xRes=out_res, yRes=out_res,
          resampleAlg=gdal.GRA_Cubic, srcNodata=-9999, dstNodata=-9999)

警告代码在gdal.Warp函数中产生。

警告: All options related to creation ignored in update mode,很明显,正如它所说,所有和创建相关的options将会在更新模式下忽略。

这里的options根据gdal源代码中:

在这里插入图片描述

02 解决

应该可以理解为gdal.Warp函数中的相关参数,换言之,我们指定的参数例如前面代码中的:

gdal.Warp(ds, mem_ds, cropToCutline=True, cutlineDSName=mask_path, xRes=out_res, yRes=out_res,
          resampleAlg=gdal.GRA_Cubic, srcNodata=-9999, dstNodata=-9999)

也就是说参数应该发生了某种冲突,导致有些参数无法起作用而忽略了,下面是该警告导致的输出影像显示:

在这里插入图片描述

可以发现,至少cropToCutlinedstNodata两个参数是没有正常作用的,掩膜似乎是作用的。周围黑色背景均为0,说明dstNodata没有起作用,而且似乎不应该是0,因为我确定我的栅格数据中不存在0值,无效值也是赋值的是-65535。另外影像周围很多多余黑色背景,说明它没有将shp矩形范围外的栅格矩阵丢弃,因此cropToCutline也是失效的。

调试发现,确实自己该的。gdal.Warp的参数和前面的代码存在矛盾导致的警告,进而导致错误影像产生。

在代码中:

ds = driver.Create(out_path, len(lon), len(lat), 1, gdal.GDT_Float32)
ds.SetGeoTransform(geo_transform)
ds.SetProjection(srs.ExportToWkt())

一开始我是不存在传入仿射参数和投影信息的,但是命令行警告:

ERROR 1: Unable to compute a transformation between pixel/line and georeferenced coordinates for E:\FeaturesTargets\uniform\Rs\Rs_198307.tiff. There is no affine transformation and no GCPs. Specify transformation option DST_METHOD=NO_GEOTRANSFORM to bypass this check.

于是我顺手给加上了,但是投影信息是正常的,而传入的geo_transform却是和后面的掩膜相矛盾,掩膜后的栅格矩阵必不可能是这个仿射参数。于是我想起来了,原来只需要传入输出路径即可,如下:

out_file_name= 'Rs_{:4.0f}{:02.0f}.tiff'.format(year, month)
out_path = os.path.join(out_dir, out_file_name)
mem_driver = gdal.GetDriverByName('MEM')
mem_ds = mem_driver.Create('', len(lon), len(lat), 1, gdal.GDT_Float32)
srs = osr.SpatialReference()
srs.ImportFromEPSG(4326)
mem_ds.SetProjection(srs.ExportToWkt())
mem_ds.SetGeoTransform(geo_transform)
mem_ds.GetRasterBand(1).WriteArray(cur_Rs)
mem_ds.GetRasterBand(1).SetNoDataValue(-9999)  # 设置无效值
gdal.Warp(out_path, mem_ds, cropToCutline=True, cutlineDSName=mask_path, xRes=out_res, yRes=out_res,
          resampleAlg=gdal.GRA_Cubic, srcNodata=-9999, dstNodata=-9999)

无需建立两个ds对象出来。

但是在调试过程中,我一开始认为是在MEM中创建影像导致的问题,于是将代码修改为:

mem_driver = gdal.GetDriverByName('GTiff')
mem_ds = mem_driver.Create(os.path.join(out_dir, 'temp.tiff'), len(lon), len(lat), 1, gdal.GDT_Float32)

结果发现输出的temp.tiff文件在GIS中显示异常:

在这里插入图片描述

对的,就是完全空的状态,我在代码中使用matplotlib显示如下:

在这里插入图片描述

说明应该是gdal在存入的时候导致的错误,最后找了很久没有发现原因,本来不打算研究了,因为虽然中间数据虽然存在显示问题,但是由于最后的输出还是正常的如下(我已经修改了此前的错误关于geo_transform):

在这里插入图片描述

当然,结局是好的,最后发现的原因应该是python的垃圾回收机制这方面的原因,换句话就是代码执行到这里时

mem_ds.GetRasterBand(1).SetNoDataValue(-9999)

我们想当然理解为数据集应该传入到了硬盘中,但实际上它还在内存中。这是很正常的,我以为它会在代码结束后自动将内存中的数据写入到硬盘,但是实际上并没有。

往常我是一般会写:

mem_ds = None

或者

mem_ds.FlushCache()

前者通过python的垃圾回收机制将内存中的东西写入到硬盘后再进行回收,后者则是gdal自带方法有相关写入内存的函数。

但是由于有时我发现写不写似乎并没有导致一些异常发生,且就算有异常一般是发生在命令行/jupyter/调试过程中,这个过程我认为是因为写入数据实际上还在内存,当我结束或者关闭时它会自动写入,事实上它确实如我所想这么实现了。因此我误以为所有数据集写入其实无需进行写入硬盘操作,因为当程序结束等会自动进行,但是事实证明我错了,或许在更为复杂的情况会导致没有来得及写入硬盘导致输出结果错误的情况发生。

所以,养成习惯,显式调用它们吧,这些错误有时非常致命当你不清楚它时。

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

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

相关文章

怎么把多个视频合成一个视频?6个软件教你轻松合成视频

怎么把多个视频合成一个视频?6个软件教你轻松合成视频 合成多个视频成为一个视频可以通过专业的视频编辑软件或在线工具来实现。以下是六个方便使用的软件,它们可以帮助你轻松合成视频: 迅捷视频剪辑软件:这是专业的视频编辑软…

PTP 对时协议 IEEE1588 网络对时 硬件基础

前言 在很多应用场景有精确对时的需求,例如车载网络,音视频流,工业网络。本文档将会阐述对时的硬件需求。 协议 流行的协议为 IEEE1588 标准指定的对时方法,名为 PTP 对时协议。 网卡硬件要求 找到某型网卡的特性描述&#x…

SQL STRING_SPLIT函数,将指定的分隔符将字符串拆分为子字符串行

文章目录 STRING_SPLIT (Transact-SQL)1、语法2、参数3、样例样例1样例2 STRING_SPLIT (Transact-SQL) STRING_SPLIT 是一个表值函数,它根据指定的分隔符将字符串拆分为子字符串行。 1、语法 STRING_SPLIT ( string , separator [ , enable_ordinal ] ) 2、参数…

需求为何如此多

同事的心态炸了 最近各种需求倒排给M同事的心态整炸了,直接撂挑子,从一个TL转为安静的开发人员了。我目睹了整个过程,大抵是理解他的心情的。早年从PMP培训,到哈啰火种计划培训,到后来也带项目,有一些看法…

Powerdesigner导入mysql8之后注释丢失

目录 一、问题描述及解决思路 二、导入的步骤 1.先按正常步骤建立一个物理数据模型 (1)点击“文件-新建模型” (2)选择物理模型和数据库 2.从sql文件导入表 (1)点击“数据库-Update Model from Data…

【ai早报-01 project】

今天和大家分享一款有趣的开源项目 01 Project。 The 01 Project is building an open-source ecosystem for AI devices. 其主旨是基于开源生态,构建以LLM为核心的产品,提供软硬件方案。 市面上类似产品: Rabbit R1, Humane Pin。 如上图所示的这款产…

kafka(七)——消息偏移(消费者)

概念 消费者消费完消息后,向_consumer_offset主题发送消息,用来保存每个分区的偏移量。 流程说明 consumer发送JoinGroup请求;coordinator选出一个consumer作为leader,并将topics发送给leader消费者;leader consumer…

如何使用Transformer-TTS语音合成模型

1、技术原理及架构图 ​ Transformer-TTS主要通过将Transformer模型与Tacotron2系统结合来实现文本到语音的转换。在这种结构中,原始的Transformer模型在输入阶段和输出阶段进行了适当的修改,以更好地处理语音数据。具体来说,Transformer-TT…

NSSCTF Web方向的例题和相关知识点(一)

[SWPUCTF 2021 新生赛]jicao 解题: 打开环境,是一段php代码 包含了flag.php文件,设定了一个POST请求的id和GET请求的json 语句会对GET请求的数据进行json解码 如果id和json变量的值都等于设定字符串,则得到 flag 我们可以使用…

如何让加快OpenHarmony编译速度?

OpenHarmony 有两种编译方式,一种是通过 hb 工具编译,一种是通过 build.sh 脚本编译。本文笔者将提升 build.sh 方式编译速度的方法整理如下: 因为笔者只用 build.sh 脚本编译,没用过 hb 工具,好像下面的选项也可以用于…

Python中使用tkinter模块和类结构的结合使用举例——编写制作一个简单的加数GUI界面

Python中使用tkinter模块和类结构的结合使用举例——编写制作一个简单的加数GUI界面 这里写目录标题 Python中使用tkinter模块和类结构的结合使用举例——编写制作一个简单的加数GUI界面一、tkinter模块和类的简述1.1 tkinter的简要介绍1.2 类结构的简要介绍 二、基于类机构和t…

拼多多强付费二阶段断流怎么办?分几种情况解决

关于断流的问题应该有不少人遇到过,即使是强付费,也不是一直有流量,到了二阶段说断流就断流,同样不能幸免。那么强付费二阶段直接断流是什么原因呢?今天跟大家讲一下强付费断流可能遇到的几种情况,要怎么应对。 第一…

利用自动获客软件实现高效精准获客

在数字化时代的浪潮中,企业之间的竞争愈发激烈。客户资源的获取成为企业生存和发展的关键。传统的获客方式如广告投放、线下推广等不仅成本高昂,而且效率和准确性难以保证。随着科技的进步,自动获客软件应运而生,它以其独特的优势…

C语言洛谷题目分享(11)回文质数

目录 1.前言 2.题目:回文质数 1.题目描述 2.输入格式 3.输出格式 4.输入输出样例 5.题解 3.小结 1.前言 哈喽大家好,今儿继续为大家分享一道蛮有价值的一道题,希望大家多多支持喔~ 2.题目:回文质数 1.题目描述 因为 151 …

【MySQL数据库】详解数据库审核工具SQLE的部署及接口调用

SQLE部署及使用 1. 部署SQLE SQLE相信大家都不陌生吧,它是一款开源,支持多场景审核,支持标准化上线流程,原生支持 MySQL 审核且数据库类型可扩展的 SQL审核工具。我们可以基于此工具进行数据库SQL审核,提升SQL脚本质量…

ue引擎游戏开发笔记(36)——为射击落点添加特效

1.需求分析: 在debug测试中能看到子弹落点后,需要给子弹添加击中特效,更真实也更具反馈感。 2.操作实现: 1.思路:很简单,类似开枪特效一样,只要在头文件声明特效变量,在fire函数中…

数据挖掘(一)数据类型与统计

前言 打算新开一个笔记系列,基于国防科技大学 丁兆云老师的《数据挖掘》 数据挖掘 1、数据类型与统计 数据统计 最大值,最小值,平均值,中位数,位数,方差等统计指标 df.describe() #当调用df.describe(…

分布式锁与秒杀

分布式锁与秒杀 1. 分布式锁1.1 常用Redis分布式锁方案三:使用Lua脚本(包含SETNX EXPIRE两条指令) 秒杀 1. 分布式锁 https://www.cnblogs.com/shoshana-kong/p/17519673.html 1.1 常用Redis分布式锁方案三:使用Lua脚本(包含SETNX EXPIRE两条指令) …

【JAVA基础之装箱和拆箱】自动装箱和自动拆箱

🔥作者主页:小林同学的学习笔录 🔥mysql专栏:小林同学的专栏 目录 1.包装类 1.1 概述 1.2 Integer类 1.3 装箱和拆箱 1.4 自动装箱和自动拆箱 1.5 基本类型与字符串之间的转换 1.5.1 基本类型转换为字符串 1.5.2 字符串转…

力扣每日一题111:二叉树的最小深度

题目 简单 给定一个二叉树,找出其最小深度。 最小深度是从根节点到最近叶子节点的最短路径上的节点数量。 说明:叶子节点是指没有子节点的节点。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:2示例 2&#x…