舆图标记是地理情况要素空间漫衍特征的抽象暗示,反应与地理位置直接或间接相关的方针或现象的特征信息[1]。在地理信息系统(GIS)中将空间信息转换成舆图标纪录现可视化的进程称为标记化,舆图标记在标记化进程中起着要害浸染,它是GIS的重要构成部门。今朝,标记的描写要领分为参数法和措施法两大类。个中,参数法用一些预先界说的根基图元的组合来描写标记,每个图元由相应的图元参数描写,图元之间的组合干系则由组合参数描写;措施法例回收措施代码来描写一个标记的详细绘制进程,一段措施绘制一个标记。为了描写利便,将参数法描写的标记称为参数标记,将措施法描写的标记称为措施标记,这两种标记互为增补。主流的GIS平台一般都同时支持这两种标记,但差异GIS平台的参数标记的参数模子、措施标记的开拓接口及标记库的存储名目都存在着较大的差别,导致GIS平台之间标记的共享很是坚苦。标记设计是一件费时艰辛的事情,需要投入大量的人力,因而实现标记的共享与互操纵具有重要的应用代价[2]。今朝,标记的共享和互操纵还没有一个较量抱负的办理方案,因此跨平台通用标记化技能是一个值得研究的问题。
1 跨平台自适应标记化模子
实现标记共享的根基思想是把标记系统与详细的GIS平台分分开来,标记系统只通过界说好的接口与GIS平台举办交互。本文提出的跨平台自适应标记化技能把标记系统和详细的GIS平台分分开。图1是跨平台自适应标记化技能的模子。整个标记化流程如图1所示,首先是GIS软件通过标记数据接口将空间信息和标记属性数据传给标记化器;接着标记化器通过坐标转换接口将空间地理坐标转换成画图设备坐标;然后标记化器团结标记属性数据和标记库中的标记对已转换成设备坐标的空间信息举办标记化,标记化进程中需要画图时就通过图形绘制接口绘制到详细的GIS平台的画图设备上。
2 自适应标记的实现
上述的通用标记化模子的实现有多种技能途径可供选择,在详细实现时需要综合思量各方面的因素(如标记描写本领、实现难度、标记设计难度等)。首先要思量的是标记的描写本领。参数描写法的本领有限,很多巨大的标记无法通过它举办描写,措施法例不存在这个问题。通用标记化技能需要很强的标记描写本领,适合回收措施描写法来描写标记,本文选择的措施设计语言是Javascript。之所以选择它是因为Javascript与其他语言对比具有更好的跨平台性,是Web欣赏器的尺度语言,所有的Web欣赏器都必需支持;今朝WebGIS有一种实现要领是回收Ajax技能对矢量数据在客户端的Web欣赏器中举办标记化,用Javascript实现的标记可以直接在个中利用,这样操作Javascript实现的标记既能用于传统的桌面GIS,又能用于WebGIS,其他语言则没有这种优势。
21 通用标记系统
如前所述标记系统由标记库、标记化器及标记设计东西三部门组成。当基于Javascript技能实现标记系统时,标记库实际上是一种按必然法则编写的Javascript源措施文件;标记化器的主体就是用来执行标记库中标记措施的Javascript引擎。标记设计东西就是用于编写Javascript措施的开拓东西,最简朴的设计东西就是文本编辑器。
1)标记库 其主要事情是按给定的参数举办标记绘制,在绘制进程中当要举办画图操纵时只能挪用图形绘制接口的画图函数。一个标记库中包罗点、线、面三种范例的标记,沟通范例的标记之间用索引号举办区分。标记库并不是一个普通的Javascript措施文件,它必需实现表1中的函数,这些函数都是以Javascript的形式给出的,它们由标记库的编写者以编程的方法举办实现。个中,函数getSymbolFileDescription用于获取关于标记库文件的字符串形式的描写信息;getSymbolCount用于获取该标记库中给定范例标记的个数;getSymbolDescription用于获取给定范例和索引号的标记字符串形式的描写信息;drawMarkerSymbol、drawLineSymbol和drawFillSymbol别离用于绘制给定参数的点、线、面标记。个中函数参数type用于指定标记的范例,其值取0、1、2别离暗示点、线、面三种范例的标记;参数index用于指定标记的索引号,从0开始;参数x、y用于指定点标记的定位点;points用于指定线标记和面标记坐标串,它是一个数组,内里存放的是点的x、y值。一个多边形大概由多个部门构成,每个部门由多个点组成,各个部门的点的个数由参数parts指定,它也是一个数组。标记库中需要实现的函数描写如下:
getSymbolFileDescription();
getSymbolCount(type)
getSymbolDescription(type,index)
drawMarkerSymbol(index,x,y,lineColor,fillColor,lineWidth,size,angle)
drawLineSymbol(index,points,lineColor,fillColor,lineWidth)
drawFillSymbol(index,points,parts,lineColor,fillColor,lineWidth)
2)标记化器 其主体是一个Javascript引擎,今朝可供选择的Javascript引擎有多种,如Windows操纵系统中就自带有Javascript引擎,它以COM组件的形式提供;另一个是Mozilla的SpiderMonkey[3]。这些引擎都是通用的Javascript引擎,它并不知道图形绘制接口中界说的画图函数,而标记库又要利用这些函数,这就需要有一种机制让Javascript引擎可以或许正确识别和处理惩罚这些函数。Javascript引擎提供的自界说函数成果恰好办理了这个问题。Javascript引擎可以很利便地嵌入到应用措施中。被嵌入的应用措施称为宿主应用措施,自界说函数就是由宿主应用措施实现的用来扩展Javascript成果的函数。这些函数一般在应用措施初始化阶段向Javascript引擎举办注册,当引擎执行Javascript剧本且碰着自界说函数时就会以回调的方法来执行这些函数。因此可以通过注册回调的方法来实现标记库中利用的图形绘制函数。
3)标记设计东西 它用于设计标记并生成标记库,实际上是一个Javascript的措施开拓东西,而Javascript是一个无须编译的表明性语言,原则上任何文本编辑器都可以完成标记的设计事情,但实际上为了利便标记措施的编写,需要一个集成开拓情况。集成开拓情况是一个标记设计东西的荟萃,本文实现的集成开拓情况由标记措施编辑器、标记措施调试东西和标记预览东西等构成,用户可以很利便地在集成开拓情况中举办标记措施的编写、调试和标记预览。
22 标记化接口
1)标记化数据接口 认真把宿主GIS平台的空间数据(点、线、面地物的地理坐标)和标记属性数据(索引号、巨细、角度、颜色、线宽等)通报给标记化器。标记化器挪用Javascript引擎以通报过来的数据为参数执行标记库中对应的标记化函数(drawMarkerSymbol、drawLineSymbol和drawFillSymbol),从而完成对空间数据的标记化。
2)坐标转换函数 它是坐标转换接口的详细实现,用于完成地理坐标和图绘设备坐标之间的转换,它由两个函数构成,用C语言形式暗示如下:
a)bool map2device(double *x,double *y)
//用于地理坐标到设备坐标的转换
b)bool device2map(double *x,double *y)
//用于设备坐标到地理坐标的转换
3)图形绘制函数 它是图形绘制接口的详细实现。它通过包装宿主GIS平台的画图成果举办实现,在标记化时这些函数以回调的方法被执行,从而将功效绘制到宿主GIS平台的画图设备上去。本文回收了基于路径(path)的图形绘制接口。绘制图形时,先要结构出关于该图形表面的路径(这个阶段称为路径结构),然后再对路径举办渲染,如绘出界线线或举办填充(这个阶段称为路径渲染)。路径结构完毕后可以对它举办仿射调动(平移、缩放、旋转),在路径渲染之前可以配置渲染属性(如线的颜色、填充颜色、线的宽度等)。同一路径可以通过多次仿射调动在差异的坐标位置举办渲染,也可不举办仿射调动。仿射调动和渲染属性配置的顺序可以互换。整个图形绘制流程如图2所示。
23 标记插件
标记插件用于详细GIS平台和标记系统之间的挂接。常用的GIS平台都提供了扩展机制让用户对其成果举办扩充,标记插件的实现就是成立在这些扩展机制基本之上的。固然差异的GIS平台实现标记插件时所回收的技妙手段各纷歧样,但其实现方法根基一致,一般先包装宿主GIS平台的成果实现标记化数据接口、图形绘制接口和坐标转换接口中的函数;然后嵌入一个Javascript引擎,并向引擎注册图形绘制接口和坐标转换接口中的函数;最后再包装一层宿主GIS平台要求的其他接口(称为平台相关接口),以担保该插件可以或许在宿主GIS情况中利用。下面以MapObjects为例,具体说明标记插件的实现要领。
231 MapObjects标记插件
MapObjects为支持自界说标记提供三个标记COM接口,即ICustomMarker(点标记)、ICustomLine(线标记)和ICustomFill(面标记)。这些接口每个都由三个要领SetupDC、ResetDC和Draw构成。个中SetupDC用于构建画图设备上下文(Device Context);ResetDC用于排除设备上下文;Draw用于详细的标记绘制事情,只是各个接口Draw要领的参数纷歧样。可以通过编写一个COM组件实现MapObjects的标记插件,其步调如下:
a)包装GDI+实现标记化抽象层中的图形绘制接口函数。GDI+提供了基于路径的绘制方法,操作它可以很利便地实现这些画图函数。
b)在COM组件中嵌入一个Javascript引擎,并把a)中实现的图形绘制函数以回调函数的方法注册给Javascript引擎。
c)界说并实现一个用于修改标记属性的接口(ISymbolProperty)。二次开拓用户大概通过措施节制该接口加载标记库文件,修改标记的颜色、巨细、角度及索引号等。
d)实现MapObjects的三个自界说标记接口。在ICustomMarker接口的Draw要领中挪用Javascript引擎以给定的参数(如标记索引号、颜色、巨细、角度等)执行标记库中的drawMarkerSymbol函数,在ICustomLine接口的Draw要领中执行标记库中的drawLineSymbol函数,在ICustomFill接口的Draw要领中执行标记库中的drawFillSymbol函数。
232 应用实例
ArcMap、GeoStar、SuperMap也都提供了雷同MapObjects的 COM扩展接口[4],笔者已实现这些平台的标挂念接插件。图3和4是回收沟通的数据和标记 在两个差异GIS平台上的运行实例。图3是在MapObjects上的运行实例;图4是在ArcMap上的运行实例,其标记化的功效完全一致。
3 竣事语
跨平台自适应标记化技能将标记系统和GIS疏散,操作标记插件举办两者的插接,屏蔽了详细GIS平台的差别,为标记库的实现提供统一的接口,到达标记库在差异GIS平台上通用的目标。今朝操作该技能实现的标记已在ArcGIS、GeoStar、MapObject上获得了应用,实践证明这是一种切实可行的方案。下一步需要针对更多的GIS平台提供标记插件,使跨平台自适合的标记系统能应用到更多的GIS平台上。
因此可以通过注册回调的方式毕业硕士毕业论文来实现符号库中使用的图形绘制函数
毕业论文库:计算机 时间:2016-10-17 点击:
次