一种实用的等高线高程自动赋值方法研究
2013-12-29梁佳魏金占韦俊部
摘 要:数字地图中经常存在没有赋高程值和高程值赋值错误的情况,为后期应用及入库带来很多的不便。针对此问题笔者结合Tin三角网原理,提出以高程散点为基准,构建Tin三角网,通过Tin三角形的边长与等高线在空间上的相交关系,自动检查和对等高线进行赋值。经过笔者理论和实践分析,其正确率非常高,完全可用于对地形图等高线高程的检查和自动赋值。
关键词:Tin 自动高程赋值 等高线 空间分析
中图分类号:P283 文献标识码:A 文章编号:1672-3791(2013)06(a)-0039-02
传统的CAD中等高线往往通过高程点注记来识别等高线的高程,因此在CAD应用中,等高线很多就是普通的曲线,没有高程值。随着数字地图的应用范围日益拓广,通过读取等高线的高程值来实现多种应用变得非常普遍,因此等高线没有高程值,对后期数字地图的应用在成很多不便。
1 实现思路
等高线自动高程赋值一直是工程应用中的一个难题,当前常见的处理方式有两种,人工模式和半自动化模式。前者主要通过人工方式,逐条录入等高线的高程值,另一种模式是由人工指定起始等高线,根据等高距及高差,自动通过空间关系完成等高线的高程赋值。前者工作量巨大,在生产中基本不予采用,后者虽然部分实现自动化,但仍需人工干预,特别是出现地貌突变如陡坎、建筑物等,自动赋值往往失败。市场上常见的具有此功能的软件有MapGis、清华山维等。
为了减轻等高线高程赋值的工作量,提高赋值的正确率,笔者拟采用采集的高程点,通过构建Tin三角网,实现等高线高程自动赋值。
传统的CAD地形图中,等高线的高程信息主要通过邻近的高程点进行获取,因此地形图中的高程点具有以下功能。
(1)是获取等高线高程信息的有效手段。
(2)是对数字地图中等高线高程信息进行检核的有效手段。
因此,通过高程点获取等高线高程信息,是最为可行和有效的手段。对等高线和高程点做以下分析。
在没有地形突变的情况下,两高程点的连线与等高线相交的条数必然等于两高程点高程值整数部分差值与基本等高距的比值。如两个高程点高程值整数部分分别为N和M,其整数部分差值为(N-M),假设基本等高距为K,则与此两等高点相交的等高线条数必然为(N-M)/K。
再对(N-M)/K条等高线进行如下分析,首先,以较低的高程点作为基点,分别将其与(N-M)/K条等高线和高程点两点连线的交点进行连接,将得到(N-M)/K条线段。分别求得每条线段与等高线的交点个数P,则待求等高线的高程就等于基点与交点个数的和即(M+P)。
以上思路结构合理,理论严谨,但在应用中仍存在以下问题:首先对于地形突变处的处理,经分析可知,地形突变主要的影响在于等高线的标高出现不连续,如陡坎比高超过基本等高距,则其前后两条等高线的高程差就不为基本等高距。因此可通过如下条件过滤,当出现地形突变,则高程点的连线与等高线的交点必然少于两高程点高程值整数部分的差值。再次,对于交点数虽然等于两高程点高程值整数部分的差值,但仍存在如下可能:如果两个高程点高程值有误,如上文所述,若两高程点高程分别为M+1和N+1,则可能存在高程赋值错误。为此可进行如下处理。
对等高线高程赋值的两点,其连线必须是最优三角形。
当存在多次赋值时,将赋值过程中高程值出现概率最大的赋予对应等高线。
前者可以通过构建Tin三角形满足要求,后者主要是通过概率判断,提升高程赋值的准确性。经过以上分析,即可通过程序实现等高线的自动赋值了。
2 算法实现
通过上文理论分析,通过高程点自动对等高线进行赋值是可行的,为了在程序上实现上文的赋值过程,笔者拟采用如下流程实现等高线的自动赋值。
首先,将等高线提取出来,单独存放一个图层。
其次,将高程注记点提取出来。
第三,通过高程注记点,构建Tin三角形。
第四,读取Tin三角形中每个节点的高程,并赋予三角形的每条边。
第五,读取三角形其中一条边,通过空间分析,求得与之相交的每条等高线。
第六,若交点数与两高程点的高程值整数部分差值相同,则根据等高距,自动将高程值赋予等高线,同时记录赋值的次数,否则不参与赋值。
第七,若出现高程赋值不同,根据赋值次数,将出现概率最大的高程值赋予对应等高线。具体的流程图示例如(图1)。
下文是实现算法的部分关键代码:
DivElevation=Int(RecL.GetFieldValue("端点2"))-Int(RecL.GetFieldValue("端点1"))
//求取Tin三角形边长两端点的高程值
Lts.Add Ln.GetPartAt(1)(1)
TemLine.AddPart Lts
i=Ltt.QueryEx
(TemLine,,"smid>0").RecordCount
Ltes.Add Ln.GetPartAt(1)(2)
//求取一端点交点连线和等高线交点个数
TempLine.AddPart Ltes
j = Ltt.QueryEx
(TempLine,5,"smid>0").RecordCount
//求取另一端点交点连线和等高线交个数
If(Int(RecL.GetFieldValue("端点1")) + i+1)>CDbl(RecL.GetFieldValue("端点1")) And(Int(RecL.GetFieldValue("端点1"))+ i+1) //判断交点的高程值是否在两端点范内 If i+j-1=DivElevation Then //判断交点、端点连线和等高线交点个 //数是否满足端点差值与基本等高距的比值 RecP.Edit bf=RecP.SetFieldValue ("Elevation",Int(RecL.GetFieldValue("端点1"))+i) //将正确的高程信息赋予等高线 RecP.Update End If End If 3 案例分析 为了验证以上思路,笔者拟采用1∶1000地形图约17幅,等高线条数约为5000条,经过初步验证,其识别率非常高,实验证实,通过Tin模式是可以实现自动化对等高线进行赋值。以下是实验数据的抓图。 4 结语 通过高程点及构建Tin三角网模式在理论上可以完美实现对等高线高程的自动赋值,经笔者试验,准确率优于95%以上。出现赋值错误的原因主要在于高程点本身的错误及图幅边界处高程点的缺失,通过高程点构建Tin不仅可以对等高线高程自动赋值,还可以对已经赋值的等高线高程进行检核,实践及理论分析证实,本方法是一种切实可行等高线高程自动赋值方法。未来应用需注意自动赋值时数据量的大小,具体的数据量可根据计算机的性能而定。以Pentium D 3.0G,1∶1000地形图为例,建议每次处理的数据量不超过25幅为宜。 参考文献 [1]SuperMap Objects 开发教程(初级篇) 2008. [2]SuperMap Objects 开发教程(中级篇)2008.