第三章 城市地下管线信息系统的算法研究Word格式文档下载.docx
《第三章 城市地下管线信息系统的算法研究Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《第三章 城市地下管线信息系统的算法研究Word格式文档下载.docx(11页珍藏版)》请在冰豆网上搜索。
获取管线点标准坐标数据文件
读该文件并以行为一记录写入数组linearray中
确定管线点的总点数
for(管线的总点数)
从linearry中逐记录分离出各每一记录的内部元素
写数据元素到管线点结构数组中
}
释放linearray
MessageBox("
管线点数据文件已成功写入结构coordata!
"
);
//为不重复写结点而设置一标记
for(所有结点)
nodearray.SetAtGrow(l,"
fause"
写所有管线点MIF文件的头
for(所有管线根数)
//根据LineUserID确定管线点MIF文件的名、颜色及类型
if(line[k].LineID<
200000&
&
line[k].LineID>
=100000)
{
CStringgoal="
c:
\\mappipeline\\data\\mif\\JSP001.mif"
;
CStringgoal1="
\\mappipeline\\data\\mif\\JSP001.mid"
CStringgoal2="
\\mappipeline\\data\\mif\\JST001.mif"
CStringLColor="
255"
ltype="
JS"
//写管线点MIF文件的数据节
CTopolbuildView:
WriteMifLinePointEntry
(k,goal,goal1,goal2,LColor,ltype);
...(共九类,其实现算法同上述给水管线。
)
各类管线点的*.mif;
*.mid文件生成完毕!
Invalidate();
}
3.3管线点MIF文件数据节的生成算法
如前所述,MIF文件包括两部分,即MIF文件的头和数据节。
MIF文件的数据节主要对应的是点对象、线对象、区域对象等图形信息,如无数据节,则所得到的MIF文件只是一个空表并无实际意义。
管线点MIF文件数据节的生成算法如下:
(ints,CStringgoalfile,CStringgoalfile1,
CStringgoalfile2,CStringLColor,CStringLType)
//生成管线点MIF文件数据节
定义变量用于写MIF文件的数据节
利用VC的CstdioFile类定义一文件对象,该对象实现文件的写操作
置该文件尾部
写一回车换行符号
for(一管线的组成弧段数)
for(所有弧段数)
{
if(该管线的一组成弧段是某一弧段)
for(所有管线点数)
if(该弧段的起结点是某一管线点)
for(所有的管线结点数)
{
if(该弧段的起结点是某一结点)
if(该结点标记为“fause”,)
按MapInfo的MIF文件格式写管线点数据CTopolbuildView:
WriteMidLinePAtribute(n,goalfile1,LType);
//写管线点MID文件CTopolbuildView:
WriteMifPText(n,goalfile2,LType);
//写管线点注记文件
nodearray[h]="
true"
//写完结点后,作一标记
}
}
}
//写弧段内点
for(该弧段内点数)
if(该弧段一内点是某一管线点)
按MapInfo的MIF文件格式写管线点数据
WriteMidLinePAtribute
(n,goalfile1,LType);
//写管线点MID文件
WriteMifPText
(n,goalfile2,LType);
//写终结点,算法同起结点相同
//MessageBox("
thesecondwrited"
}
entryfile.Close();
//关闭该文件
3.4交点搜索和线性内插算法
该算法是绘制管线纵横断面图的关键。
通过该算法,可获取管线断面与所截管线的交点的平面位置,同时可搜索出交点的两个相邻点,并采用线性内插的方法求出该交点的地面高、管顶高和管底高。
交点搜索和线性内插算法主要由三个部分构成:
判断断面与管线相交并求交点、搜索交点两相邻点、线性内插。
算法描述如下:
(1)计算管线图中已打开的相关管线表的个数,逐表进行扫描、循环。
(2)计算某一管线TAB表中的记录数(管线根数),逐记录进行扫描、循环。
判断断面线是否与该记录相交,如果相交求出交点的X,Y。
如果不相交则继续对表的下一记录进行判断。
(3)如果存在交点,依次求该管线每连续两点的最小BOX,判断交点是否在最小BOX内。
(4)如果在某一最小BOX内,则进行如下判断:
(5)求交点到这两点所确定的直线的距离,如果该距离大于一给定限值,则此最小BOX不是所要求的最小BOX,继续进行搜索。
(6)如果距离小于给定的限值,则该最小BOX即为所要查找的BOX,然后求出此最小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、ZB1
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.5空间分析算法
管线空间分析主要包括空间位置分析、相交分析、包含分析和网络分析,本文主要研究相交分析(叠置分析)和包含分析算法。
3.5.1相交分析算法
相交分析算法实现区域对象(任一图上区域或用户自定义区域)与管线线对象及区域对象的相交叠置计算,通过该算法可获取相交计算后的管线线对象的长度及面对象的面积。
相交分析算法如下:
//主程序
submain
定义各变量
打开表fzxc.tab用于用户自定义一区域
获取表的存贮路径
if用户选择了一个表中的一面对象,then
获取所选表的表名
把该面对象赋值给一对象变量
获取所选对象类型
if所选对象类型为一区域(region)then
调相交分析子程序(subintersectsys)进行相交计算
endif
else
note"
请在地图窗口选择一个区域对象"
endsub
//相交分析计算
subintersectsys
创建一新表"
INSresult.tab"
用于相交分析结果属性数据显示输出
定义一地图窗口用于相交分析结果图形显示输出
curpen=Currentpen()//获取目前线样式
curbrush=MakeBrush(1,BLUE,red)//获取目前区域样式
//逐表进行相交运算(如下为给水管线表)
求给水管线同所选区相交的记录,并赋给一临时表jsl_temp.tab中
获取表中的记录数
if记录数不为零then
选择第一条记录
do
jsl_zone=jsl_temp.obj//把该记录所对应的对象赋给一对象变量
returns=Overlap(region1,jsl_zone)//获取相交计算后的对象
改变线样式
设置记录加数器
通过s1、s2、s3、s4、s5、s6设置相交分析结果表属性值
InsertIntoINSresultValues(s1,s2,s3,s4,s5,s6)
//插入相交分析结果表(INSresult)一记录,并更新。
FetchNextFromjsl_temp//搜索下一记录,进行如上操作。
LoopWhileNotEOT(jsl_temp)//如果未到表结束,继续进行循环
...
//对其它表进行相交计算,如排水管线表、燃气管线表等共九类表,其算法相同。
//区域与面对象的相交计算的算法与上述算法一致。
Endsub
3.5.2包含分析算法
包含分析算法实现区域对象(任一图上区域或用户自定义区域)与管线点点对象的包含计算,通过该算法可查询分析出该区域对象内的用户所要获取的信息。
包含分析算法如下: