**章 底层算法整体设计与实现方法
相对于前两部专著《遥感与地理信息系统 C++底层开发与实践(上册)——数据模型与渲染》(2019)与《遥感与地理信息系统 C++底层开发与实践(下册)——功能扩展与集成》(2021)(以下简称这两部专著为“已出版专著(上册)”和“已出版专著(下册)”)来说,本书中介绍的内容主要是针对 MHMapGIS中实现的“算法及算法功能插件的实现方式”。也就是说,本书中主要以遥感、 GIS的相关算法为主,这些算法能够以某种形式集成至 MHMapGIS软件系统中并执行特定的功能。
集成到 MHMapGIS系统中的算法从集成模式与使用方法角度来看可以分为两种:一种是即时交互性算法,这类算法一般集成至软件系统的菜单中(在 MHMapGIS中以 Ribbon菜单或类似的形式),其特点是可快速对用户的交互式操作进行即时性的响应,算法的运行速度很快,一般不需要用户过长时间等待即可从系统界面中交互式看到算法执行的效果;另一种则是非交互式算法,相对于前一种来说,这种算法一般运行速度“不快”,且用户只需要在算法任务提交之前将参数设置好并提交算法任务,之后就不需要像**种算法那样等待算法运行结束后的结果,系统会通过另一个新的线程或进程处理 /计算提交的算法任务,并在任务完成后对用户进行通知,这类算法一般不集成到菜单中,而是以 MHMapGIS中的算法工具箱内工具的方式进行集成。
1.1 本书中界定的底层算法
本书所指的底层算法,即算法的底层实现,主要是通过 C++等语言实现的、能够完成一定数据处理、分析等功能的*立模块体。这里对实现语言实际上不进行特殊要求,除 C++之外,还可以为其他类型的语言,如 Python、C#、JAVA等,但本书中给出的实例主要是采用 C++语言实现(除昀后 3章的深度学习章节之外)。对于算法的实现方法来说,一般来说是程序实现者在一定的数理基础上,通过一定编程语言实现的算法模块,当然同样也可以基于已有算法源码或开源代码的基础上,进行一定的功能改进,并在实际应用过程中达到好用、易用的效果,本书中很多算法模块功能的实现就属于这一种。
图 1-1示意了软件 MHMapGIS整体软件系统界面。本书中针对算法模块介绍的集成方法同已出版的前两部专著中介绍的集成方法类似,其中本书中的第 2章至第 4章主要介绍用户交互式算法的实现,分别集成至 MHMapGIS软件菜单或软件集成的模块中(如数据导出就集成在 MHMapTree模块的右键菜单中);第 5章至第 21章主要介绍非交互性的遥感/GIS类算法,其主要集成模式为算法工具箱集成,即图 1-1所示的算法工具窗口。近年来随着深度学习在遥感、 GIS领域的发展,其可以解决很多原机器学习中解决不好的问题,越来越得到人们的重视,本书中第 19章至第 21章主要介绍作者在实际遥感影像信息提取与分析过程中所应用到的几个深度学习模型的实例与应用方式,同大多数据其他深度学习应用类似,相关的算法实现部分也是基于 Python语言编写而成,而已出版专著(下册)在前期撰写时,并未考虑支持 Python语言类算法,因此在本书的 1.3节中对 MHMapGIS中的交互式算法集成方式进行了总结,并在 1.4节中对集成模式进行了扩展介绍,增加了 Python语言类算法的集成调用方式,同时对相应的数据结构与集成模式也进行了扩展与更新。
图 1-1 软件 MHMapGIS整体软件系统界面
1.2 MHMapGIS中的算法实现与集成
对于交互式空间数据处理算法,本书中重点介绍 3个算法模块,分别为矢量数据编辑算法模块、栅格数据编辑算法模块与矢栅数据编辑算法模块(参见 1.3节)。前期在专著撰写过程中,由于软件 MHMapGIS中仅存在矢量数据编辑功能,因此命名该模块为 MHMapEdit;后期随着功能的增加,与此模块相并列又增加了专门针对栅格数据的编辑模块,因此将矢量数据模块改名为 MHMapFeaEdit(模块改名并不影响该模块的任何功能,具体参见第 2章),同时命名与其相对应的栅格数据编辑模块为 MHMapImgEdit(具体参见第 3章),并增加了针对矢栅数据交互式编辑的模块 MHMapSpaEdit(具体参见第 4章)。
对于非交互式数据处理算法(亦称插件式算法),本书中结合实际工作中遇到的问题及面临的需求,分不同章节分别进行算法的原理、实现过程与集成方法的介绍( 1.4),并从第 5章至第 21章每章分别介绍一种常用的遥感 /GIS处理分析算法模块。本书中各章之间不存在严格意义上的先后顺序,读者可根据需要选择阅读;同时,在 1.4节中对已出版专著(下册)第 24章的 MHMapTools的数据结构、实现方式等进行了扩展介绍。
1.3 交互式算法实现与集成模式
交互式算法是指需要用户通过软件进行交互式操作处理并等待处理结果的过程。 MHMapGIS软件中将这些交互式算法大多集成至 Ribbon菜单,这样便于用户按其所属的特定类别进行查找与调用,如图 1-2所示的为 MHMapGIS的第 2个 Ribbon菜单,即矢量交互式编辑中所对应的菜单,里面集成了针对矢量数据交互式编辑的多种算法。这些算法主要的表现方式为用户进行交互式选择不同的要素并进行(实时)处理的效果,如选中多个矢量要素的合并,矢量要素的删除、整形、切分、生成等,相应算法模块的具体实现方法见第 2章。
由于矢量要素的交互式处理速度很快,几乎不需要用户有多少的等待时间即可完成,因此可以很快通过 MHMapGIS的视图模块(参见已出版专著的 MHMapView模块章节)查看到算法的处理效果,当用户不满意相应的处理效果时,可以通过菜单中的“撤销 /重做”等功能进行撤销或重做,因此,交互式处理算法一般是通过特定的数据结构的设计(参见已出版专著 MHMapEdit模块章节),再通过撤销与重做等按键的配合进行实现。
图 1-2 矢量交互式编辑菜单中所对应的交互式算法集成效果
在 MHMapGIS的底层实现中,这类功能的实现过程与调用方式为: Ribbon菜单的底层代码由 MHMapGIS的 CMainFrame实现,这里面再调用模块 MHMapView中的相关函数,然后再由 MHMapView模块再调用相应算法功能的具体实现模块,如矢量数据编辑模块的底层实现为 MHMapFeaEdit的相应函数。这里面几乎所有的底层实现都通过模块 MHMapView进行功能的“中转”,这样便于二次开发用户通过模块 MHMapView实现所有底层功能 /函数的调用。
类似地,本书的第 3章将介绍针对栅格数据的交互式处理,表现在 MHMapGIS中为第 3个 Ribbon菜单,如图 1-3所示。第 4章将介绍针对矢量、栅格数据进行协同式处理的部分算法,表现为 MHMapGIS中的第 4个 Ribbon菜单,相应的界面如图 1-4所示。
图 1-3 影像交互式处理菜单中所对应的交互式算法集成效果
图 1-4 矢栅综合处理菜单中所对应的交互式算法集成效果
1.4 插件式算法实现与集成模式
插件式算法又称为非交互式算法,这些算法相对来说使用频率不是那么高,运行速度也没有那么快,通过工具箱的方式集成、待用户需要时再进行调用的方式更符合用户使用的习惯。一般来说,任何一个功能相对*立的算法均可以*立为一个算法模块,再根据 MHMapGIS中设定的集成规范或规则集成至算法工具箱,即可实现对这些算法功能进行调用与集成。在已出版的专著中,已经介绍了系统中算法的集成模式,既可以通过 C++暴露出的一个可被外部调用的功能接口方式进行集成,也可以对可执行文件方式的算法模块进行集成。
前文说过,为实现对 Python类算法的调用,本章中对 MHMapTools进行了一定的功能扩展(已出版的专著中的相应功能不受影响),使其能够对 Python类算法进行直接调用,为此,*先对 MHMapTools模块的结构体 MHTOOLS进行改造:
这里*先看一下原 MHMapTools中定义的结构体 MHTOOLS的数据结构。
其中针对算法描述较为关键的 sDllName及 sExeName,分别指示了算法动态链接库或可执行文件的名称,以及sFolderName(相应算法动态链接库或可执行文件的存储位置)及 sInterface(仅对动态链接库有意义,表现对外的接口)。
在对上述数据结构进行扩展时,一种方法是再增加一个针对 Python算法运行的参数描述类信息的记录;另一种方法则是对上述信息进行合并,这种方式相对来说更为合理,且有较好的扩展性,形成如下的数据结构。
其中,将动态链接库 DLL、可执行文件 EXE、批处理文件 BAT、Python算法的名称进行合并,形成了新的描述算法名称的变量 sDllExeBatPyName,指示了相应的算法名称,即对于动态链接库 ABCD.DLL来说,sDllExeBatPyName = “ABCD”;对于可执行文件 BCDE.EXE来说,sDllExeBatPyName = “BCDE”;对于批处理文件 CDEF.BAT来说,sDllExeBatPyName = “CDEF”;对于 Python算法 DEFG.PY来说,sDllExeBatPyName = “DEFG”。上述数据结构中的 sFolderName与原来的定义相比未变,即指示了该文件位于 MHMapGIS可执行文件下的文件夹名称。在原 MHMapTools定义的结构体中, sInterface主要描述了当集成算法类别为动态链接库时相应算法导出的接口,而在 EXE时则此变量没有用途。在此次更新中,对 sInterface所指示的字符串的功能进行了重新定义:当集成算法类别为 DLL时,sInterface指示的意义不变,即该动态链接库的导出接口;当集成算法类别为 EXE时,sInterface = “EXE”,指示当前的 sDllExeBatPyName = “BCDE”所对应的文件类型为可执行文件类型,这样 MHMapGIS的 MHMapTools在解析时就会到相应的文件夹中查找文件“BCDE.EXE”并进行调用;类似地,当集成算法类别为批处理文件 BAT时,sInterface = “BAT”;当集成算法类别为 Python时,sInterface的表述方式稍有些不同,为 “PY”(注意,这里 PY后面有一个空格)与当前活动角色的字符的连接,如 sInterface = “PY SZF”,表述为 Python格式,相应的活动角色为基准角色 base。相应地,MHMapGIS在底层实现时会增加一条 Python语句,即“conda activate SZF”,用以激活算法中设置的用户角色。
相应地,对原 MHMapTools.XML也进行了相应的扩展,类似如下:
上述 MHMapTools.XML的部分展示了几种不同类型的算法模块的集成模式中对应的算法描述部分的代码。其中,第 1个算法名称为“岩心塑料隔板识别”,其底层的实现方式为动态链接库,因此在描述时给定了该算法的属性,即 foldername ="RadiSZF"、dllfile = "MHGDALBasicAlgorithms"及 interface = "MHImgPlasticsIdentify",指示算法的实现是由 MHMapGIS的可执行文件所在文件夹下 RadiSZF文件夹下的MHGDALBasicAlgorithms.DLL实现的,需要调用该动态链接库的 MHImg PlasticsIdentify接口;第 2个算法名称为“道路自动提取 GPU版本”,其底层的实现方式为可执行文件,因此在描述时给定了它的属性为: foldername = "ZjutX
展开