1、第 三 章 城 市 地 下 管 线 信 息 系 统 的 算 法 研 究3.1 拓 扑 数 据 生 成 算 法由 于 管 网 的 空 间 关 系 相 对 较 为 简 单 , 基 本 上 不 存 在 线 与 面 的 关 系 , 只 包 含 线与 弧 段 、 线 与 结 点 、 弧 段 与 结 点 之 间 的 拓 扑 关 系 。 它 们 之 间 的 拓 扑 关 系 在 第 二 章已 阐 述 。 管 网 拓 扑 数 据 通 过 管 线 索 引 数 据 文 件 生 成 。 算 法 采 用 Visual C+ 5.0编程 实 现 , 在 算 法 的 设 计 过 程 中 主 要 使 用 数 组 、 结 构
2、及 结 构 数 组 的 数 据 存 贮 方 式 。有 关 拓 扑 数 据 生 成 算 法 如 下 ( PAD图 ) :通 过 对 话 框 获 取 管 线 数 据 索 引 文 件p1读 该 文 件 , 并 以 行 为 记 录 写 入 一 数 组linearay中 p2While C=100000) CString goal=“c:mappipelinedatamifJSP001.mif“;CString goal1=“c:mappipelinedatamifJSP001.mid“;CString goal2=“c:mappipelinedatamifJST001.mif“;CString LCo
3、lor=“255“;ltype=“JS“;/ 写 管 线 点 MIF 文 件 的 数 据 节 CTopolbuildView:WriteMifLinePointEntry(k,goal,goal1,goal2,LColor,ltype); ( 共 九 类 , 其 实 现 算 法 同 上 述 给 水 管 线 。 )MessageBox(“各 类 管 线 点 的 *.mif;*.mid 文 件 生 成 完 毕 !“);Invalidate(); 3.3 管 线 点 MIF文 件 数 据 节 的 生 成 算 法如 前 所 述 , MIF文 件 包 括 两 部 分 , 即 MIF文 件 的 头 和 数
4、 据 节 。 MIF文 件 的 数据 节 主 要 对 应 的 是 点 对 象 、 线 对 象 、 区 域 对 象 等 图 形 信 息 , 如 无 数 据 节 , 则 所 得到 的 MIF文 件 只 是 一 个 空 表 并 无 实 际 意 义 。 管 线 点 MIF文 件 数 据 节 的 生 成 算 法 如下 :void CTopolbuildView:WriteMifLinePointEntry(int s ,CString goalfile,CString goalfile1,CString goalfile2,CString LColor,CString LType)/ 生 成 管 线 点
5、 MIF 文 件 数 据 节定 义 变 量 用 于 写 MIF 文 件 的 数 据 节利 用 VC 的 CstdioFile 类 定 义 一 文 件 对 象 , 该 对 象 实 现 文 件 的 写 操 作置 该 文 件 尾 部写 一 回 车 换 行 符 号for(一 管 线 的 组 成 弧 段 数 )for(所 有 弧 段 数 )if (该 管 线 的 一 组 成 弧 段 是 某 一 弧 段 ) for(所 有 管 线 点 数 )if(该 弧 段 的 起 结 点 是 某 一 管 线 点 )for(所 有 的 管 线 结 点 数 )if (该 弧 段 的 起 结 点 是 某 一 结 点 )if(
6、该 结 点 标 记 为 “fause”, )按 MapInfo 的 MIF 文 件 格 式 写 管 线 点 数 据 CTopolbuildView:WriteMidLinePAtribute(n,goalfile1,LType);/写 管 线 点 MID 文 件 CTopolbuildView:WriteMifPText(n,goalfile2,LType);/写 管 线 点 注 记 文 件nodearrayh=“true“;/写 完 结 点 后 , 作 一 标 记/写 弧 段 内 点for(该 弧 段 内 点 数 )for(所 有 管 线 点 数 )if(该 弧 段 一 内 点 是 某 一
7、管 线 点 )按 MapInfo 的 MIF 文 件 格 式 写 管 线 点 数 据CTopolbuildView:WriteMidLinePAtribute(n,goalfile1,LType);/写 管 线 点 MID 文 件CTopolbuildView:WriteMifPText(n,goalfile2,LType);/写 管 线 点 注 记 文 件/写 终 结 点 , 算 法 同 起 结 点 相 同/MessageBox(“the second writed“); entryfile.Close();/ 关 闭 该 文 件3.4 交 点 搜 索 和 线 性 内 插 算 法该 算 法
8、是 绘 制 管 线 纵 横 断 面 图 的 关 键 。 通 过 该 算 法 , 可 获 取 管 线 断 面 与 所 截管 线 的 交 点 的 平 面 位 置 , 同 时 可 搜 索 出 交 点 的 两 个 相 邻 点 , 并 采 用 线 性 内 插 的 方法 求 出 该 交 点 的 地 面 高 、 管 顶 高 和 管 底 高 。交 点 搜 索 和 线 性 内 插 算 法 主 要 由 三 个 部 分 构 成 : 判 断 断 面 与 管 线 相 交 并 求 交点 、 搜 索 交 点 两 相 邻 点 、 线 性 内 插 。 算 法 描 述 如 下 :(1) 计 算 管 线 图 中 已 打 开 的 相
9、 关 管 线 表 的 个 数 , 逐 表 进 行 扫 描 、 循 环 。(2) 计 算 某 一 管 线 TAB表 中 的 记 录 数 ( 管 线 根 数 ) , 逐 记 录 进 行 扫 描 、 循 环 。判 断 断 面 线 是 否 与 该 记 录 相 交 , 如 果 相 交 求 出 交 点 的 X, Y。 如 果 不 相 交 则 继 续对 表 的 下 一 记 录 进 行 判 断 。(3) 如 果 存 在 交 点 , 依 次 求 该 管 线 每 连 续 两 点 的 最 小 BOX, 判 断 交 点 是 否 在最 小 BOX内 。(4) 如 果 在 某 一 最 小 BOX内 , 则 进 行 如 下
10、 判 断 :(5) 求 交 点 到 这 两 点 所 确 定 的 直 线 的 距 离 , 如 果 该 距 离 大 于 一 给 定 限 值 , 则此 最 小 BOX不 是 所 要 求 的 最 小 BOX, 继 续 进 行 搜 索 。(6) 如 果 距 离 小 于 给 定 的 限 值 , 则 该 最 小 BOX即 为 所 要 查 找 的 BOX, 然 后求 出 此 最 小 BOX的 大 小 两 点 ( 即 交 点 的 前 后 两 点 ) , 记 录 点 标 识 ( POINTID) 。(7) 通 过 如 上 所 得 的 点 标 识 ( POINTID) , 分 别 得 到 1点 的X、 Y、 Z、
11、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
12、.5 空 间 分 析 算 法管 线 空 间 分 析 主 要 包 括 空 间 位 置 分 析 、 相 交 分 析 、 包 含 分 析 和 网 络 分 析 , 本文 主 要 研 究 相 交 分 析 ( 叠 置 分 析 ) 和 包 含 分 析 算 法 。3.5.1 相 交 分 析 算 法相 交 分 析 算 法 实 现 区 域 对 象 ( 任 一 图 上 区 域 或 用 户 自 定 义 区 域 ) 与 管 线 线 对象 及 区 域 对 象 的 相 交 叠 置 计 算 , 通 过 该 算 法 可 获 取 相 交 计 算 后 的 管 线 线 对 象 的 长度 及 面 对 象 的 面 积 。 相 交 分 析
13、 算 法 如 下 :/主 程 序sub main定 义 各 变 量打 开 表 fzxc.tab用 于 用 户 自 定 义 一 区 域获 取 表 的 存 贮 路 径 if 用 户 选 择 了 一 个 表 中 的 一 面 对 象 , then 获 取 所 选 表 的 表 名把 该 面 对 象 赋 值 给 一 对 象 变 量获 取 所 选 对 象 类 型if 所 选 对 象 类 型 为 一 区 域 ( region) then调 相 交 分 析 子 程 序 (sub intersectsys)进 行 相 交 计 算end ifelsenote “ 请 在 地 图 窗 口 选 择 一 个 区 域 对
14、象 “end ifend sub/相 交 分 析 计 算sub intersectsys定 义 各 变 量创 建 一 新 表 “INSresult.tab“用 于 相 交 分 析 结 果 属 性 数 据 显 示 输 出定 义 一 地 图 窗 口 用 于 相 交 分 析 结 果 图 形 显 示 输 出 curpen = Currentpen() /获 取 目 前 线 样 式curbrush=MakeBrush(1, BLUE,red) / 获 取 目 前 区 域 样 式/逐 表 进 行 相 交 运 算 (如 下 为 给 水 管 线 表 )求 给 水 管 线 同 所 选 区 相 交 的 记 录 ,
15、 并 赋 给 一 临 时 表 jsl_temp.tab中获 取 表 中 的 记 录 数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,
16、s5,s6) /插 入 相 交 分 析 结 果 表 ( INSresult) 一 记 录 ,并 更 新 。Fetch Next From jsl_temp/ 搜 索 下 一 记 录 , 进 行 如 上 操 作 。Loop While Not EOT(jsl_temp)/ 如 果 未 到 表 结 束 , 继 续 进 行 循 环end if /对 其 它 表 进 行 相 交 计 算 , 如 排 水 管 线 表 、 燃 气 管 线 表 等 共 九 类 表 , 其 算法 相 同 。/区 域 与 面 对 象 的 相 交 计 算 的 算 法 与 上 述 算 法 一 致 。End sub3.5.2 包 含
17、分 析 算 法包 含 分 析 算 法 实 现 区 域 对 象 ( 任 一 图 上 区 域 或 用 户 自 定 义 区 域 ) 与 管 线 点 点对 象 的 包 含 计 算 , 通 过 该 算 法 可 查 询 分 析 出 该 区 域 对 象 内 的 用 户 所 要 获 取 的 信 息 。包 含 分 析 算 法 如 下 : C1: 所 选 对 象 是 否 为 一 区 域 对 象 ;C2: 是 否 选 取 对 话 框 确 认 按 钮定 义 变 量 p1获 取 所 选 区 域 对 象 所 在 表 的 表 名 p2转 到 p7 p3设 置 对 话 框 用 于 用 户 选 择 包 含 分 析 条 件 p4
18、进 行 包 含 分 析 计 算 p5结 束 程 序 运 行 p6提 示 用 户 选 择 一 区 域 对 象 p7结 束 程 序 运 行 p8C1C2其 中 C3: 是 否 忽 略 条 件 ; L1: “=”、 L2: “”、 L3: “”; L1、 L12、 、L121: 表 示 管 线点 各 属 性 字 段 内 容 。P5定 义 变 量删 除 临 时 表把 所 选 区 域 对 象 赋 给 一 对 象 变 量进 行 包 含 运 算 Cal calculate0Cal calculate 101Cal calculate 102Cal calculate 104Cal calculate 103
19、Cal calculate 201Cal calculate 202Cal calculate 204Cal calculate 203Cal calculate 301Cal calculate 302Cal calculate 321Cal calculate 303Cal calculate 401Cal calculate 402Cal calculate 421Cal calculate 403C3 L1L2L3L4 L1L12L13L121L1L12L13L121L1L12L13L121L1L12L13L121其 中 C4: 是 否 选 择 所 有 管 线 点 表 ;C5: 是 否
20、 选 择 了 给 水 管 线 点 表 ;C6: 是 否 是 第 一 次 写 分 析 结 果 到 结 果 表 中 ;C7: 是 否 选 择 了 排 水 管 线 点 表 ;Calculate10定 义 变 量 对 附 合 条 件 的 给 水 管 线 点 进 行 包 含 运 算对 附 合 条 件 的 排 水 管 线 点 进 行 包 含 运 算 共 九 类 管 线 点合 并 包 含 分 析 结 果 到 表 temp1.tab中 4进 行 包 含 运 算空 操 作C5 C6另 存 分 析 结 果 表 为temp1.tab并 打 开 表设 置 一 标 计插 入 分 析 结 果 到 结 果 表 中C7 对 应 于 各 类 管 线 点 共 九 种 选 择同 上同 上输 出 包 含 分 析 结 果