电子地图的制作及其在通用查询系统中的应用
- 知识体系
- 2005-08-13
- 32热度
- 0评论
郭晓波
襄樊市地方税务局信息中心
摘 要 近年来,电子地图做为一种后台信息数据的前台展示形式,以其生动、形象、直观、极具说服力等众多优点在许多行业和领域都越来越多地得到了广泛的应用。特别是一些公众性、服务性很强的工作领域。如交通管理、治安监控、旅游咨询、税收监管等等。本文介绍了一种十分方便、快捷的电子地图的制作方法,并深入探讨了其在通用查询系统的应用。
关键词 电子地图,描绘,通用查询
一、电子地图制作的理论分析
电子地图的传统作法是:使用专业电子地图制作软件如:MapInfo软件,将真实地图进行描绘,以“表”、“记录”的形式保存在后台数据库中。然后在应用程序端调用数据库的地图图形数据记录,动态绘制生成放大、缩小的图形和相关信息数据。这种电子地图制作方法操作复杂繁琐,要求操作员具有相当的专业水平,并且要将电子地图应用在用户自己的业务数据库上就需要更为熟练、专业的程序开发、维护人员。一般情况下一套专业电子地图软件的价格更是惊人,所以虽然电子地图的应用需求很大,但真正投入应用的成功案例并不多。
实际上,用户的数据信息是借助于一张可以随意放大、缩小、移动的地图图形来展示的。对于这幅电子地图,其主要求是:第一,经过放大和缩小的图形不能产生失真,主要是不能产生锯齿失真;第二,图形放大和缩小的处理过程必须非常迅速,一般应控制在0.1秒以内;第三,制作生成的电子地图应在二次程序开发时可以方便地进行处理和调用。基于以上认识,一幅矢量格式存放的地图图形文件是十分合适的选择。因为,矢量格式的图形文件放大和缩小失真非常小,同时地图图形所涉及的色彩位数较小一般只有16色最多出不过256色,生成的图形文件体积较小,应用程序处理的速度也很快。所以,我们采用微软标准的矢量图形文件格式“WMF”作为电子地图文件的保存格式。经过测试一幅4米X4米的巨大城区地图以WMF矢量格式256色保存的图形文件大小仅为287KB,并且在VB、PB、DELPHI中的图片控件都可以获得支持,程序的处理速度也很快,放大和缩小过程没有出现迟滞现象。
进行矢量绘图的软件有很多,比较著名的有CorelDRAW、Freehand等,但经过比较发现,OFFICE中的WORD却是一个最好选择。WORD在绘制线条、多边形、图层处理等方面的功能虽然比不上前两者的强大,但对地图的绘制已是完全足够的,并且它的操作比前两者可以说简单而又有效。
二、电子地图制作过程
1、通过扫描或数字摄影得到一张真实地图的图形文件。图片不需要特别清晰,也不要太大,以插入WORD文档后计算机处理流畅自如为准。例如:一张A2大小的城区地图经扫描、压缩(256色)后的JPG文件有2M之大。插入WORD文档后,要保证处理速度正常还是需要较高配置的PC来担当重任。需要提到的是,也许在扫描时纸质地图较大,需要分成多块进行扫描。这时可以在PhotoShop中将多块图形文件拼结起来。
2、将处理后的地图文件插入WORD,作为底图进行描绘。将WORD的页面纸张大小设置成为最大“自定义大小”55.87×55.81厘米(WORD支持的最大纸张尺寸为55.81厘米)。同时,将图片的大小也设置为最大50厘米,这样会使描绘出的图形更清晰。
3、街道的描绘。描绘工作主要使用“绘图工栏”上“自选图形”中“线条”菜单的“直线”和“任意多边形”两个工具进行绘制。线条的颜色在描绘时可以设置为半透明的浅灰色后期再统一设置为白色。对于有圆滑拐角的街道应特别注意。首先绘出整条街道的粗略走势,然后将WORD的视图放大如:500%。然后进行细描,这里主要是通过添加顶点个数和调整顶点位置来实现街道的平滑流畅。街道在城市中一般可以分为主干道、次干道和巷道三类,绘制街道时可以将所有同类街道“组合”成一个“图层”。
4、街区的描绘。街区即城市中建筑集中的区域,区别于绿地、丘岭和河流,如图所示桔黄色部分。街区的描绘是有一定技巧的。利用街区与街道、绿地、河流的相互遮盖关系可以大面积地、快速地绘制出看似需要逐个单独进行描绘的街区。
5、绿地的描绘。绿地的描绘方法与街区的描绘方法完全相同只是颜色有所区别。
6、河流的描绘。不管河流的支流情况多复杂,实际上河流的描绘只是描绘一个封闭的多边形如图,河流的拐转处较多描绘时应将图片放大进行细描。如果有湖泊或水库,则只能逐个进行单独描绘。
7、铁路的描绘。铁路的描绘方法与街道的描绘方法基本一致。首先按照街道的描绘方法进行铁路描绘并设置为灰色,然后将已绘出的铁路复制粘贴一份,将其“线型”设置为“短划线”也就范是常说的“间断线”并设置为黑色。将两条外形一致的铁路重叠,注意“短划线”在上层,“实心线”在下一层。为了美观“间断线”应比“实心线”稍细一些。
8、文字的描绘。需要说明的一点是,这里提到的“文字”是指街道、街区、河流、桥梁和湖泊的标志性名称,并不是细化至每一个企业单位或店面的名称。这些文字可以使用WORD中的插入艺术字来实现,因为艺术字都可以旋转。注意将艺术字的线条粗细值设置为0,这样可以消除放大后产生的锯齿失真
9、其它物体的描绘。WORD在“绘图工具栏”中提供了许多基本图形,用户可以方便地调用和组合使用,如五角星、三角、圆环等等,地图中出现的其它物体如桥梁、堤坝、隧道等,都可以灵活使用这些基本图形进行合成这里就不再赘述。
10、图形保存与格式转换。在WORD中将所有绘制的物体组合成为一个整体,选中图形复制并粘贴至CorelDRAW。将文件另存为WMF格式。这些操作应在一台显示卡较好的PC或图形工作站上进行。
三、用户业务数据库的调整
1、在用户存放基本登记信息的表中添加“X”横坐标和“Y”纵坐标两个字段。任何业务数据与电子地图的连接都是通过相关信息的横向、纵向坐标(X、Y坐标)进行的,X、Y坐标字段在表中起到类似ID字段的作用。这些信息一般是企业单位、客户人员、车辆飞机等对象的名称。所以,应该在业务数据库中的相关表中为这些信息加入X、Y坐标字段。
2、以税务部门为例,税务部门的管理对象是纳税人(包括企业事业单位和个人)。在税收管理数据库中应有这些纳税人的基本登记信息表,要与电子地图接合,就要为这些纳税人设置X、Y坐标,只要在税务登记表中添加X、Y两个字段即可
四、通过查询及显示程序的相关开发
1、 电子地图的显示。当前流行的开发工具VB、PB、DELPHL等都提供基本的“图片控件”对象,并且都支持WMF这种微软标准的矢量图形文件格式。所以,WMF格式的数字地图可以直接在这些开发工具中进行调用。
2、电子地图的放大、缩小和移动。在VB、PB、DELPHL等开发工具中利用“图片控件”显示电子地图时需要注意两点:一是,在放大、缩小和移动电子地图时不要通过使用改变“图片控件”的大小属性和位置属性的方法来实现。因为这样会使画面有强烈的闪烁感,并且当电子地图尺寸较大时程序处理速度很慢无法正常运行。一般做法是使用“图片控件”的DRAW方法进行图片的放大、缩小和移动。这样的操作不是针对“图片控件”对象本身进行的,只是将“图片控件”的影像写入到“显示缓存”中,所以速度非常快基本无闪烁和迟滞现象。在VB中使用Picture1.Paintpicture()进行“重绘”,在PB中是使用P_1.SetDraw()进行“重绘”,其详细语法可参考随机帮助信息。其次需要注意的是,应将图片所在窗口的“重绘”属性设置为TRUE。
3、查询结果在电子地图上的显示。显示查询结果是我们电子地图系统制作过程中技巧性很能强的部分。主要是处理好以下两个问题:
第一个问题是,如何在电子地图中的对应位置显示如图所示的查询统计结果表中的每一条记录。当然,我们可以动态生成许多“文本标签”控件,控件的显示文本设置成为“名称”字段中的内容,控件的LEFT、TOP属性(X、Y坐标)设置成为“X”“Y”字段的内容。这种方法在查询结果记录较少的情况下(2000条记录),程序执行速度是可以接受的。当查询结果记录达到一万、五万甚至十万条时,“文本标签”控件动态生成速度是十分缓慢的,甚至会耗尽系统资源造成死机。
解决方法:使用API函数TEXTOUT(),TEXTOUT()函数执行的功能是在屏幕的某一X、Y坐标位置上显示一行文本字串。经过测试,执行2万次TEXTOUT()函数即显示2万行文体字串的操作仅耗时0.1秒。TEXTOUT()是直接向“显示缓存”中写入文本字串,所以其速度和效率非常高。以下给出TEXTOUT()函数在VB和PB中的定义和使用方法示例:
VB中API函数TEXTOUT()的申明:
Private Declare Function TextOut Lib "gdi32" Alias "TextOutA" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long, ByVal lpString As String, ByVal nCount As Long) As Long
PB中API函数TEXTOUT()的申明:
FUNCTION ulong TextOut(ulong hdc,ulong x,ulong y,ref string lpString,ulong nCount) LIBRARY "gdi32.dll" ALIAS FOR "TextOutA"
Hdc:文本字串输出窗口的句柄;
X:文本字串输出位置的横向坐标;
Y:文本字串输出位置的纵向坐标,以当前屏幕分辨率的像素为单位。如当前屏幕分辨率为800X600,则X取值范围为0-800,Y取值范围为0-600;
LpString:需输出的文本字串的内容;
NCount:需输出的文本字串的长度;
第二个问题是,如何响应用户的调用操作。当用户单击或双击一行文本字串时,对于使用动态生成“文本标签”控件方法显示的文字,则直接触发了“文本标签”控件的“鼠标单击”或“鼠标松开”事件,可方便地写入事件处理代码,如显示详细数据资料等操作。对于使用TEXTOUT()函数方法显示的文字,则没有相应的“鼠标单击”或“鼠标松开”事件响应。可以利用数字地图所在窗口的“鼠标单击”或“鼠标松开”事件进行响应处理,处理流程如下:
Private Sub Form_MouseUp(Button As Integer, Shift As Integer, X As Single, Y As Single) '地图窗口鼠标松开事件
Do While 指针未到查询结果集最后
'如果鼠标单击时的坐标位于纳税人实际坐标周边8个像素范围内,则视为已选中该纳税人
If Abs(X- X横坐标) < 8 And Abs(Y-Y纵坐标) < 8 Then
ID_nsr= Adodc2.Recordset.Fields("微机编码") ‘获得这时纳税人的ID号
Do 显示纳税人详细信息
End If
MoveNext '指针下移一行
LOOP
End Sub
4、后台业务数据库基本登记信息表中坐标字段数值的录入。坐标数值录入的工作量是较大的。可以编制相应的坐标录入维护模块。一般流程是:在显示数字地图的主窗口上,弹出浮动窗口显示所有的需要录入坐标的记录,选中一行记录后在数字地图窗口上点击相应位置,表示将该位置做为选中记录的坐标,坐标值由“鼠标单击”或“鼠标双击”事件返回并写入该记录的坐标字段。这样就实现一种“所点即所得”的坐标录入效果。需要注意的是鼠标单击事件返回的坐标值是相对电脑屏幕的绝对值,应根据当前数字地图放大、缩小和移动的比例及位移换算后写入坐标字段。
五、总结
1、本文介绍的数字地图生成方法所要求的软、硬件环境较低。所需软件只是OFFICE的WORD字处理软件,一般的商务PC系统就可以满足开发需求。只有在进行图形文件格式转换保存时,需要用到COLEDRAW软件和图形显示卡较好的PC系统。
2、数字地图描绘的过程操作简单方便。因为使用众所周知的WORD软件进行地图的描绘工作,所以只要有一定WORD软件使用基础的人员稍经培训可以进行数字地图的描绘。描绘工作还可以分工合作协同进行,加快描绘工作速度。实际经验表明,一名熟练的操作员使用WORD单独描绘象武汉这样的大城市的城区数字地图,共耗用20个正常工作日。描绘一幅中等城市的数字地图不会超10个正常工作日。
3、本文介绍的数字地图在程序开发中调用处理简单。首先,几乎所有开发工具都提供基本的“图片控件”用来显示图片,并且大都支持WMF这种微软标准的矢量图片格式;二是,“图片控件”的DRAW“重绘”方法也是所有“图片控件”都支持的方法,可以快速清晰地放大、缩小和移动图片;三是,API函数TEXTOUT()都可以在这些开发工具中直接得到支持。
4、对于更为专业的应用需求,如要求显示的电子地图更加巨大和精确,本文介绍的电子地图制作方法可以进一步处理满足这些需求。在WORD中生成的电子地图文件,在WORD文档中保存的格式是可以使用VBA语言编制的“宏”进行读解的。我们用简单的语句可以读出一条街道线条中的所有顶点X、Y坐标。
Set myDoc = ActiveDocument
For j=1 to myDoc.Shapes.Count ‘文档中线条或多边形的个数
For i=1 to myDoc.Shapes(j).Nodes.Count ‘指定线条或多边形中顶点的个数
pointsArray = myDoc.Shapes(3).Nodes.Item(i).Points
currXvalue = pointsArray(1, 1)‘获得X坐标
currYvalue = pointsArray(1, 2)‘获得Y坐标
……..将数值写入数据库中
Next
Next
………..
试想将这些数据写入电子地图数据库形成记录,我们也可以在程序中调用电子地图数据库动态绘制出几乎无限巨大且高保真的电子地图了。