二维拓扑关系分析与实践(3)

类别:软件工程 点击:0 评论:0 推荐:

第二章 确定性区域间拓扑关系的分析与实现

确定区域拓扑关系又由于输入数据类型的不同分为:栅格区域层次拓扑关系模型,矢量区域层次拓扑关系模型(蛋黄模型)。首先研究栅格数据问题。

 

第一节 栅格区域层次拓扑关系

1.1栅格数据结构

栅格数据的概念:

栅格数据:栅格数据结构实际就是像元阵列,每个像元由行列确定它的位置。由于栅格结构是按一定的规则排列的,所表示的实体位置很容易隐含在网络文件的存储结构中,且行列坐标可以很容易地转为其它坐标系下的坐标。在网络文件中每个代码本身明确地代表了实体的属性或属性的编码。

栅格数据的优点:

在栅格数据结构中,点实体表示为一个像元;线实体则表示为在一定方向上连接成串的相邻像元集合;面实体由聚集在一起的相邻像元结合表示。这种数据结构很适合计算机处理,因为行列像元阵列非常容易存储、维护和显示。

栅格数据的缺点:

      用栅格数据表示的地表是不连续的,是量化和近似离散的数据,是地表一定面积内(像元地面分辨率范围内)地理数据的近似性,如平均值、主成分值或按某种规则在像元内提取的值等;另一方面,栅格数据的比例尺就是栅格大小与地表相应单元大小之比。像元大小相对于所表示的面积较大时,对长度、面积等的度量有较大影响,这种影响还与计算长度、面积的方法有关。

 

1.2栅格数据的取值方法:

栅格数据的取得,可在专题地图上均匀地划分网格(相当于将一透明方格纸覆盖在地图上),每一单位格子覆盖部分的属性数据便成为图中各点的值,最后形成栅格数字地图文件。

中心点法:用处于栅格中心处的地物类型或现象特性决定栅格代码。

面积占优法:以占栅格最大的地物类型或现象特征决定栅格代码。

长度占优法:当覆盖的格网过中心部位时,横线占据该格中的大部分长度的属性值定为该栅格的代码。

重要性法:根据栅格内不同地物的重要性,选取最主要的地物类型决定相应的栅格单元代码。对于特别重要的地理实体,其所在的区域尽管面积很小或不在中心,也采取保留的原则。

为了逼近原始数据精度,除了采用上述几种取值方法外,还可以采用缩小单个栅格单元的面积,增加栅格单元总数的方法,这样行列数也相应增加,每个栅格单元可代表更细小的地物类型,然而增加栅格个数、提高精度的同时也带来了一个严重的问题,那就是数据量的大幅度增加,数据冗余严重。

本论文并不对数据采样进行更具体的操作,程序中所使用的数据全都是经过处理的标准数值数据(每一个值都有其确定的含义)。

 

1.3分明栅格区域拓扑关系RCC5

当 和 为分明栅格区域时,即每个栅格单元的取值仅为Y(属于)或N(不属于),三个谓词的取值范围为 两个布尔值, 、 和 的定义分别如下:

1.3.1下面开始程序的设计:

在开发语言上,我是用最常用的C++语言,完全可以实现要求的全部功能。

编译器,选择GCC(可移植性强,功能强劲)

选择编程风格,风格决定了将来程序的扩展性,可维护性。所以我选择了面向对象编程风格。

以类作为基础先实现RCC5,再通过继承扩展到RCC8。

现在我将选择一种方式巧妙的求出三原谓词P,C和I ,这是实现RCC判断的基础。

算法设计

栅格数据的拓扑关系判断主要是网格单元关系的判断,所以整体设计思想是以网格单元判断开始的。由于程序录入文件的时间远高于程序处理的时间,所以为了提高效率,将把处理尽量集中在录入过程中。

v100.h

/* 实现 分明栅格 RCC-5 关系 判定*/

class ClearGrid

{

       public:

       /*

       使用四位 数据 分别 第1位: Grid1 占用位 为1表示占用  第2位:Grid2占用位   

       第3位:表示此栅格 是否被使用判断位  第4位 : 1和2位都为1 置位 表示此栅格相交

       */

              bitset<4> g[UPPER][UPPER];

              bool P,C,I;

       public:

              ClearGrid();

              void RelateJudge();

              void Print();

              ~ClearGrid(){}

};

栅格数据由于占用空间较大,又由于是确定栅格,状态较少,所以本程序采用了位存储方式

#define UPPER 10 这是本程序定义的栅格数据大小,在实际计算中根据需要更改。

bitset<4> g[UPPER][UPPER];

本来使用bitset<2>就已经可以满足存储要求了,可是我发现这样需要对整个数据结构扫描3次,才能判断出三原谓词P,C和I ,运行效率低,而如果使用一位状态位bitset<3>则在一遍扫描中需要对整个栅格进行一遍扫描,时间效率有所降低。因为在判断过程中对于没有被占用的位是不需要判断的。这样我设计了两个状态位,很好的提高了时间效率。对于大数据量的程序设计,时间效率应是主要的。

实现过程

利用类的特点,在ClearGrid();函数中实现数据录入和数据格式转化,并完成状态位的设置。

在RelateJudge();函数中完成对三原谓词P,C和I 的判断实现RCC算法。

实现效果

先使用Gcc编译成可执行文件;本程序v100.exe;使用cywin 键入 ”./v100 < in.input”;

in.input 为输入文件,输出结果显示RCC5的一种情况 如EQ 。

本程序使用字符界面。

此时三个谓词共有8种可能的组合,如规定 ,根据约定 和 ,则显然 和 ,根据此约束条件,可以将8种组合减少为5种可能成立的情形,对应于分明栅格区域间的RCC5关系,对应关系如表。

 

 

EQ

PPI

PP

PO

不符合约束条件

DR

T

T

T

T

F

F

F

F

T

T

F

F

T

T

F

F

T

F

T

F

T

F

T

F

 

 

本文地址:http://com.8s8s.com/it/it37150.htm