RFC 62:栅格代数

作者:Ari Jolma

联系人:ari.jolma,gmail.com

现状:发展

版本实现:

总结

提出了一种为栅格带对象编写的支持“栅格代数”的函数或方法集,即修改带或从带计算值的操作集。修改的一个例子是为带的所有单元格添加值。计算的一个例子是频带中的最大单元值。除了标注栏本身之外,操作还可以或不可以采用参数,如果采用,参数可以是数值、数据结构或其他标注栏。类似地,计算值可以是简单的数值、数据结构或另一个频带。

理论基础

栅格代数是地理空间科学与技术的一个著名分支,也是一个经常需要的工具。目前GDAL在内核中还没有对栅格代数的全面支持。

要求(目标)

实现应该具有数据类型意识。这可能意味着用模板编写的代码。

实现应该是并行处理友好的。

实现应该允许使用相对简单的C++ /C API。这可能意味着接口,它不使用模板。

实现应该允许对单元格值执行任意函数。一、 e.可由用户扩展。

实现应该允许使用焦点方法。一、 方法,其中单元格的值取决于其邻域。

途径

实现不需要与核心紧密集成。这意味着“附加”类型的解决方案是可以的。

GDAL设计为栅格代数的实现设置了一些约束/要求:1)数据的访问是基于块的,2)GDAL支持多种数据类型,甚至是复杂的值,3)某些方法所需的不简单的数据结构没有直接的支持(按“方法”我指的是本文中栅格代数的函数),4)数据可以平行阅读乐队的作品,但写作必须是排他性的。

变化

驱动程序

司机不受影响。

绑定

该功能将添加到绑定中。

公用事业

现有实用程序不受影响,但可以利用新功能编写新实用程序。

文档

必须是书面的。

测试套件

必须是书面的。

兼容性问题

实施

拟定的实施方案在 https://github.com/ajolma/raster_algebra

此代码尝试按如下方式解决问题。(源代码正在从旧方法转换,旧方法基于运算符作为方法,而新方法基于运算符类)

定义了类“operand”和“operator”。操作数是一个对象,它保存数据,而运算符是一个对象,它从操作数中计算结果(本质上是一个操作数)。

栅格代数计算是一个由操作对象和运算符对象组成的树,以递归方式执行。

有接口类和模板化的具体类。具体的类继承自接口类。

定义了两个操作数类:数字和带区。需要其他类型的操作数。例如,分类器将整数值或实数范围映射为数字。这种方法的代码存在于源代码中,但它的组织不是为了反映新的方法。

一个中心的方法是“compute”in band类,它基本上是GDALRasterBand::ReadBlock文档中提供的有效块循环代码。

带区的模板具体类和重载的get-value方法支持多种数据类型,后者返回所需数据类型中的值。

投票历史