1、第三章 城市地下管线信息系统的算法研究第三章 城市地下管线信息系统的算法研究3.1 拓扑数据生成算法由于管网的空间关系相对较为简单,基本上不存在线与面的关系,只包含线与弧段、线与结点、弧段与结点之间的拓扑关系。它们之间的拓扑关系在第二章已阐述。管网拓扑数据通过管线索引数据文件生成。算法采用Visual C+ 5.0编程实现,在算法的设计过程中主要使用数组、结构及结构数组的数据存贮方式。有关拓扑数据生成算法如下(PAD图): 3.2 管线点MIF、MID文件生成算法 MIF文件用于保存管线点的图形数据,而MID文件用于保存管线点的属性数据,它们是管网成图的关键。MIF、MID文件是在管线拓扑数据
2、文件的基础上生成的。管线点MIF、MID文件生成的算法如下: void CTopolbuildView:OnPointBuild() / 生成管线点MIF文件 设置一对话框 if(确认) 获取管线点标准坐标数据文件 读该文件并以行为一记录写入数组linearray中 确定管线点的总点数 for (管线的总点数) 从linearry中逐记录分离出各每一记录的内部元素 写数据元素到管线点结构数组中 释放linearray MessageBox(管线点数据文件已成功写入结构coordata!); / 为不重复写结点而设置一标记 for(所有结点) nodearray.SetAtGrow( l, fa
3、use); 写所有管线点MIF文件的头 for(所有管线根数) /根据LineUserID 确定管线点MIF文件的名、颜色及类型 if (linek.LineID=100000) CString goal=c:mappipelinedatamifJSP001.mif; CString goal1=c:mappipelinedatamifJSP001.mid; CString goal2=c:mappipelinedatamifJST001.mif; CString LColor=255; ltype=JS; / 写管线点MIF文件的数据节 CTopolbuildView:WriteMifLin
4、ePointEntry (k,goal,goal1,goal2,LColor,ltype); (共九类,其实现算法同上述给水管线。) MessageBox(各类管线点的*.mif;*.mid文件生成完毕!); Invalidate(); 3.3 管线点MIF文件数据节的生成算法 如前所述,MIF文件包括两部分,即MIF文件的头和数据节。MIF文件的数据节主要对应的是点对象、线对象、区域对象等图形信息,如无数据节,则所得到的MIF文件只是一个空表并无实际意义。管线点MIF文件数据节的生成算法如下: void CTopolbuildView:WriteMifLinePointEntry (int
5、s ,CString goalfile,CString goalfile1, CString goalfile2,CString LColor,CString LType) / 生成管线点MIF文件数据节 定义变量用于写MIF文件的数据节 利用VC 的CstdioFile类定义一文件对象,该对象实现文件的写操作 置该文件尾部 写一回车换行符号 for(一管线的组成弧段数) for(所有弧段数) if (该管线的一组成弧段是某一弧段) for(所有管线点数) if(该弧段的起结点是某一管线点) for(所有的管线结点数) if (该弧段的起结点是某一结点) if(该结点标记为“fause”,)
6、按MapInfo的MIF文件格式写管线点数据 CTopolbuildView:WriteMidLinePAtribute(n,goalfile1,LType);/写管线点MID文件 CTopolbuildView:WriteMifPText(n,goalfile2,LType);/写管线点注记文件 nodearrayh=true;/写完结点后,作一标记 /写弧段内点 for(该弧段内点数) for(所有管线点数) if(该弧段一内点是某一管线点) 按MapInfo的MIF文件格式写管线点数据 CTopolbuildView:WriteMidLinePAtribute (n,goalfile1,
7、LType);/写管线点MID文件 CTopolbuildView:WriteMifPText (n,goalfile2,LType);/写管线点注记文件 /写终结点,算法同起结点相同 /MessageBox(the second writed); entryfile.Close();/ 关闭该文件 3.4 交点搜索和线性内插算法 该算法是绘制管线纵横断面图的关键。通过该算法,可获取管线断面与所截管线的交点的平面位置,同时可搜索出交点的两个相邻点,并采用线性内插的方法求出该交点的地面高、管顶高和管底高。 交点搜索和线性内插算法主要由三个部分构成:判断断面与管线相交并求交点、搜索交点两相邻点、线
8、性内插。算法描述如下: (1) 计算管线图中已打开的相关管线表的个数,逐表进行扫描、循环。 (2) 计算某一管线TAB表中的记录数(管线根数),逐记录进行扫描、循环。判断断面线是否与该记录相交,如果相交求出交点的X,Y。如果不相交则继续对表的下一记录进行判断。 (3) 如果存在交点,依次求该管线每连续两点的最小BOX,判断交点是否在最小BOX内。 (4) 如果在某一最小BOX内,则进行如下判断: (5) 求交点到这两点所确定的直线的距离,如果该距离大于一给定限值,则此最小BOX不是所要求的最小BOX,继续进行搜索。 (6) 如果距离小于给定的限值,则该最小BOX即为所要查找的BOX,然后求出此
9、最小BOX的大小两点(即交点的前后两点),记录点标识(POINTID)。 (7) 通过如上所得的点标识(POINTID),分别得到1点的X、Y、Z、ZT、ZB和2点的X、Y、Z、ZT、ZB,如图3-1。 (8) 求交点p与1点的距离S1和1、2两点的距离S。 (9) 求交点的Z、ZT、ZB 1 Zp=Z1+S1/S * (Z2 - Z1) p ZTp=ZT1+S1/S * (ZT2 - ZT1) ZBp=Z1+S1/S * (ZB2 - ZB1) 2 (10) 把这此数据写入自定义的数据结构中。 图3-1 (11) 逐记录逐表进行循环,直至全部结束。 (12) 把交点数据写入数据文件之中。3.
10、5 空间分析算法 管线空间分析主要包括空间位置分析、相交分析、包含分析和网络分析,本文主要研究相交分析(叠置分析)和包含分析算法。3.5.1 相交分析算法 相交分析算法实现区域对象(任一图上区域或用户自定义区域)与管线线对象及区域对象的相交叠置计算,通过该算法可获取相交计算后的管线线对象的长度及面对象的面积。相交分析算法如下:/主程序sub main 定义各变量 打开表fzxc.tab用于用户自定义一区域 获取表的存贮路径 if 用户选择了一个表中的一面对象,then 获取所选表的表名 把该面对象赋值给一对象变量 获取所选对象类型 if 所选对象类型为一区域(region) then 调相交分
11、析子程序(sub intersectsys)进行相交计算 end if else note 请在地图窗口选择一个区域对象 end ifend sub /相交分析计算sub intersectsys 定义各变量 创建一新表INSresult.tab用于相交分析结果属性数据显示输出定义一地图窗口用于相交分析结果图形显示输出 curpen = Currentpen() /获取目前线样式 curbrush=MakeBrush(1, BLUE,red) / 获取目前区域样式 /逐表进行相交运算(如下为给水管线表) 求给水管线同所选区相交的记录,并赋给一临时表jsl_temp.tab中 获取表中的记录数
12、if 记录数不为零 then 选择第一条记录 do jsl_zone=jsl_temp.obj /把该记录所对应的对象赋给一对象变量 returns=Overlap(region1,jsl_zone)/获取相交计算后的对象 改变线样式 设置记录加数器 通过s1、s2、s3、s4、s5、s6设置相交分析结果表属性值 Insert Into INSresult Values(s1,s2,s3,s4,s5,s6) /插入相交分析结果表(INSresult)一记录,并更新。 Fetch Next From jsl_temp/ 搜索下一记录,进行如上操作。 Loop While Not EOT(jsl_temp)/ 如果未到表结束,继续进行循环 end if /对其它表进行相交计算,如排水管线表、燃气管线表等共九类表,其算法相同。 /区域与面对象的相交计算的算法与上述算法一致。End sub 3.5.2 包含分析算法 包含分析算法实现区域对象(任一图上区域或用户自定义区域)与管线点点对象的包含计算,通过该算法可查询分析出该区域对象内的用户所要获取的信息。包含分析算法如下:
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1