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

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.mzph.cn/news/834633.shtml

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

相关文章

限时优惠||新算法转让(一种基于数学的元启发式算法)新的群智能算法转让,新的元启发式算法转让(独家发售)【仅售1份】

新算法 ||新算法转让、新的元启发式算法转让 ||一种基于数学开发的超隐喻的元启发式算法新算法 限时发售、限量1份 1️⃣完整的封装代码 2️⃣配套完整的灵感及数据 3️⃣测试集(3个) (1)cec2017(10、30、50和100维&a…

HashMap前世今生

概述 HashMap是我们常用的一种数据结构,他是一个key-value结构。我们来深入了解一下。 1.8之前用的数组加链表 1.8之后用的数组加链表加红黑树,当链表数量大于8时,将链表转为红黑树。当红黑书节点小于6又会转为链表。 浅析HashMap的put()方…

深入理解网络原理5----HTTP协议

文章目录 一、HTTP协议格式二、HTTP请求2.1 URL 基本格式2.2 URL encode2.3 "方法" (method)2.4 认识请求 "报头" (header) 三、HTTP 响应3.1 "状态码" (status code) 四、HTPPS工作过程(经典面试题) 提示:以下…

【全开源】Java U U跑腿同城跑腿小程序源码快递代取帮买帮送源码小程序+H 5+公众号跑腿系统

特色功能: 智能定位与路线规划:UU跑腿小程序能够利用定位技术,为用户提供附近的跑腿服务,并自动规划最佳路线,提高配送效率。订单管理:包括订单查询、订单状态更新、订单评价等功能,全行业覆盖…

智慧营销的未来:中国AIGC技术的演进与应用 #未来是现在的趋势#

📑前言 随着人工智能(AI)技术的蓬勃发展,尤其是在营销技术(MarTech)领域,AIGC(AI Generated Content)技术在中国市场的应用和影响日益显著。2023年,中国在AIG…

一款好用的memcached的内存使用分析工具

文章目录 简介1.打印帮助信息2.查看memcached的基础信息3.查看memcached的StatsSizes分布4.查看memcachd中slab的使用情况5.查看memcachd中slab的置换率、回收及内存使用率 简介 xmc是一款分析memcached内存使用情况的工具,通过读取memcached的状态,包括…

Android(一)

坏境 java版本 下载 Android Studio 和应用工具 - Android 开发者 | Android Developers 进入安卓官网下载 勾选协议 next 如果本地有设置文件,选择Config or installation folder 如果本地没有设置文件,选择Do not import settings 同意两个协议 耐…

车载测试系列:车载蓝牙测试(三)

HFP测试内容与测试方法 2.3 接听来电:测试手机来电时,能否从车载蓝牙设备和手机侧正常接听】拒接、通话是否正常。 1、预置条件:待测手机与车载车载设备处于连接状态 2、测试步骤: 1)用辅助测试机拨打待测手机&…

LeetCode-460. LFU 缓存【设计 哈希表 链表 双向链表】

LeetCode-460. LFU 缓存【设计 哈希表 链表 双向链表】 题目描述:解题思路一:一张图秒懂 LFU!解题思路二:精简版!两个哈希表,一个记录所有节点,一个记录次数链表【defaultdict(new_list)&#x…

OpenHarmony实战开发——WLAN驱动框架介绍及适配方法

1. WLAN 驱动框架概述 WLAN 是基于 HDF(Hardware Driver Foundation)驱动框架开发的模块,该模块可实现跨操作系统迁移、自适应器件差异、模块化拼装编译等功能。从而降低 WLAN 驱动开发的难度,减少 WLAN 驱动移植和开发的工作量。 本文主要分析 WLAN 驱…

Windows下安装人大金仓数据库

1、点击安装包进行安装 2、双击进行安装 3、点击确定 4、接着选择下一步 5、勾选接收 6、选择授权文件 7、显示授权文件信息 8、选择安装位置 9、点击安装 10、点击下一步 11、正在进行安装 12、设置密码。123456 13、系统正在进行配置 14、安装完成 15、登…

C 深入指针(3)

目录 一、关于数组名 1 数组名的理解 2 数组名 与 &数组名 的区别 二、使用数组访问指针 三、一维数组传参的本质 四、二级指针 五、指针数组 六、指针数组模拟二维数组 一、关于数组名 1 数组名的理解 //VS2022 x64 #include <stdio.h> int main() {int …

为什么要使用大模型

随着OpenAI引领的超大模型风潮&#xff0c;大模型的发展日新月异&#xff0c;如同雨后春笋般茁壮成长。在现今的科技舞台上&#xff0c;每周&#xff0c;甚至每一天&#xff0c;我们都能见证到一个全新模型的开源&#xff0c;这些模型的创新性和实用性不断超越前作&#xff0c;…

leetcode 1235

leetcode 1235 代码 class Solution { public:int jobScheduling(vector<int>& startTime, vector<int>& endTime, vector<int>& profit) {int n startTime.size();vector<vector<int>> jobs(n);for(int i0; i<n; i){jobs[i] …

Kotlin基础知识总结(三万字超详细)

1、条件语句 &#xff08;1&#xff09;if条件 if条件表达式&#xff0c;每一个分支最后一条语句就是该分支的返回值。适用于每个分支返回值类型一致这种情况。 fun getDegree(score: Int): String{val result: String if(score 100){"非常优秀"}else if(score …

Vue从入门到实战Day03

一、生命周期 1. 生命周期四个阶段 思考&#xff1a; ①什么时候可以发送初始化渲染请求&#xff1f; 答&#xff1a;越早越好&#xff0c;在创建阶段后 ②什么时候可以开始操作DOM&#xff1f; 答&#xff1a;至少DOM得渲染出来&#xff0c;在挂载阶段结束后。 Vue生命周…

SpringBoot+logback实现日志记录写入文件

前言 在实际的开发过程中&#xff0c;日志记录有着极其重要的作用&#xff0c;它帮助我们实现更高效的故障排查与调试、更及时的监控和性能优化、更全面的业务分析与决策支持…那么我们如何在SpringBoot项目中实现日志的个性化定制&#xff0c;以满足其他特殊需求呢&#xff1f…

987: 输出用先序遍历创建的二叉树是否为完全二叉树的判定结果

解法&#xff1a; 一棵二叉树是完全二叉树的条件是&#xff1a; 对于任意一个结点&#xff0c;如果它有右子树而没有左子树&#xff0c;则这棵树不是完全二叉树。 如果一个结点有左子树但是没有右子树&#xff0c;则这个结点之后的所有结点都必须是叶子结点。 如果满足以上条…

机器学习(三) ----------线性回归算法(梯度下降+正则化)

目录 1 定义 2 损失函数&#xff08;回归&#xff09; 2.1 最小二乘函数&#xff08;Least Squares Function&#xff09; 2.2 均方误差&#xff08;Mean Squared Error, MSE&#xff09; 2.3 均方根误差&#xff08;Root Mean Squared Error, RMSE&#xff09; 2.4 平均绝…

PC端网页特效异读

pc网页特效 一、三大系列1.元素偏移量&#xff08;offset系列&#xff09;&#xff08;1&#xff09;一些属性&#xff08;2).offset和style的区别(3).一些例子 2.元素可视区(client系列&#xff09;(1).一些属性(2).flexible.js源码分析 3.scroll系列(4).三大系列小结 其他&am…