摘要:在传统的测绘方式中,由于受成图方式和制图软件的限制,一些数字化成果的高程数据没有属性,给数据处理和利用造成了一定的麻烦。本文通过利用计算机程序解决了这一问题,在实际应用中效果较好。
关键词:高程;属性;程序;地形图
0、引言
目前,测绘生产部门大多采用AutoCAD来生成和管理地形图数据,在CAD中,数据一般是按照地形要素分层存放的。因为各单位绘图软件的不同,在生成*.DWG图时高程点的图层和点的属性也不同,有些单位因为软件的限制,一般把高程注记只是按注记文本在CAD中进行组织和管理。在这种组织方式下,图形和属性之间的联系仅体现在平面位置上的靠近,这就割裂了图形和属性之间的关联,造成了高程数据无法直接读取和属性提取。主要缺陷在于:(1)在更换图的比例尺时候很难根据实际情况均匀的删除高程注记。(2)很难自动提取异常高程。(3)这种高程数据做不了数字高程模型(DEM)。(4)做不了GIS的属性数据。(5)在做土方量计算的时候,这种高程数据计算起来相当麻烦。
在分析了不同时期用不同软件做出的数字化地形图之后,我找到了一种好的方法,可以自动删除多余的高程注记,使高程点根据实际情况均匀分布,可以根据用户的输入条件自动删除异常高程点,可以把没有属性的高程点加入属性,方便做土方量计算和数字高程模型,可以生成GIS需要的三维高程数据文本文件。
1、实现原理
首先获取高程点所在的图层名称,其次获取高程点的属性,一般为POINT,LWPOLYLINE,CIRCLE,BLOCK等,根据高程点的平面坐标位置获取离此高程点最近的数字文本注记,判断是否是高程值,建立文本文件,依次写入点号、X坐标、Y坐标、Z坐标(也就是离此高程点最近的数字文本注记)。然后删除所有的高程点,等待用户输入:(1)高程点之间的最小距离、(2)用户认为异常高程点的范围值,重新绘制带有属性的三维高程点,程序流程见图一。
图一:程序框图
2、程序的实现
开发CAD的语言有很多,常用的有VLISP、VBA、ARX等,可以根据程序要求选择一种适合的语言,本程序并不复杂,而且考虑到安全问题,所以选用VLISP语言进行开发,为了减少篇幅,只给出关键部分的代码,如下所述。
(1)获取地形图上的高程点,这里只给出简单代码:
(setqss1(ssget'((-4."<OR")
(-4."<AND")
(0."LWPOLYLINE")
(40.0.125)
(-4."AND>")
(-4."<AND")
(0."INSERT")
(8."GCD")
(-4."AND>")
(-4."OR>")
…
…
)
)
)
(2)根据选择集中的高程点属性的不同,分别建立区域选择集,根据地形图比例尺的不同,建立的区域选择集也不同,简单的语句为:
(ssget"W"(list…)(list…)'((0."TEXT")))
(3)写入文件的语句为
(write-line(strcat…))
(4)建立完高程数据文件,就要根据用户的输入重新绘制高程点了,这里是本程序的核心部门,主要思路是:首先等待用户输入要绘制高程点间的最小距离和异常值的范围,然后从刚生成的文件里提取高程数据,判断是不是异常高程,如果不是则在CAD窗口里绘制该高程点,读下一行数据,如果该数据离刚刚绘制的高程点的距离满足用户要求而且不是异常高,则绘制。读下一行,如果该数据离前面已经绘制的两个高程点的距离满足用户要求而且不是异常高,则绘制,依次例推…。
主要代码为:
(setqpf(open"d:\文件夹\txz.txt""r"))
(setqi0)
(setqreco(read-linepf))
(whilereco
(setqsxb(flzreco))
(setqpt(list(atof(nth1sxb))(atof(nth2sxb))(atof(nth3sxb))))
(set(read(strcat"NUM["(rtosi)"]"))pt)
(setqreco(read-linepf))
(setqi(+1i)))
(closepf)
(setqi(-i1))
(setq j0
t0
m0
a0)
(set(read(strcat"NUM1["(rtos0)"]"))(eval(read(strcat"NUM["(rtos0)"]"))))
(while(<ji)
(while(<tm)
(if(>(distance(list(car(eval(read(strcat"NUM["(rtosj)"]"))))(cadr(eval(read(strcat"NUM["(rtosj)"]")))))(eval(read(strcat"NUM1["(rtost)"]"))))del_dist)
(setqa(1+a)))
(setqt(1+t)))
(if(=am)
(progn
(set(read(strcat"NUM1["(rtosm)"]"))(eval(read(strcat"NUM["(rtosj)"]"))))
(setqm(1+m))))
(setqa0t0)
(setqj(1+j)))
(setqi0)
(while(<im)
(command"insert""500"(eval(read(strcat"NUM1["(rtosi)"]")))blcblc"")
(command"text"(polar(eval(read(strcat"NUM1["(rtosi)"]")))0blc)blc0(rtos(caddr(eval(read(strcat"NUM1["(rtosi)"]"))))2xsd)"")
(setqi(1+i)))))
(princ))
其中flz是一个分解字符串生成表的函数,由于节省篇幅,这里没有给出具体代码。
3、关于程序的一些说明
不同的地形图的高程点的属性可能不同,应根据实际情况,判断高程点的平面坐标和高程坐标,有的时候判断高程坐标的时候不能只根据高程点的平面坐标到文字的距离进行简单的判断,而且在处理数据量比较大的地形图时,要考虑程序的优化问题,使它占用计算机内存最小,而且随时的释放占用的内存,以达到程序运行稳定,处理速度快,出错率低。
参考文献:
[1]刘国钧,陈绍业,王凤翥.图书馆目录[M].北京:高等教育出版社,1957