python:使用 gdal 绑定在内存中执行 gdalwarp

2024-02-06

我目前有一个加工链R下载MODIS数据然后调用gdalwarp从系统将特定子数据集(例如 NDVI)重新投影到 WGS1984 中。所结果的GeoTiffs然后被收集到一个HDF5文件以供进一步处理。

现在我将处理链移至python,我想知道是否有办法跳过写作步骤GeoTiffs到磁盘的功能gdal module.

需要明确的是,问题是:

我可以表演吗gdalwarp严格使用来自的 python 绑定gdal模块并且不写入磁盘?

我做了一些研究,最接近我的问题的答案是这些帖子:

  • 如何使用 GDAL python 投影和重新采样网格以匹配另一个网格? https://stackoverflow.com/questions/10454316/how-to-project-and-resample-a-grid-to-match-another-grid-with-gdal-python
  • 使用 gdal Python 绑定复制 gdalwarp 的结果 https://gis.stackexchange.com/questions/139906/replicating-result-of-gdalwarp-using-gdal-python-bindings

第一种方法需要模板,所以不是我真正想要的。

第二种方法看起来更有希望,它使用该函数AutoCreateWarpedVRT这似乎正是我想要的。尽管与答案中的示例相反,我的结果与参考不匹配(独立于任何错误阈值)。

在我之前的实现中调用gdalwarp除了目标参考系统之外,我还直接指定了目标分辨率。所以我认为这可能会产生影响 - 但我无法在 python 中的 gdal 绑定中设置它。

这是我尝试过的(抱歉,没有 MODIS 数据就无法重现):

import gdal
import osr

ds = gdal.Open('/data/MOD13A2.A2016305.h18v07.005.2016322013359.hdf')

t_srs = osr.SpatialReference()
t_srs.ImportFromEPSG(4326)

src_ds = gdal.Open(ds.GetSubDatasets()[0][0], gdal.GA_ReadOnly)

dst_wkt =t_srs.ExportToWkt()
error_threshold = 0.125
resampling=gdal.GRA_NearestNeighbour

tmp_ds = gdal.AutoCreateWarpedVRT( src_ds,
                                  None, # src_wkt : left to default value --> will use the one from source
                                   dst_wkt,
                                   resampling,
                                   error_threshold)

# create tiff

dst_ds = gdal.GetDriverByName('GTiff').CreateCopy('warp_test.tif', tmp_ds)
dst_ds = None

这是供参考的:

gdalwarp -ot Int16 -tr 0.00892857142857143 0.00892857142857143 -t_srs EPSG:4326 "HDF4_EOS:EOS_GRID:MOD13A2.A2016305.h18v07.005.2016322013359.hdf:MODIS_Grid_16DAY_1km_VI:1 km 16 days NDVI" MOD13A2.A2016305.h18v07.005.2016322013359_MODIS_Grid_16DAY_1km_VI_1_km_16_days_NDVI.tif

比较:

i1 = gdal.Open('warp_test.tif')
i2 = gdal.Open('MOD13A2.A2016305.h18v07.005.2016322013359_MODIS_Grid_16DAY_1km_VI_1_km_16_days_NDVI.tif')

# test

print(i1.RasterXSize,i1.RasterYSize)
1267 1191

#reference

print(i2.RasterXSize,i2.RasterYSize)
1192 1120

i1.GetRasterBand(1).Checksum() == i2.GetRasterBand(1).Checksum()
False

所以你可以看到,使用gdal.AutoCreateWarpedVRT函数会产生具有不同维度和分辨率的数据集。


如果你想模仿你的“参考”电话gdalwarp您可以使用:

import gdal

ds = gdal.Warp('warp_test.tif', infile, dstSRS='EPSG:4326',
               outputType=gdal.GDT_Int16, xRes=0.00892857142857143, yRes=0.00892857142857143)
ds = None

如果您不想输出到磁盘上的文件,可以扭曲到内存中的 VRT 文件,例如:

ds = gdal.Warp('', infile, dstSRS='EPSG:4326', format='VRT',
               outputType=gdal.GDT_Int16, xRes=0.00892857142857143, yRes=0.00892857142857143)

当然,您可以扭曲为内存中的任何格式,但对于 VRT 以外的文件,扭曲结果实际上将存储在内存中。

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

python:使用 gdal 绑定在内存中执行 gdalwarp 的相关文章

  • openpyxl 2.4.2:保存后公式生成的单元格值为空

    我使用 openpyxl 打开文件 编辑一些单元格并保存更改 这是一个例子 import openpyxl book openpyxl load workbook sheet path sheet book active for row i
  • 如何使用pycaffe重构caffe网络

    我想要的是 加载网络后 我将分解一些特定的图层并保存新的网络 例如 原网 数据 gt conv1 gt conv2 gt fc1 gt fc2 gt softmax New net 数据 gt conv1 1 gt conv1 2 gt c
  • Dask DataFrame 的逐行处理

    我需要处理一个大文件并更改一些值 我想做这样的事情 for index row in dataFrame iterrows foo doSomeStuffWith row lol doOtherStuffWith row dataFrame
  • 获取单个方程的脚本

    在文本文件中输入 a 2 8 b 3 9 c 4 8 d 5 9 e a b f c d g 0 6 h 1 7 i e g j f h output i j 期望的输出 输出 2 8 3 9 0 6 4 8 5 9 1 7 如果输入文件名
  • 在 Python 中使用 sec 函数的反函数

    我正在创建一个程序 用于计算从一定高度范围和设定初始速度发射射弹的最佳角度 在我需要使用的最终方程中 存在一个反 sec 函数 它导致了一些麻烦 我已经导入了数学并尝试使用 asec 无论如何 但是数学似乎无法计算反秒函数 我也明白 sec
  • 将一个时间序列插入到 pandas 中的另一个时间序列中

    我有一组定期测量的值 说 import pandas as pd import numpy as np rng pd date range 2013 01 01 periods 12 freq H data pd Series np ran
  • python中函数变量的作用域

    假设我们有两个函数 def ftpConnect ftp FTP server ftp login ftp cwd path def getFileList ftpConnect files ftp nlst print files 如果我
  • 当x轴不连续时如何删除冗余日期时间 pandas DatetimeIndex

    我想绘制一个 pandas 系列 其索引是无数的 DatatimeIndex 我的代码如下 import matplotlib dates as mdates index pd DatetimeIndex 2000 01 01 00 00
  • 如何使用 openpyxl 对工作簿中的 Excel 工作表/选项卡进行排序

    我需要按字母数字对工作簿中的选项卡 工作表进行排序 我在用openpyxl https openpyxl readthedocs io en default 操作工作表 您可以尝试排序workbook sheets list workboo
  • 行为:如何从另一个文件导入步骤?

    我刚刚开始使用behave http pythonhosted org behave 一个Pythonic BDD框架 使用小黄瓜语法 http docs behat org guides 1 gherkin html 行为需要一个特征 例
  • 反加入熊猫

    我有两个表 我想附加它们 以便仅保留表 A 中的所有数据 并且仅在其键唯一时添加表 B 中的数据 键值在表 A 和 B 中是唯一的 但在某些情况下键将出现在表 A 和 B 中 我认为执行此操作的方法将涉及某种过滤联接 反联接 以获取表 B
  • Python While 循环,and (&) 运算符不起作用

    我正在努力寻找最大公因数 我写了一个糟糕的 运算密集型 算法 它将较低的值减一 使用 检查它是否均匀地划分了分子和分母 如果是 则退出程序 但是 我的 while 循环没有使用 and 运算符 因此一旦分子可整除 它就会停止 即使它不是正确
  • urllib2.urlopen() 是否实际获取页面?

    当我使用 urllib2 urlopen 时 我在考虑它只是为了读取标题还是实际上带回整个网页 IE 是否真的通过 urlopen 调用或 read 调用获取 HTML 页面 handle urllib2 urlopen url html
  • 负整数的Python表示

    gt gt gt x 4 gt gt gt print b format x x 4 100 gt gt gt mask 0xFFFFFFFF gt gt gt print b format x mask x mask 4294967292
  • 使用 lambda 函数更改属性值

    我可以使用 lambda 函数循环遍历类对象列表并更改属性值 对于所有对象或满足特定条件的对象 吗 class Student object def init self name age self name name self age ag
  • 是否可以强制浮点数的指数或有效数匹配另一个浮点数(Python)?

    这是我前几天试图解决的一个有趣的问题 是否可以强制一个的有效数或指数float与另一个人一样float在Python中 出现这个问题是因为我试图重新调整一些数据 以便最小值和最大值与另一个数据集匹配 然而 我重新调整后的数据略有偏差 大约小
  • asyncio - 多次等待协程(周期性任务)

    我正在尝试为异步事件循环创建定期任务 如下所示 但是我收到 RuntimeError 无法重用已等待的协程 异常 显然 asyncio 不允许等待相同的可等待函数 如中讨论的这个错误线程 https bugs python org issu
  • CSV 在列中查找最大值并附加新数据

    大约两个小时前 我问了一个关于从网站读取和写入数据的问题 从那时起 我花了最后两个小时试图找到一种方法来从输出的 A 列读取最大日期值 将该值与刷新的网站数据进行比较 并将任何新数据附加到 csv 文件而不覆盖旧的或创建重复项 目前 100
  • 具有指定置信区间的 Seaborn 条形图

    我想在 Seaborn 条形图上绘制置信区间 但我已经计算出置信区间 如何让 Seaborn 绘制我的置信区间而不是尝试自行计算它们 例如 假设我有以下 pandas DataFrame x pd DataFrame Group 1 0 5
  • 如何使用 Django (Python) 登录表单?

    我在 Django 中构建了一个登录表单 现在我遇到了路由问题 当我选择登录按钮时 表单不会发送正确的遮阳篷 我认为前端的表单无法从 查看 py 文件 所以它不会发送任何 awnser 并且登录过程无法工作 该表单是一个简单的静态 html

