免费视频|新人指南|投诉删帖|广告合作|地信网APP下载

查看: 3621|回复: 18
收起左侧

EPS自动提取管线点高程的脚本

[复制链接]

30

主题

2668

铜板

13

好友

工程师

Rank: 7Rank: 7Rank: 7

积分
479
发表于 2021-7-15 17:15 | 显示全部楼层 |阅读模式
管线点高程的自动提取
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

10

主题

2万

铜板

34

好友

黄金会员

Rank: 23Rank: 23Rank: 23Rank: 23Rank: 23Rank: 23Rank: 23

积分
4394

精华勋章灌水勋章活跃勋章贡献勋章

发表于 2021-7-16 14:53 | 显示全部楼层
谢谢分享
回复

使用道具 举报

10

主题

1万

铜板

20

好友

资深会员

Rank: 18Rank: 18Rank: 18Rank: 18Rank: 18

积分
3719
发表于 2022-1-30 19:54 | 显示全部楼层
谢谢分享
回复

使用道具 举报

0

主题

216

铜板

1

好友

实习生

Rank: 1

积分
4
发表于 2022-2-11 10:47 | 显示全部楼层
这是高手!
回复

使用道具 举报

0

主题

635

铜板

1

好友

技术员

Rank: 3Rank: 3

积分
32
发表于 2022-4-1 16:41 | 显示全部楼层
高手高手高高手
回复 支持 反对

使用道具 举报

0

主题

444

铜板

1

好友

技术员

Rank: 3Rank: 3

积分
79
发表于 2022-4-23 21:16 | 显示全部楼层
谢谢大佬分享
回复 支持 反对

使用道具 举报

5

主题

2306

铜板

1

好友

至尊VIP

Rank: 24Rank: 24Rank: 24Rank: 24Rank: 24Rank: 24

积分
74
发表于 2022-5-22 10:20 | 显示全部楼层
感谢分享!!!!
回复

使用道具 举报

3

主题

2万

铜板

38

好友

地信院士

Rank: 15Rank: 15Rank: 15Rank: 15Rank: 15

积分
2289
发表于 2022-6-10 14:08 | 显示全部楼层
学习中,谢谢楼主。
回复 支持 反对

使用道具 举报

30

主题

2万

铜板

59

好友

钻石会员

Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26Rank: 26

积分
6281
QQ
发表于 2023-3-23 12:12 | 显示全部楼层
:mg:mg:mg
回复

使用道具 举报

2

主题

1110

铜板

2

好友

工程师

Rank: 7Rank: 7Rank: 7

积分
409
发表于 2023-6-9 12:19 | 显示全部楼层
好多字啊。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

在线客服
快速回复 返回顶部 返回列表