第三章 城市地下管线信息系统的算法研究.docx

上传人:b****6 文档编号:5660630 上传时间:2022-12-30 格式:DOCX 页数:11 大小:212.21KB
下载 相关 举报
第三章 城市地下管线信息系统的算法研究.docx_第1页
第1页 / 共11页
第三章 城市地下管线信息系统的算法研究.docx_第2页
第2页 / 共11页
第三章 城市地下管线信息系统的算法研究.docx_第3页
第3页 / 共11页
第三章 城市地下管线信息系统的算法研究.docx_第4页
第4页 / 共11页
第三章 城市地下管线信息系统的算法研究.docx_第5页
第5页 / 共11页
点击查看更多>>
下载资源
资源描述

第三章 城市地下管线信息系统的算法研究.docx

《第三章 城市地下管线信息系统的算法研究.docx》由会员分享,可在线阅读,更多相关《第三章 城市地下管线信息系统的算法研究.docx(11页珍藏版)》请在冰豆网上搜索。

第三章 城市地下管线信息系统的算法研究.docx

第三章城市地下管线信息系统的算法研究

第三章城市地下管线信息系统的算法研究

3.1拓扑数据生成算法

由于管网的空间关系相对较为简单,基本上不存在线与面的关系,只包含线与弧段、线与结点、弧段与结点之间的拓扑关系。

它们之间的拓扑关系在第二章已阐述。

管网拓扑数据通过管线索引数据文件生成。

算法采用VisualC++5.0编程实现,在算法的设计过程中主要使用数组、结构及结构数组的数据存贮方式。

有关拓扑数据生成算法如下(PAD图):

3.2管线点MIF、MID文件生成算法

MIF文件用于保存管线点的图形数据,而MID文件用于保存管线点的属性数据,它们是管网成图的关键。

MIF、MID文件是在管线拓扑数据文件的基础上生成的。

管线点MIF、MID文件生成的算法如下:

voidCTopolbuildView:

:

OnPointBuild()//生成管线点MIF文件

{

设置一对话框

if(确认)

{

获取管线点标准坐标数据文件

读该文件并以行为一记录写入数组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="c:

\\mappipeline\\data\\mif\\JSP001.mid";

CStringgoal2="c:

\\mappipeline\\data\\mif\\JST001.mif";

CStringLColor="255";

ltype="JS";

//写管线点MIF文件的数据节

CTopolbuildView:

:

WriteMifLinePointEntry

(k,goal,goal1,goal2,LColor,ltype);

}

...(共九类,其实现算法同上述给水管线。

}

MessageBox("各类管线点的*.mif;*.mid文件生成完毕!

");

Invalidate();

}

}

 

3.3管线点MIF文件数据节的生成算法

如前所述,MIF文件包括两部分,即MIF文件的头和数据节。

MIF文件的数据节主要对应的是点对象、线对象、区域对象等图形信息,如无数据节,则所得到的MIF文件只是一个空表并无实际意义。

管线点MIF文件数据节的生成算法如下:

voidCTopolbuildView:

:

WriteMifLinePointEntry

(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(该弧段内点数)

{

for(所有管线点数)

{

if(该弧段一内点是某一管线点)

{

按MapInfo的MIF文件格式写管线点数据

CTopolbuildView:

:

WriteMidLinePAtribute

(n,goalfile1,LType);//写管线点MID文件

CTopolbuildView:

:

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"请在地图窗口选择一个区域对象"

endif

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)//如果未到表结束,继续进行循环

endif

...

//对其它表进行相交计算,如排水管线表、燃气管线表等共九类表,其算法相同。

//区域与面对象的相交计算的算法与上述算法一致。

Endsub

3.5.2包含分析算法

包含分析算法实现区域对象(任一图上区域或用户自定义区域)与管线点点对象的包含计算,通过该算法可查询分析出该区域对象内的用户所要获取的信息。

包含分析算法如下:

 

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 经管营销

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1