跳转至

在 ESE 5.2 中使用递归的 ENVIRaster 定义

原文链接: https://www.nv5geospatialsoftware.com/Learn/Blogs/Blog-Details/using-recursive-enviraster-definitions-in-ese-52

16978 为文章评分:

未评分

在 ESE 5.2 中使用递归的 ENVIRaster 定义

匿名 2014年11月18日,星期二

在八月份的时候,我写了一篇关于如何使用桌面版 ENVI API 在将 ENVIRaster 对象传递给 ENVITask 之前对其进行子集划分的博客。今天,我将讨论如何在 ESE 上发布的 ENVITask 中做到这一点。虽然有一些非常实用的帮助文档,但我还是想再举几个例子,展示如何利用 ENVIRaster 定义的递归功能。

正如帮助文档详细说明的那样,有三种 JSON 对象可以用来描述一个 ENVIRaster 对象。在所有情况下,"factory" 属性都是识别正在使用哪种 JSON 对象以及其其他属性可以/必须是什么的主要方法。仔细检查帮助文档中的 JSON 语法,会发现它与我们桌面 API 中的函数存在关联:URLRaster 对应 ENVI::OpenRaster(),SubsetRaster 对应 ENVISubsetRaster(),ResampleRaster 对应 ENVIResampleRaster()

JSON 工厂 JSON 属性 API 函数 关键字/参数
URLRaster url ENVI::OpenRaster URI 参数
URLRaster format ENVI::OpenRaster EXTERNAL_TYPE 或 CUSTOM_TYPE 或无
URLRaster dataset_index ENVI::OpenRaster DATASET_INDEX
URLRaster dataset_name ENVI::OpenRaster DATASET_NAME
SubsetRaster input_raster ENVISubsetRaster Raster 参数
SubsetRaster sub_rect ENVISubsetRaster SUB_RECT
SubsetRaster spatialref ENVISubsetRaster SPATIALREF
SubsetRaster bands ENVISubsetRaster BANDS
ResampleRaster input_raster ENVIResampleRaster SourceRaster 参数
ResampleRaster dimensions ENVIResampleRaster DIMENSIONS
ResampleRaster pixel_scale ENVIResampleRaster PIXEL_SCALE
ResampleRaster column_mapping ENVIResampleRaster COLUMN_MAPPING
ResampleRaster row_mapping ENVIResampleRaster ROW_MAPPING

如本表所示,桌面 API 函数中的关键字与 JSON 属性名称完全匹配(有一个显著的例外是 "format",为了 ESE 内部处理原生格式、ENVI Classic 格式和自定义格式,它被设计得更用户友好一些)。

"factory" 属性的值与 API 函数之间也存在直接关联——属性值去掉了 API 函数名中的 "ENVI" 前缀。同样,URLRaster 是个例外,但这是一个特殊值,用于表示递归的结束,并代表在 ENVI 对象上使用类方法。

API 函数使用的位置参数在一定程度上也是标准化的。对于 URLRaster,我们使用属性名 "url" 来对应 ENVI::OpenRaster 中的 URI 位置参数。这种差异可以归因于与 ESE 5.1 的向后兼容性以及该版本中最初使用 ESRI 的 GPRasterData 数据类型。对于其他两种工厂模式,我们使用标准化的属性名 "input_raster",因为这是所有虚拟栅格作为位置参数的通用名称。

有了这些认识,我们就可以将下面的桌面 API 代码转换为 JSON 等价物,以便在 ESE 任务中使用:

nv = ENVI(/Headless)

oRaster = nv.OpenRaster('qb_boulder_msi')

oSubRaster = ENVISubsetRaster(oRaster, SUB_RECT=[256, 256, 767, 767])

oResRaster = ENVIResampleRaster(oSubRaster, DIMENSIONS=[1024, 1024])

{

"factory" : "ResampleRaster",

"dimensions" : [ 1024, 1024 ],

"input_raster" : {

"factory" : "SubsetRaster",

"sub_rect" : [ 256, 256, 767, 767 ],

"input_raster" : {

"factory" : URLRaster",

"url" : "qb_boulder_msi"

}

}

}

我用单独的彩色标识了每个 API 函数名、参数和关键字,然后对 JSON 中对应的属性使用了相同的颜色,以说明这个过程可以多么简单。这里需要注意的重要一点是,由于 JSON 的递归性,以及它将被深度优先遍历的方式,JSON 中属性的顺序与使用 API 进行函数调用的顺序相反。

那么,你接下来可能会问的问题是:"我可以用任何虚拟栅格函数来做这个吗?" 答案很可能是肯定的。虽然我们没有正式测试所有虚拟栅格函数的排列组合,但我们已经在这里学到了足够的知识,通过将它们的映射到属性名,并将位置参数源栅格映射到用于递归的 "input_raster" 属性,可以弄清楚如何为大多数虚拟栅格函数构建 JSON 表示。勇敢的 ESE 用户可以试验这个概念,它应该是可行的,不过我不在这里做任何保证。例如,下面是我测试过的一个从空间子集创建 NDVI 栅格的例子:

nv = ENVI(/Headless)

oRaster = nv.OpenRaster('qb_boulder_msi')

oSubRaster = ENVISubsetRaster(oRaster, SUB_RECT=[256, 256, 767, 767])

oNDVIRaster = ENVISpectralIndexRaster(oSubRaster, INDEX='NDVI')

{

"factory" : "SpectralIndexRaster",

"index" : "NDVI",

"input_raster" : {

"factory" : "SubsetRaster",

"sub_rect" : [ 256, 256, 767, 767 ],

"input_raster" : {

"factory" : URLRaster",

"url" : "qb_boulder_msi"

}

}

}

Machine Learning – Simplified Examining Changes to Surface Water in Reservoirs Located Along the Western Flank of the Sierra Nevada, California