udx映射
本文设计了可扩展的数据格式映射方法。
对于原始数据格式而言,数据内容都是通过读写API来操控的;而对于UDX的Node-Kernel结构而言,数据的读与写都需要通过访问与构造数据节点Node来完成。
由此,原始的领域通用数据格式到基于Node-Kernel结构的UDX Data之间,可以通过API函数和数据节点操作两者的映射来进行直接的交换。
数据读写API函数可以根据不同的原始数据格式进行定制和扩展,从而实现前文所述两种类型的数据格式都向统一的Node-Kernel结构进行映射。
原始数据格式可以是单个文件的形式,也是可以是多个文件的组合形式;将其映射到Node-Kernel结构时,模型程序的数据读写操作对外部会暴露成数据节点的操作,而在数据节点的操作内部则会映射为具体数据格式相关的API函数。
ReadFromNode&&WriteToNode
数据节点的操作主要包含两个接口函数:一个负责从UDX Node中获取数据内容ReadFromNode(),一个负责向UDX Node中填充数据内容WriteToNode()。
ReadFromNode接口函数和WriteToNode接口函数的具体实现内部都会对应到某个API函数,将模型程序的数据接口统一包装起来形成外观一致的Node-Kernel结构,而在内部则映射到相应的数据格式的数据读写API函数。
数据读写API有很多种实现形式,有的是动态链接库形式(DLL),有的是可执行程序形式(EXE),有的是组件形式(COM)等
但无论是何种形式,都会对外暴露相应的读取和写入数据的接口函数。
映射举例
多边形Polygon数据的典型API函数映射
- ReadFromNode
当地理模型数据接口向外部请求“几何类型”的信息时,通过ReadFromNode函数映射到GDAL/ORG的getGeometryType函数;当请求“多边形外环”信息时,则通过ReadFromNode函数映射到GDAL/ORG的getExteriorRing函数。此外还有其他相关的函数。
- WriteToNode
当地理模型数据接口向外部输出“多边形”数据时,通过WriteToNode函数其“几何类型”信息会直接蕴含在GDAL/ORG的new OGRPolygon()函数中;当地理模型数据接口向外部输出“多边形外环”信息时,通过WriteToNode函数映射到GDAL/ORG的addRing函数。
数据格式映射方法库
支撑地理模型提供者将所构建的UDX Data与API函数映射的结果积累下来,成为可共享的资源
在数据格式映射方法库中,主要包含了各种原始数据格式与UDX Data之间的转换方法。数据格式映射方法库中的资源条目主要用于描述某个映射方法,并对外提供统一的数据节点操作方法。
如上图所示,AbstractGeneralData接口中:
-
一个映射方法的唯一标识id,
-
名称信息name,
-
相关解释性的信息description,
-
本地化描述信息localization,
-
以及相关联的UDX Schema信息
-
UDX Schema信息schemaInfo
关于schemaInfo这一属性的具体值
可以是通过引用“通用数据表达模板库”中某个数据表达模板的ID,
也可以是直接描述成UDX Schema的XML序列化字符串。
如果是引用的数据表达模板ID,则schemaType是TemplateId类型;
如果是XML序列化字符串,则schemaType是Internal类型;
如果没用描述相关的UDX Schema信息,则schemaType是Unknown类型。
映射方法的具体实现
如上图所示,数据格式映射方法库中包含了一系列的AbstractGeneralData的具体实现,比如ShapefileData是Shapefile格式的数据与UDX Data之间的API函数映射,其在实现AbstractGeneralData的ReadFromNode和WriteToNode函数的同时,还定制了LoadOGR的函数来加载OGR开源库来作为数据节点操作的底层API函数;GeoTIFFData是GeoTIFF格式的数据与UDX Data之间的API函数映射,其定制的LoadGDAL函数来加载GDAL开源库来作为数据节点操作的底层API函数。此外还有SWATHruData,AsciiGridData等数据格式映射方法。
*数据格式映射方法库中的资源条目(知道即可)
都对应着两部分内容:一部分是数据格式映射的具体方法实现,主要是由一个实现AbstractGeneralData抽象类的动态链接库DLL,以及该DLL所依赖的其他资源(例如前文所述的ShapefileData映射方法还需要依赖与GDAL/OGR库的DLL);另一部分内容是对该数据映射方法的描述文档。
总结
继承接口,写具体数据对应的映射方法,进行映射,将写好的各种映射方法累积到映射方法库中
利用readfromnode()去获取节点数据,利用writetonode()去给节点添加内容