万事开头难。 中国俗语 第六章 空间数据获取 导读:空间数据获取是地理信息系统建设首先要进行的任务,它可以有多种实现方式包括数据转换、遥感数据处理以及数字测量等等,其中已有地图的数字化录入,是目前被广泛采用的手段,也是最耗费人力资源的工作。在GIS中,录入的内容包括空间信息和非空间信息,前者是录入的主体。目前,空间信息的录入主要有两种方式,即手扶跟踪数字化和扫描矢量化,本章具体介绍了两种方式,以及相关的算法,如曲线近似拟合,栅格图形细化跟踪等。 在图形数据录入完毕后,需要进行各种处理,包括坐标变换、拼接等等,其中最重要的是建立拓扑关系。在拓扑建立过程中,需要先对各种错误修改,本章描述了各种具体的错误情形,最后则介绍了多边形自动拓扑生成算法。 1.地图数字化 1.1概述 无论古代、现代还是将来,地图总是重要的信息形式。在计算机图形图像技术应用于地图制作之前,各部门一般都使用纸质地图或工程图纸,纸图在查阅、计算距离和标注地名符号等方面都是人工操作;另外不能对一幅纸地图进行修改、缩小比例和分层读图,至于地图局部放大只能借助于放大镜,被放大的区域很小且操作不方便。 随着技术的发展,人们对地图的要求进一步提高。由于传统纸地图效率、速度和精度很低,因此难以适应现代和未来科技发展。而通过GIS工具,可以把纸地图经过一系列处理而转换成可以在屏幕上显示的电子化地图,可以满足人们使用地图的新的要求。为了讨论问题方便,将矢量电子地图定义如下: 当纸地图经过计算机图形图像系统光——电转换量化为点阵数字图像,经图像处理和曲线矢量化,或者直接进行手扶跟踪数字化后,生成可以为地理信息系统显示、修改、标注、漫游、计算、管理和打印的矢量地图数据文件,这种与纸地图相对应的计算机数据文件称为矢量化电子地图。这种地图工作时需要有应用软件和硬件系统的支撑。对矢量化地图的操作是以人机交互方式,通过GIS应用软件对硬件设备的控制来实现的。 在硬件系统及相应的地理信息系统软件支持下,矢量电子地图与纸地图相比有如下优点: .计算距离和标注地名符号快速准确; .可对地图局部放大、全图缩小和移动显示、漫游功能很强; .分层显示地图(当对地图上各种信息分不同层归类存放后,则可以显示某些层,关闭不显示的层); .可以以图元为单位进行信息编缉修改,人机交互画线标注符号文字,删除地图上多余的信息; .可以通过计算机网络进行电子地图传递,提供信息共享,传递的速度快,保密性强; .如果能有效解决地图符号自动分割和识别问题,则能实现地图的智能矢量化。这里智能化是指自动矢量化和自动标注符号,最佳路径优化选择和自动跟踪目标等。 矢量电子地图与点阵地图图像相比有如下优点: .相同信息量下前者的文件相对要小得多,图越复杂表现越明显; .前者可以以图元为单位进行信息编缉修改删除,人机交互画线标注符号文字;后者只能以像素为基本单位(如矩形图像块)进行拷贝,移动和删除,即它的编辑功能很差; .前者可对所有图元分层显示,后者只能做到对整图某区域(矩形区)的开窗显示控制。 1.2地图数据类型 为地图自动制图目的所搜集的上述资料,要适应计算机处理的需要,必须同时考虑通过这些资料,最后能获取各种不同性质的地图数据。 为此,可以定义地图数据是载荷地理信息的数字集合。它们应指被输入到某种计算机系统中进行处理,必要时可重新生成人的视觉可以感受的地理信息。在这一层意义上,地图数据可以分为: 1)空间数据(或图形数据) 空间数据是构成地图内容要素的几何图形,例如地图上的井、山峰、灯塔、河流、道路、等值线、湖泊、森林界线和土壤类型界线等。为表示这些要素在二维平面上空间图形的定位特征,常用一对平面直角坐标(X,Y)来表示,这种地图数据称为矢量数据;或用其通过栅格单元的左下角坐标(行和列)来表示,称此为栅格数据。 地图要素图形大致可以分为点、线、面三种基本类型。 面——可由环绕它们的线表示;也可以由其区域内的点表示; 线——可离散化成为点的集合; 而点则能用一对平面坐标系中的坐标来确定。 在实际应用中,仅有坐标数据是不够的,必须依照不同地图要素的意义,通过特别的编码加以区别。 2)语义数据(属性数据) 语义数据又称为非几何数据,包括定性数据和定量数据。定性数据用来描述要素的分类或对要素进行标名。定量数据是说明要素的性质、特征或强度的,例如距离、面积、人口、产量、收人、流速,以及温度和高程等. 对于语义数据,基本上是一个地理编码问题。以科学的分类分级系统为基础,对地理环境中各基本实体及其联系进行编码,以便唯一地对某一系统中所有地图要素进行认别和处理,这种功能不仅在用户环境中而且在计算机系统内也是十分重要的。 当前,要为满足各方面全部需求而建立一种通用的编码是不可能的。因此,最现实的是研制多样性编码满足各部门的不同需要,同时兼顾符合建立数据库的规定。一般来说编码的一些基本要求包括: (2.1)要素类别——如地名,实体类型及等级等; (2.2)要素特征(属性)——每一要素可具有与它有联系的大量的属性值,它承载关于要素特征的信息; (2.3)作用范围的描述——例如,一个区域的土壤类型; (2.4)地理定义——在某些情况下编码可以是一个实体集合的间接参考,而集合中的每一个实体也会被它自身的地理代码所说明,如水系、地质层的编码。 在GIS数据录入过程中,空间数据的录入更为重要,因为处理空间数据和空间信息正是GIS的核心功能。与属性数据录入相比,空间数据录入的工作量更大,并且需要GIS软件工具的支持(利用通用的数据库软件即可以进行属性数据录入)。 1.3数字化仪数字化 1.3.1手扶跟踪数字化 尽管手扶跟踪数字化(Manual Digitising)工作量非常繁重,但是它仍然是目前最为广泛采用的将已有地图数字化的手段。 利用手扶跟踪数字化仪可以输入点地物、线地物以及多边形边界的坐标。其具体的输入方式与地理信息系统软件的实现有关,另外一些GIS系统也支持用数字化仪输入非空间信息,如等高线的高度,地物的编码数值等等。 手扶跟踪数字化仪的通讯和参数: 手扶跟踪数字化仪是通过RS-232(串口)接口与计算机进行连接的,为了能够进行正确的数据发送和接收,需要进行通讯参数的设置,包括波特率、数据位、校验位、停止位等等。此外,数字化仪还包括坐标原点、分辨率、采点方式、数据格式等参数。数字化仪的参数通常可以利用数字化板上的开关和菜单确定。为了保证数据录入的正确,必须设置数字化软件的参数与数字化仪的一致。 在进行数字化之前,首先要确定需要数字化哪些信息,在目前由于大多数GIS软件对空间数据采用分层管理,所以要确定输入哪些图层,以及每个图层包含的具体内容。另外,由于数字化过程不可能一次完成,在两次输入之间地图的位置可能相对于数字化板发生错动,这样前后两次录入的坐标就会偏移或旋转。解决该问题的办法就是,在每次录入之前,先输入至少三个定位点(Tick Marks),或称为注册点(Register Points),这些点相对于地图的位置是固定的,这样两次输入的内容就可以根据定位点坐标之间的关系进行匹配。 通常,数字化仪采用两种数字化方式,即点方式(Point Mode)和流方式(Stream Mode),点方式是当录入人员按下游标(Puck)的按键时,向计算机发送一个点的坐标。输入点状地物要素时必须使用点输入方式;而线和多边形地物的录入可以使用点方式,在输入时,输入者可以有选择地输入曲线上的采样点,而采样点必须能够反映曲线的特征。 流方式录入能够加快线或多边形地物的录入速度,在录入过程中,当录入人员沿着曲线移动游标时,能够自动记录经过点的坐标。采用流方式录入曲线时,往往采集点的数目要多于点方式,造成数据量过大,一个解决的方案是对记录的点进行实时采样,即尽管系统接收到了点的坐标,但是可以根据采样原则确定是否记录该点*。 目前大多数系统采取两种采样原则,即距离流方式(Distance Stream)和时间流方式(Time Stream)(图6-1)。  图6-1:距离流方式和时间流方式 (a)距离流方式是当前接收的点与上一点距离超过一定阈值,才记录该点; (b)采用时间流方式时,按照一定时间间隔对接收的点进行采样。 采用时间流方式录入时,一个优点是当录入曲线比较平滑时,录入人员往往移动游标比较快,这样记录点的数目少;而曲线比较弯曲时,游标移动较慢,记录点的数目就多。而采用距离流方式时,容易遗漏曲线拐点,从而使曲线形状失真。所以在保证曲线的形状方面,时间流方式要优于距离流方式。 在实际的录入过程中,可以根据不同的录入对象选择不同的录入方式。例如,当录入地块图时,由于其边界多为直线,并且点的数据较少,可以采用点方式录入;录入交通线时,因为要保证某些特征点位置的准确性,也可以使用点方式;而等高线的录入由于数据量大,使用流方式可以加快录入速度。 其它的矢量数据录入方式: 尽管手扶跟踪数字化是目前最主要的矢量格式地理数据的录入手段,但是在某些场合下,也可以采用其它的数据输入方式: 1)其它数据转换: 其它格式数据的转换包括三种情形: (1.1)其它矢量格式数据(往往是由其它GIS软件制订)的转换; (2.2)坐标数据,往往表现为关系数据库表的形式(表6-1); (2.3)位置描述信息,以关系数据表形式存取,同样可以转换为不太精确的坐标数据(表6-2)。 表6-1:测站信息表(部分) 测站编码 经度 纬度  68013344 107.2 29.8  68026785 115.5 30.2  表6-2:企业员工信息表(部分) 姓名 住址  张三 北京市海淀区  李四 河北省石家庄市  2)键盘录入: 对于数据量较小、并且已知地物精确坐标的情况下,可以采用键盘录入。此外键盘录入也是录入属性数据的主要手段。 3)鼠标录入: 如果不愿意手扶跟踪数字化,而扫描矢量化又难以识别地物时,可以使用鼠标录入,通常是将地图扫描后,作为底图显示在屏幕上,用鼠标参照底图进行采点。由于鼠标定位不如数字化仪精确,所以一般用于输入一些示意图。 4)其它定点测量设备: 目前GPS已经成为流行的定位导航设备,它同样可以为GIS提供矢量格式的坐标数据。其它的定点测量设备包括平板测图仪等,使用这些设备,最重要的是要考虑精度问题。 1.3.2曲线离散化算法 在数字化过程中,需要对曲线进行采样简化,即在曲线上取有限个点,将其变为折线,并且能够在一定程度上保持原有的形状。下面介绍Douglas-Peucker算法(图6-2)。 1)在曲线首尾两点A、B之间连接一条直线段AB,该直线称为曲线的弦; 2)得到曲线上离该直线段距离最大的点C,并计算其与AB的距离d; 3)比较该距离与预先给定阈值ε的大小,如果小于ε,则将该直线段作为曲线的近似,该段曲线处理完毕; 4)如果距离大于阈值,则用C将曲线分为两段AC和BC,并分别对两段曲线进行1-3步的处理。 5)当所有曲线都处理完毕后,依次连接各个分割点形成的折线,即可以作为曲线的近似。 很明显,该算法是一个递归算法。  图6-2:曲线的离散算法 1.4扫描矢量化及常用算法 1.4.1扫描矢量化以及处理流程 随着计算机软件和硬件更加便宜,并且提供了更多的功能,空间数据获取成本成为GIS项目中最主要的成分。由于手扶跟踪数字化需要大量的人工操作,使得它成为以数字为主体的应用项目瓶颈。扫描技术的出现无疑为空间数据录入提供了有力的工具。 常见的地图扫描处理的过程如图6-3所示。由于扫描仪扫描幅面一般小于地图幅面,因此大的纸地图需先分块扫描,然后进行相邻图对接;当显示终端分辨率及内存有限时,拼接后的数字地图还要裁剪成若干个归一化矩形块,对每个矩形块进行矢量化(Vectorization)处理后生成便于编辑处理的矢量地图,最后把这些矢量化的矩形图块合成为一个完整的矢量电子地图,并进行修改、标注、计算和漫游等编辑处理。  图6-3:地图信息处理流程图 在扫描后处理中,需要进行栅格转矢量的运算,一般称为扫描矢量化过程。扫描矢量化可以自动进行,但是扫描地图中包含多种信息,系统难以自动识别分辨(例如,在一幅地形图中,有等高线、道路、河流等多种线地物,尽管不同地物有不同的线型、颜色,但是对于计算机系统而言,仍然难以对它们进行自动区分),这使得完全自动矢量化的结果不那么“可靠”,所以在实际应用中,常常采用交互跟踪矢量化,或者称为半自动矢量化。 将栅格图像转换为矢量地图一般需要以下一系列步骤[Musavi 1988]: 1)图像二值化(Threshold) 图像二值化用于从原始扫描图像计算得到黑白二值图像(Binary Image),通常将图像上的白色区域的栅格点赋值为0;而黑色区域为1,黑色区域对应了要矢量化提取的地物,又称为前景。 2)平滑(Smooth) 图像平滑用于去除图像中的随机噪声,通常表现为斑点。 3)细化 细化将一条线细化为只有一个像素宽,细化是矢量化过程中的重要步骤,也是矢量化的基础。 4)链式编码 链式编码将细化后的图像转换成为点链的集合,其中每个点链对应于一条弧段。 5)矢量线提取 将每个点链转化成为一条矢量线。每条线由一系列点组成,点的数目取决于线的弯曲程度和要求的精度。 除了上述五个步骤以外,还需要一些处理以方便图像矢量化过程,如图像拼接和剪裁等等,下面对这些操作以及相关算法进行描述。 1.4.2图像拼接/裁剪 1)图像拼接 以两相邻地图图像的部分重叠区为基础,把它们合成为一幅整图的过程叫做图像拼接,分上下拼接和左右拼接。以左右拼接为例,取左图右边缘一个矩形区域A,取右图左边缘一个矩形区域B,如果A和B有一定的重叠区,可以利用计算机实现自动的匹配,其拼接算法如下: (1.1)由A中右侧边缘从右至左依次取若干个列L1(O),L1(1),…,L1(n),以各列内像素灰度的长度序列为特征向量,分别求出以上各列的特征向量V1(O),V1(1),…,V1(n)。 (2.2)自动拼接 即由B中左侧从左至右依次取若干列L2(n),L2(n-1),…,L2(O),以各列内像素灰度的长度序列为特征向量,分别求出以上各列的特征向量V2(n):V2(n-1),…,V2(O)。若向量序列[V1(O);V1(1),…,V1(n)]和[V2(O),V2(1),…,V2(n)]匹配,则转向步骤4。 (2.3)人工拼接 即固定A,通过人机交互控制B以一定步长上下左右移动,直到A和B重叠区对齐为止。 (2.4)根据步骤2匹配情况或步骤3的偏移情况对两相邻地图图像进行修正和合成。 2)图像裁剪 把一幅图像裁成两两相邻的规则图块的过程称为地图裁剪。图像裁剪非常简单,实际应用中,可以根据不同的硬件配置确定采用和不采用图像裁剪技术。 1.4.3 图像细化预处理二值图像平滑 在将地图扫描或摄像输入时,由于线不光滑以及扫描、摄像系统分辨率的限制,使得一些曲线目标带来多余的小分支(即毛刺噪声);此外,还有孔洞和凹陷噪声,如图6-4所示。如果不在细化前去除这几种噪声,就会造成细化误差和失真,这样会最终影响地图跟踪和矢量化。曲线目标越宽,提取骨架和去除轮廓所需的次数也越多,因此噪声影响也越大。                                                                                                                                    图6-4:扫描图像的“毛刺”和“凹陷孔洞” 为了去除毛刺噪声的影响,可以采用如图5所示的3×3模板进行处理。处理的过程是:按点阵格式扫描图像上每一像素,只要图像相应区域与图6-5中的模板(包括其三次900旋转所形成的模板)匹配,则判定为毛刺,对应于模板中心的像素数值变为O。根据需要可进行多次这种匹配运算。 0 0 0  0 1 0  Ⅹ Ⅹ Ⅹ  图6-5:去毛刺模板,X为任意数值 为了去除孔洞及凹陷噪声,我们采用如图6-6所示的模板进行处理,只要图像对应区域与该模板(包括其三次90O旋转)匹配,则区域中心点数值变为1。 X 1 X  1 0 1  Ⅹ Ⅹ Ⅹ  图6-6:去孔洞凹陷模板 总之,通过以上两种平滑处理,基本上消除了毛刺和孔洞凹陷噪声的影响,为进一步进行细化处理打下了基础。 1.4.4图像细化(Thinning) 细化算法对二值图像进行处理,得到细化后的图像。线细化是处理包含线状地物二值图像的一种重要技术,在地图扫描处理中,由于地图上主要信息是不同粗细和不同形状的线,必须首先进行线细化,以准确、有效地提取这些线信息,并进一步完成跟踪矢量化。 线细化,就是不断去除曲线上不影响连通性的轮廓像素的过程,对细化的一般要求是: 保证细化后曲线的连通性 细化结果是原曲线的中心线 保留细线端点 根据各种不同的应用,目前已经提出了许多线细化算法,如内接圆法、经典算法、异步算法、快速并行算法及并行八边算法等,不同的算法在处理速度和效果上各有其特点。 下面介绍一个常用的细化算法,其它算法基本是此算法的改进。 首先介绍几个相关的概念和符号。对于二值栅格图像中每个像素点p,以及该像素直接相邻的8个像素点(图6-7),令:  图6-7:像素周围的8个直接相邻像素 1)N(p)为p的邻点的数值的和; 2)图像像素联接数T(p),如果旋转着看像素周围的点,T(p)就是p周围8个点从0变成1的次数,它反映了像素邻点的联接的块数(图6-8)。 3)pW,pE,pS,pN分别指像素左侧、右侧、下边、上边邻点的数值。  图6-8:像素联结数 算法步骤如下[Zhang-Suen,1984]: 1:对于栅格图像中的每个点p,进行如下操作: 如果2(N(p)(6并且T(p)=1并且pNpSpE=0并且pWpEpS=0 则标志p点; 2:将所有被标志的栅格点赋值为0,如果没有被标志的点,则算法结束; 3:对于栅格图像中的每个点p,进行如下操作: 如果2(N(p)(6并且T(p)=1并且pNpSpW=0并且pWpEpN=0 则标志p点; 4:将所有被标志的栅格点赋值为0,如果没有被标志的点,则算法结束; 5:转到第一步。 图6-9显示了采用该算法细化的过程和结果。  图6-9:线状地物的细化 1.4.5链码(弗里曼码) 链码是由弗里曼(Freeman)提出的用曲线出发点坐标和线的斜率来描述二值线图形的一种方法。图6-10(a)所示是链码的八个方向及它们的序号。图6-10(b)的细线的链码为(3,0)21100066567,其中(3,0)为起始点坐标,之后的数值序列描述了方向。 任意一条细线都可用链码序列表示为下式: C=a1a2...an,0≤ai≤7 如果始点a1和终点an重合,则说明曲线是闭合的。  图6-10:链码及其对细线的表示 (a):链码的8个方向;(b)细线 1.4.5矢量线生成 扫描矢量化的最后一步是生成矢量线,可以很方便地将链式编码的每一条链转换成为一条矢量线。自然地,弯曲的矢量线比直线需要更多的点,这还取决于要求的精度。在矢量线生成过程中,可以使用Douglas-Peucher算法。 目前,自动扫描矢量化还不是完全可靠的,为了提高其可靠性,需要在模式识别方面做出更多的研究。 2.空间数据录入后的处理 2.1图形坐标变换 在地图录入完毕后,经常需要进行投影变换,得到经纬度参照系下的地图。对各种投影进行坐标变换的原因主要是输入时地图是一种投影,而输出的地图产物是另外一种投影。进行投影变换有两种方式,一种是利用多项式拟合,类似于图像几何纠正;另一种是直接应用投影变换公式进行变换。 2.1.2基本坐标变换 在投影变换过程中,有以下三种基本的操作:平移、旋转和缩放。 1)平移 平移是将图形的一部分或者整体移动到笛卡尔坐标系中另外的位置(图6-11-a),其变换公式如下: X’=X+Tx Y’=Y+Ty 2)缩放 缩放操作可以用于输出大小不同的图形(图6-11-b),其公式为: X’=XSx Y’=YSy 3)旋转 在地图投影变换中,经常要应用旋转操作(图6-11-c),实现旋转操作要用到三角函数,假定顺时针旋转角度为θ,其公式为*: X’=Xcosθ+Ysinθ Y’=-Xsinθ+Ycosθ  (a)平移  (b)缩放  (c)图形旋转 图6-11:图形坐标变换 2.1.2仿射变换(Affine Tranformation) 如果综合考虑图形的平移、旋转和缩放,则其坐标变换式如下:  上式是一个正交变换,其更为一般的形式是:  后者被称为二维的仿射变换(Affine Transformation),仿射变换在不同的方向可以有不同的压缩和扩张,可以将球变为椭球,将正方形变为平行四边形(图6-12)。  图6-12:仿射变换 2.2图形拼接 在对底图进行数字化以后,由于图幅比较大或者使用小型数字化仪时,难以将研究区域的底图以整幅的形式来完成,这是需要将整个图幅划分成几部分分别输入。在所有部分都输入完毕并进行拼接时,常常会有边界不一致的情况,需要进行边缘匹配处理(图6-13)。边缘匹配处理,类似于下面提及的悬挂节点处理,可以由计算机自动完成,或者辅助以手工半自动完成。 除了图幅尺寸的原因,在GIS实际应用中,由于经常要输入标准分幅的地形图,也需要在输入后进行拼接处理,这时,一般需要先进行投影变换,通常的做法是从地形图使用的高斯——克吕格投影转换到经纬度坐标系中,然后再进行拼接。  图6-13:图幅拼接 (a)拼接前;(b)拼接中的边缘不匹配;(c)调整后的拼接结果 2.3拓扑生成 在图形数字化——无论是手扶跟踪数字化还是扫描矢量化——完成后,对于大多数地图需要建立拓扑,以正确判别地物之间的拓扑关系。在GIS数据管理中,拓扑关系可以定义以下内容: 1)区域,如果多边形数据DIME数据模型,每个多边形可以用一组封闭的线*来表示,而不需要记录封闭线上的所有点,避免两次记录相邻多边形的公共边界,这样减少了数据冗余*。 2)邻接性,另一种可以用拓扑描述的属性是多边形之间的相互邻接性。 3)连通性,连通性是指对弧段连接的判别,连通性的建立和表现是网络分析的基础。 2.3.1图形修改 在建立拓扑关系的过程中,一些在数字化输入过程中的错误需要被改正,否则,建立的拓扑关系将不能正确地反映地物之间的关系。 ESRI定义了以下判断录入图形是否正确的六个准则,可以帮助发现拓扑错误。 1)所有录入的实体都能够表现出来; 2)没有输入额外的实体; 3)所有的实体都在正确的位置上,并且其形状和大小正确; 4)所有具有连接关系的实体都已经连上; 5)所有的多边形都有且只有一个标志点以识别它们; 6)所有的实体都在边界之内 上述的准则,特别是第五和第六条,只是针对ESRI的ARC/INFO软件而言,其它的GIS软件由于具体实现的不同,可能会有差异。 由于地图数字化,特别是手扶跟踪数字化,是一件耗时、烦杂的人力劳动,在数字化过程中的错误几乎是不可避免的,造成数字化错误的具体原因包括: 1)遗漏某些实体; 2)某些实体重复录入,由于地图信息是二维分布的,并且信息量一般很大,所以要准确记录哪些实体已经录入,哪些实体尚未录入是困难的,这就容易造成重复录入和遗漏; 3)定位的不准确,数字化仪分辨率可以造成定位误差,但是人的因素是位置不准确的主要原因,如手扶跟踪数字化过程中手的抖动,两次录入之间图纸的移动都可以使位置不准确;更重要的,在手扶跟踪数字化过程中,难以实现完全精确的定位,例如在水系的录入中(图6-14),将支流的终点恰好录入在干流上基本上是不可能的(图6-14-a),更常见的是图(b)和(c)所示的两种情况。  图6-14:数字化错误——不及和过头 在数字化后的地图上,错误的具体表现形式有: 1)伪节点(Pseudo Node),伪节点使一条完整的线变成两段(图15),造成伪节点的原因常常是没有一次录入完毕一条线。  图6-15:伪节点 2)悬挂节点(Dangling Node),如果一个节点只与一条线相连接,那么该节点称为悬挂节点,悬挂节点有多边形不封闭(图6-16-a)、不及和过头(图6-14-b,图6-14-c),节点不重合(图6-16-b)等几种情形。  (a)多边形不封闭 (b)节点不重合 图6-16:悬挂节点的两种情形 3)“碎屑”多边形或“条带”多边形(Sliver Polygon) 条带多边形(图6-17)一般由于重复录入引起,由于前后两次录入同一条线的位置不可能完全一致,造成了“碎屑”多边形。另外,由于用不同比例尺的地图进行数据更新,也可能产生“碎屑”多边形。  图6-17:碎屑多边形 4)不正规的多边形(Weird Polygon) 不正规的多边形(图6-18)是由于输入线时,点的次序倒置或者位置不准确引起的。在进行拓扑生成时,同样会产生“碎屑”多边形。  图6-18:不正规的多边形 上述的错误,一般会在建立拓扑的过程中发现,需要进行编辑修改。一些错误,如悬挂节点,可以在编辑的同时,由软件自动修改,通常的实现办法是设置一个“捕获距离”,当节点之间、或者节点与线之间的距离小于此数值后,即自动连接;而另外的错误需要进行手工编辑修改。 2.3.2建立拓扑关系 在图形修改完毕之后,就意味着可以建立正确的拓扑关系,拓扑关系可以由计算机自动生成,目前大多数GIS软件也都提供了完善的拓扑功能;但是在某些情况下,需要对计算机创建的拓扑关系进行手工修改,典型的例子是网络连通性。 正如拓扑的定义所描述的,建立拓扑关系时只需要关注实体之间的连接、相邻关系,而节点的位置、弧段的具体形状等非拓扑属性则不影响拓扑的建立过程。 1)多边形拓扑关系的建立 如果使用DIME或者类似的编码模型,多边形拓扑关系的表达需要描述以下实体之间的关系: 多边形的组成弧段; 弧段左右两侧的多边形,弧段两端的节点; 节点相连的弧段。 多边形拓扑的建立过程实际上就是确定上述的关系。具体的拓扑建立过程与数据结构有关,但是其基本原理是一致的,下面简述多边形拓扑建立过程(图6-19)。 图6-19中共有4个节点,以A、B、C、D表示;6条弧段,用数字表示;以及I、II、III三个多边形(图6-19-a)。首先定义以下概念: 由于弧段是有方向的,算法中将弧段A的起始节点称为首节点Ns(A),而终止节点为尾节点NE(A); 考虑到弧段的方向性,沿弧段前进方向,将其相邻的多边形分别定义为左多边形和右多边形PL(A)和PR(A)。 在建立拓扑之前,首先将所有弧段的左右多边形(在实现中,可以用多边形的编码表示)都设置为空;然后对每个节点计算与其相连弧段的在连接处的角度,并进行排序(图6-19-b)(注意,这个排序是循环的)。建立拓扑的算法如下: (1)得到第一条弧段A,并设置为当前弧段; (2)判断PL(A)和PR(A)是否为空。如果都非空,转到第一步,当所有弧段处理完毕后,算法结束; (3)如果左多边形为空,则创建一个新的多边形P,多边形的第一条弧段为当前弧段,并设置PL(A)=P,设置搜寻起始节点为Ns(A),搜寻当前节点为NE(A)。如果右多边形为空,则创建一个新的多边形P,多边形的第一条弧段为当前弧段,并设置PR(A)=P,设置搜寻起始节点N0=NE(A),搜寻当前节点NC=NS(A)。 (4)判断N0和NC是否相等,如果是,则多边形所有弧段都已经找到,转到第一步。 (5)检查与当前节点相连接的、已经排列好的弧段序列,将当前弧段的下一条弧段A'作为多边形的第二条弧段。 (6)如果NC=NS(A'),设置PL(A')=P,NC=NE(A);如果NC= NE(A'),设置PR(A')=P,NC=NS(A),转到第四步。 如图6-19-c所示,如果从弧段4开始搜寻,找到节点C后,根据弧段的排序,下一条弧段是2;然后找到节点A,弧段1,整个搜寻结束,建立多边形I,其组成弧段为4、2、1。 按照这种算法,生成多边形的弧段从多边形内部看,是逆时针排列的。如果节点弧段排序为顺时针,则算法中用PL(A)代替PR(A),用PR(A)代替PL(A),生成的多边形弧段是顺时针排列的。  图6-19:多边形拓扑的建立过程 多边形拓扑的建立,要注意多边形带“岛”的情况,按照上述算法,对于带“岛”的多边形,或者称为环,其包含的弧段构成了多个闭合曲线,并且“岛”的弧段排序是顺时针的(图6-20)(实际上,从环状多边形内部看,它仍然是逆时针的)。  图6-20:带“岛”的多边形建立拓扑的结果。 2)网络拓扑关系的建立 在输入道路、水系、管网、通信线路等信息时,为了进行流量以及连通性分析,需要确定线实体之间的连接关系。网络拓扑关系的建立包括确定节点与连接线之间的关系,这个工作可以由计算机自动完成,但是在一些情况中,如道路交通应用中,一些道路虽然在平面上相交,但是实际上并不连通,如立交桥,这是需要手工修改,将连通的节点删除(图6-21)。  图6-21:节点的编辑,将实际不连通的线路形成的节点删除