EPS中实现涵洞的自动修复
摘要
关键词
EPS;二次开发;涵洞;修复
正文
1 引 言
清华三维软件作为一款较成熟的地理信息数据处理软件,目前许多单位和企业用它来处理各种地理信息数据。它能够直接读取、调入航测原始数据,而且编辑功能强大。在地形图数据编辑处理以及入库数据的预处理方面具有很大的优势,被许多单位所采用。
2 存在的问题
一般地形图数据的采集都是在专业的数据采集软件上来完成的,然后调入EPS进行处理。由于涵洞在采集软件上的生成方式和EPS不同,结果导致了数据导入EPS中出现错误。要解决这个问题就要从涵洞在不同的软件的生成方式原理上下手。涵洞具体的生成方式是这样的,其在EPS中,涵洞的生成需要沿着涵洞的一条边方向采集1,2两个点,接着沿着涵洞另一条边采集3,4两个点,并且1,2,3,4四个点按顺时针的方向排列,采集完4个点就会自动形成涵洞的样式,如图1所示。而在地形图专业采集软件中,涵洞的生成方式是,先采集1和2号点,然后给出涵洞的宽度就可以自动生成涵洞。这样导致数据导入EPS后,涵洞被分成了单独的两条线段,如图2所示,需要编辑处理才能生成正确的涵洞。知道了问题产生的原因,下面我们就可以解决这个问题。
图 1 图 2
3 问题解决方法
3.1 方法原理
对于图2中的情况,我们将1,2号点的线段称为线段一,另一条线段称为线段二。在软件中首先判读涵洞采集时候的方向是顺时针还是逆时针。如果是顺时针,可以为线段一依次增加两个点,并设定增加点的坐标分别是3号点坐标和4号点坐标。如果是逆时针,首先对线段一进行反向,然后为线段一依次增加两个点,并设定增加点的坐标分别是4号点坐标和3号点坐标,最后将线段二删除。
3.2 解决环境
知道了原理,如果逐一人工去修改,工作量会很大。这时,利用EPS脚本语言进行二次开发,批量的解决这个问题,会大大提高工作效率。在这个平台上,我们通过使用EPS里面的脚本语言就可以实现各种我们需要的功能。
3.3 解决的具体方法
通过脚本语言二次开发,我们可以对所有错误的涵洞一下全处理,具体代码如下:
Sub OnClick()
Dim x0, y0, z0, x1,y1,z1,pointtype, name,flag,irec,d
SSProcess.PushUndoMark
SSProcess.ClearSelection
SSProcess.ClearSelectCondition
SSProcess.SetSelectCondition "SSObj_Code", "==", "451100"
SSProcess.SelectFilter
geoCount = SSProcess.GetSelGeoCount
for i = 0 to (geoCount-2)/2
pointcount = SSProcess.GetSelGeoPointCount(i*2)
if pointcount=2 then
id = SSProcess.GetSelGeoValue(i*2,"SSObj_ID")
SSProcess.GetSelGeoPoint i*2+1,0, x0, y0, z0, pointtype, name
SSProcess.GetDistDir id, x0, y0, irec, flag
if flag=0 then
SSProcess.GetSelGeoPoint i*2+1, 0, x0, y0, z0, pointtype, name
SSProcess.SetSelGeoPoint i*2, 2, x0, y0, z0, pointtype, name
SSProcess.GetSelGeoPoint i*2+1, 1, x0, y0, z0, pointtype, name
SSProcess.SetSelGeoPoint i*2, 3, x0, y0, z0, pointtype, name
elseif flag=1 then
SSProcess.GetSelGeoPoint i*2, 0, x0, y0, z0, pointtype, name
SSProcess.GetSelGeoPoint i*2, 1, x1, y1, z1, pointtype, name
SSProcess.SetSelGeoPoint i*2, 0, x1, y1, z1, pointtype, name
SSProcess.SetSelGeoPoint i*2, 1, x0, y0, z0, pointtype, name
SSProcess.GetSelGeoPoint i*2+1, 1, x0, y0, z0, pointtype, name
SSProcess.SetSelGeoPoint i*2, 2, x0, y0, z0, pointtype, name
SSProcess.GetSelGeoPoint i*2+1, 0, x0, y0, z0, pointtype, name
SSProcess.SetSelGeoPoint i*2, 3, x0, y0, z0, pointtype, name
end if
SSProcess.AddSelGeoToSaveGeoList i*2
SProcess.SaveBufferObjToDatabase
next
for i = 0 to (geoCount-2)/2
SSProcess.DelSelGeo i*2+1
next
End Sub
在本程序中,通过判断线段二上的一个点在线段一的左边或者右边来确定涵洞采集时候的方向为顺时针还是逆时针。
4 存在的缺点
由于本程序是对所有选中的涵洞进行统一处理,所以被选中处理的涵洞必须都是EPS中显示错误的涵洞。如果本来就正确显示的涵洞被误选中处理的话,反而会导致被处理成错误的涵洞。在使用本程序时,可以把专业软件采集的原始数据导入到单独的EPS文件中,将涵洞错误都处理完毕后,再与其他数据合并到一起,这样就可以避免把正确的涵洞修改成错误的。
5 结束语
对于其他采集软件由于采集方式不同,将数据导入EPS中而显示错误的涵洞,本程序通过多次测试都能够准确快速的进行修复,避免了大量重复的手动修改,提高了工作效率,在实际的生产中发挥了重要的作用。
参考文献
[1] 徐中华,刘万华,余成江. 清华山维一体化软件EPS脚本语言的应用[J]. 城市勘测,2007(06)
[2] 付海波,王磊. 基于EPS脚本语言VBScript的二次开发研究[J]. 大众科技,2010(07):20-21
[3] 王国云. 运用清华山维EPS2008进行局任务入库的探究. 科技创新与应用,2018(06):155-156
...