随机推荐

  • Python 从键列表生成动态字典

    我确实有一个清单 如下所示 keyList1 Person Male Boy Student id 123 Name value1 Roger 如何生成可以按如下方式检索的动态字典 mydict Person Male Boy Studen
  • Bigquery - 计划存储过程不再工作

    最近 Bigquery UI 发生了变化 似乎不再可以安排存储过程自动执行 使用 UI 只是不断要求插入目标表 如果我放置一个虚拟表 则会创建计划 但是当尝试执行时只会抛出一个错误 表明在执行存储过程时我们无法拥有目标表 有人遇到这个问题并
  • SQL 注入预防 - GET_VARS

    我有一个网址 有效时将如下所示 site com page php id 12345 我试图了解我们是否容易受到 sql 注入的攻击 在这个特定的实例中 该值只能是正整数值 因为它是一个 ID 号 我们有时确实使用其他变量 可以是字母或文本
  • Groovy 中分割字符串的惯用方法

    是否有更好 更短 更好的方法来执行以下操作 filename AA BB CC DD EE FF xyz parts filename split packageName parts 0 parts 1 parts 2 parts 3 pa
  • AngularJS - 单个模板中的多个 ng-view

    我正在使用 AngularJS 构建一个动态 Web 应用程序 是否可以有多个ng view在一个模板上 你可以只拥有一个ng view 您可以通过多种方式更改其内容 ng include https docs angularjs org
  • 文件内容更改后使用 ifstream 从同一文件读取(直到 EOF)

    要求 我必须读到 EOF 16 个字节 时间 来自特定文件 以及 然后说睡5秒 现在 5秒后 当我尝试阅读时 从文件 其内容将 到那时已被附加 预期的设计必须是这样的 它从它所在的点读取 之前离开并再次扫描 内容 一次 16 个字节 直到
  • bigint 通过 PDO 截断?

    我遇到了将大整数存储在 a 中的问题BIGINT通过 PDO 在 MySQL 上列 如果我运行这个测试 number 30123456789 var dump number prints string 11 30123456789 new
  • 使用 Connect-MSOLservice 与服务主体连接

    我正在尝试使用在 AzureAD 中创建的服务主体通过 PowerShell 脚本进行连接 我成功创建了 SP 创建了密钥 还创建了自签名证书并将其与帐户关联 我知道如何使用 Connect AzureAD 但 Connect MSOLse
  • 可以使用按钮删除从项目添加的数据库条目吗?

    我正在尝试使用 Android 编程 大书呆子牧场指南 自学 Android 开发 其中一个练习 如果您熟悉这本书 请从第 14 章开始 涉及创建一个工具栏 其中包含一个项目 该项目将新条目添加到单击该项目时的数据库 一个挑战问题是删除条目
  • 使用 JGit 从 Git 检索提交消息日志

    我只想从 Git 存储库检索提交日志 其中包含您在特定存储库上完成的所有提交的消息 我找到了一些实现此目的的代码片段 并以异常结束 try FileRepositoryBuilder builder new FileRepositoryBu
  • Kivy 窗口隐藏/显示

    我是一个Python编程新手 学习让我创建一个项目 这就是我正在尝试做的事情 我想创建一个在系统托盘中运行的程序 并且 fire 是一个在后台加载的程序 在后台加载 这样我可以减少 Kivy 的启动时间 在这里和谷歌搜索后 我找不到答案 我
  • Azure ARM 角色分配不同的资源组

    我正在尝试创建一个具有 VM 的 ARM 模板 我希望 VM 具有AcrPull向位于不同资源组中的容器注册表进行角色分配 我将范围属性设置为 ACR 的 ID 我从https resources azure com https resou
  • 正则表达式 标签解析src、宽度、高度

    你可能会对这句话做出反应 H使用正则表达式进行 TML 解析是一个完全糟糕的主意 下列的this https stackoverflow com questions 1732348 regex match open tags except
  • 添加对消息的反应。 Discord.py 重写

    我正在尝试使用自定义表情符号添加对消息的反应 由于某种原因 我在网上找不到太多与此相关的内容 并且我花了过去 3000 万的时间试图找出不同的方法 到目前为止还没有任何效果 这是在齿轮内部 第一种方法 accept decline awai
  • Xcode + 删除所有断点

    有什么方法可以删除Xcode中的所有断点吗 那么有一个三步的方法 按 CMD 7 显示所有断点 在 Xcode4 中按 CMD 6 在 Xcode3 中按 CMD ALT B 使用 CMD A 选择所有断点 然后使用退格键删除它们 就像删除
  • 乔姆斯基语言类型

    我试图理解四种不同的乔姆斯基语言类型 但我发现的定义对我来说没有任何意义 我知道类型 0 是自由语法 类型 1 是上下文相关的 类型 2 是上下文无关的 而类型 3 是常规的 那么 有人可以解释一下这一点并将其放在上下文中吗 谢谢 语言是属
  • 有没有办法在没有 .* 或 ->* 运算符的情况下调用成员函数

    调用方法如下D foo通过指向成员函数的指针调用函数将生成错误 必须使用 or gt 在 f 中调用指向成员函数的指针 当然这不是我们调用成员函数指针的方式 正确的调用方式是 d f 5 OR p gt f 5 我的问题是 有没有办法在左侧
  • 如何使用 scipy.optimize.linprog 获得整数解?

    当我解决线性规划问题时 就像下面的公式一样 我希望 x 的结果全部为 int 类型 考虑以下问题 最小化 f 1 x 0 4 x 1 须遵守 3 x 0 1 x 1 lt 6 1 x 0 2 x 1 lt 4 x 1 gt 3 where
  • [mccabe] 循环复杂度过高错误是什么意思?

    我正在 repl it 中为一个学校项目创建一个 CYOA 并且需要一个列表 所以我所做的就是在每次输入时为用户添加一个选项来查看他们的项目 在主要的分割处我放了 Items Flask of Root Beer print Intro n
  • python:使用 gdal 绑定在内存中执行 gdalwarp

    我目前有一个加工链R下载MODIS数据然后调用gdalwarp从系统将特定子数据集 例如 NDVI 重新投影到 WGS1984 中 所结果的GeoTiffs然后被收集到一个HDF5文件以供进一步处理 现在我将处理链移至python 我想知道