在 ESE 5.2 中使用递归的 ENVIRaster 定义
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