|
管线点高程的自动提取
1.1 问题背景
在地下管线中, 管线点高程是重要的属性, 特别是在管线三维应用中, 管线点的高程是必不可少的信息, 缺少高程信息的管
线将无法进行三维显示。地下管线深埋于地下, 由于管线探测技术的限制以及其它各种因素的影响, 在地下管线生产中, 经常会
出现实测点高程缺失的管线数据,最常见的有两种情况:
1)实测点高程为空,但实测点所在的线的高程不为空。
2)实测点高程为空,实测点所在的线的高程也为空,但实测点所在的线两端点附属物高程不为空。
对于上述两种问题,EPS平台中没有提供现成的处理工具,只能通过定制检查工具将问题数据检查出来, 由于数据手工处理
比较费时费力,必须通过EPS脚本技术编写脚本进行处理。
1.2 问题分析
通过对数据的分析, 计算高程为空的管线点的高程, 首先需要先将高程为空的点先过滤出来, 然后判断高程为空点所在的线
的高程是否为空,如果不为空,则直接通过内插计算点的高程;如果为空, 则查询线的两端点附属物的高程并赋值给线, 最后通
过内插计算点的高程。
管线点高程的自动提取的算法是:
1)过滤出高程为空的管线点。2)对当前过滤出的管线点,查询点所在的线。
3)对当前获取的线,查询线高程值,如果高程值为空,则查询线两端点是否有附属物,如果有附属物,则将
附属物的高程赋值给线。
计算高程为空的管线点到该点所在的线两端点的距离,内插计算获得高程值。
代码如下:
SSProcess.ClearSelection
SSProcess.ClearSelectCondition
SSProcess.SetSelectCondition "SSObj_Type" , "=" ,"POINT"
SSProcess.SetSelectCondition "SSObj_Z" , "==" , "0"
SSProcess.SelectFilter
gs = SSProcess.GetSelGeoCount
dim aaID (100)
For i = 0 To gs - 1
geoID = SSProcess.GetSelGeoValue (i ,"SSObj_ID" )
cm=SSProcess.GetSelGeoValue(i ,"SSObj_LayerName")
SSProcess.GetSelGeoPoint i , 0 , x0 , y0 , z0 , ptype0 ,
name0 ids = SSProcess.SearchNearObjIDs (x0, y0 ,0.001 , 1 , "" , 0 )
if ids"" then
ScanString ids , " , " , aaID , idCount
if idCount=1 then
cm0=SSProcess.GetObjectAttr (aaID(0),"SSObj_LayerName" )
if cm=cm0 then
xID=aaID (0)
linez1=SSProcess.GetObjectAttr (CInt(xID ), "SSObj_Z(0)" )
linez2=SSProcess.GetObjectAttr (CInt(xID ), "SSObj_Z(1)" )
linex1=SSProcess.GetObjectAttr (CInt(xID ), "SSObj_x(0)" )
liney1=SSProcess.GetObjectAttr (CInt(xID ), "SSObj_y(0)" )
linex2=SSProcess.GetObjectAttr (CInt(xID ), "SSObj_x(1)" )
liney2=SSProcess.GetObjectAttr (CInt(xID ), "SSObj_y(1)" )
if linez1 = 0 then
GetNearPntZ cm0 ,xID ,linex1 ,liney1 ,linez1 ,0
end if
if linez2 = 0 then
GetNearPntZ cm0 ,xID ,linex2 ,liney2 ,linez2 ,1
end if
SSProcess.XYSA x0,y0,linex1 ,liney1 ,dist1 ,angle1 ,0
SSProcess.XYSA x0,y0,linex2 ,liney2 ,dist2 ,angle2 ,0
if linez1 0 and linez2 0 then
if linez2-linez1 >0 then insertz=linez1+ (dist1/
(dist1+dist2 )) * ( linez2-linez1 )
else
insertz=linez2+ (dist2/ (dist1+dist2 )) *
(linez1-linez2 )
End if
end if
if linez1 0 and linez2=0 then insertz=linez1 end if
if linez1 = 0 and linez2 0 then insertz=linez2 end if
end if
end if
end if
SSProcess.SetObjectAttr CInt (geoID), "SSObj_Z" ,
insertz
Next
|
|