zoukankan      html  css  js  c++  java
  • 基于ArcEngine的地图四着色算法的实现(转载)

    来源:http://gisfeng.com/archives/574#more-574

    基于ArcEngine的地图四着色算法的实现

    关键词:

    四色问题;地图着色;ArcEngine

    摘要:

    四色猜想,即是对于任何复杂的地图,只要用四种颜色进行着色就能够保证不会有两个相邻地区的颜色相同。现阶段来说,除了计算机证明方法之外,没有另外的常规的数学方法能够证明四色猜想的正确性。但是人们对于四色猜想均无疑议。在本文中,我们在假定四色猜想正确的前提下,给出了一种基于ArcEngine的地图四着色算法的实现方式。实践结果证明,这个算法可以很好的用于地图四着色过程,在其适用范围之内具有很高的效率。利用此算法可以自动化进行操作,无非人工干预,能够将人从繁琐费时的手工配色过程中解放出来,并且在问题复杂度变大,手工配色不能解决问题的情况下也能高效的发挥作用。总体来说,此算法能够满足地图四着色的实际需求。

    1. 引言

    四色问题,又称为“四色猜想”或是“四色定理”。它是说一个平面地图,只需要用四种颜色来着色,就可以使得两个相邻的地区没有相同的颜色。四色问题最早是由英国人弗朗西斯提出来的。1852年,刚从伦敦大学毕业的弗朗西斯在对英国的地图着色时,发现了一个有趣的现象:无论多么复杂的地图,只需要用四种颜色就能将它区分开来,也就是说,用四种颜色着色就能保证不会有两个相邻地区的颜色相同。

    自从四色问题提出来之后100多年的时间里,很多学者对此问题进行了深入的研究。在这其中,也有很多人声称自己成功的证明了四色问题,但是无一例外,都没有经受住时间的考验。四色问题的证明,一直是一个未解之谜。因此,四色问题,和哥德巴赫猜想、费马定理一样,成为了数学领域一个悬而未解的难题。直到1976年,美国数学家阿佩尔和哈肯利用高速计算机,历时1200小时,成功的证明了四色问题的正确性。尽管有些人对这种计算机证明方法存有争议,仍然期待着常规的数学证明方法,但是都对“四色问题”的正确性无疑议。

    图的着色问题具有很好的应用前景。利用四色猜想,来给地图配色,能够最大限度的保证地图的美观。但是,传统手工的地图四着色方法费时费力,同时在问题复杂度变大的时候,手工方法往往不能有效解决。

    在本文中,我们结合ArcEngine和C#语言,在假定“四色猜想”是正确的前提下,给出了一种地图四着色算法。这个算法在对图层的空间拓扑分析的基础上进行自动着色。提出的算法可以进行自动化处理,能够将人从繁琐的手工配色中解脱出来,加快工作进度,促进地图四着色在GIS中取得更广泛的应用。

    2. 算法实现

    2.1 ArcEngine简介

    2004年,美国ESRI发布ArcGIS Engine,ArcGIS Engine开发包提供了一系列可以在ArcGIS Desktop框架之外使用的GIS组件,ArcGISEngine的出现对于需要使用ArcObjects的开发人员来说是个福音,因为ArcGISEngine发布之前,基于ArcObjects的开发只能在庞大的ArcGIS Desktop框架下进行。

    要进行ArcEngine开发,必须正确的安装ArcEngine运行时和ArcEngine开发包。但是,如果在进行开发的计算机上安装有ArcGIS Desktop版本,则无需进行运行时的安装。ArcEngine支持多种语言的开发,留给了开发者很大的选择空间。我们可以选择使用SDK语言进行开发,比如C#、VB.Net。同时,我们也可以选择Java、C++或是VB进行开发。

    2.2 ArcEngine中的拓扑分析

    现实世界中,空间实体的类型多种多样。但是对其进行抽象后,最终可以用点、线、面三种最基本的几何实体来进行标识。在ArcGIS体系结构中,将之抽象成三种最基本的要素类:点类型要素类、线类型要素类和面类型要素类,分别用来存储点、线、面空间实体。

    空间实体之间存在着多种空间关系,包括拓扑关系、顺序关系、距离关系和方位关系等。在ArcEngine中,拓扑关系通过IRelationalOperator接口来实现。IRelational

    _Operator接口提供了一系列的方法,供用户来获取两个空间实体之间的拓扑关系。比如,Contains方法,用来判断一个空间实体是否包含另外一个空间实体;Touches方法,用来判断空间实体的边界是否存在着交集。

    其中,对于Touches方法,如下所示。当调用此方法的两个要素之间的拓扑关系如下图所示时,调用此方法会返回一个True值。对于两个多边形要素,当其至少包含一个公共点时,调用Touches方法就会得到一个True值。我们可以利用此方法判断两个多边形要素是否相邻。

     

    图1 不同类型实体之间Touches方法为真情况说明图

    2.3 算法设计

    我们所提出的算法的工作步骤是,首先为多边形要素类或是ShapeFile文件新建两个字段,分别为ID和Color。ID字段用于存储多边形中要素的编号。Color则用于存储每个多边形要素的颜色值。然后,根据多边形要素之间的空间拓扑关系和ID值来生成一个邻接矩阵。最后,根据这个邻接矩阵来为每一个一要素赋一个颜色值。为每一个多边形赋予一个颜色值之后,我们可以在ArcGIS软件中,加载此要素类或是ShapeFile文件,根据Color字段进行分层设色,完成地图四着色过程。

    综上所述,算法的核心部分包括两部分。分别为代表空间拓扑关系的邻接矩阵生成算法和颜色赋值算法。

     2.3.1 拓扑关系邻接矩阵生成算法

    在对地图进行四着色过程中,需要根据两要素之间的拓扑关系来进行赋颜色值,并进一步的判断我们当前的赋值是否存在着冲突。再对ArcEngine的IRelationalOperator接口进行深入研究之后,我们选择使用Touches方法来判断两个要素之间是否相邻。我们将两要素相邻的情况,记为1;将两要素相离的情况,记为0。并且,将这种关系存放在一个矩阵中。这样,我们就形成了表示要素之间拓扑关系的邻接矩阵。

    生成的邻接矩阵格式如下:

    A

    B

    C

    D

    E

    A

    0

    B

    1

    0

    C

    0

    0

    0

    D

    1

    1

    1

    0

    E

    1

    1

    1

    0

    0

    算法描述如下:循环遍历平面图中的每一个多边形,将得到的多边形和平面图中的其他的每一个多边形进行拓扑关系判断,然后将判断结果保存到Areas矩阵中。如果两多边形Touches方法返回值为真,则记为1;否则记为0。

    算法的伪代码如下:

    If(A touches B and A not equals B) Then

    Areas[A,B]=1

    Else

    Areas[A,B]=0

    其中,A、B分别代表着一个多边形要素。Areas数组是存储着多边形要素之间空间拓扑关系的邻接矩阵。

    2.3.2着色部分算法

    建立要素的空间拓扑关系邻接矩阵之后,下一步我们要根据建立的邻接矩阵而为每一个要素进行颜色的赋值。我们要给每一个要素赋一个颜色值,同时保证这个颜色值不和与这个要素相邻的其它要素的颜色值相同。在相同的情况下,我们需要重新对这个要素进行赋值。算法描述如下:

    1)对第1个要素赋颜色值为A。

    2)对第i个要素尝试赋颜色值A。

    3)进行判断:如果对象i和已赋值的对象颜色不冲突,则对第i个对象赋值颜色A。如果,对象i颜色和已赋值的对象颜色存在冲突,则给对象i赋值另外一种颜色B。冲突,即是两个相邻的要素具有同样的颜色值。

    4)如果颜色值B仍然存在冲突,执行步骤3中的判断。

    5)如果四种颜色都已经尝试,但是对象i颜色仍然和已赋值对象冲突,那么,返回到对象i-1,修改对象i-1的颜色值为下一种颜色。重新进行步骤2-4判定。

    5)直到对所有要素执行完以上操作,算法完成。

    代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    static void Color(int[] color, int[,] areas, int count)
            {
                color[0] = 1;
                int i = 1, j = 1;
                while (i < count)
                {
                    while (j <= 4 && i < count)
                    {
                        int k = 0;
                        for (k = 0; k < i; k++)
                        {
                            if (areas[i, k] == 1 && color[k] == j)
                                break;
                        }
                        if (k < i) j = j + 1;
                        else
                        {
                            color[i] = j;
                            i++;
                            j = 1;
                        }
                    }
                    if (j > 4)
                    {
                        i = i - 1;
                        j = color[i] + 1;
                    }
                }
            }

    2.3.4算法效率分析

    算法完成后,我们使用C#+ArcEngine 10进行了程序的编写,并对算法的时间复杂度进行了分析。我们采用两组不同的平面图,分别对不同数目的多边形进行处理,并记录下程序运行的时间。具体数据如下表所示:

    表格1 平面图1,不同多边形个数情况下,程序运行时间

    多边形个数 程序运行时间(以毫秒为单位)
    10 2479
    25 5743
    50 11529
    100 19996
    110 27883
    115 31304
    120 无穷大

        表格2 平面图2,不同多边形个数情况下,程序运行时间

    多边形个数 程序运行时间(以毫秒为单位)
    10 1688
    25 4925
    50 9954
    100 20121
    110 24545
    115 22370
    120 24817
    130 35227
    140 67596

    通过观察实验数据我们可以发现,在组成平面图的多边形数目不多的情况下,我们上文所提出的算法具有很高的效率,能够很好的满足我们的实际应用要求。而且,对应于不同的平面图,由于组成其的多边形要素的排列、组合方式不同,在用算法进行处理的时候,会呈现出不同的问题复杂度,相应的耗费时间也不一样。比如,上述表格所示。对应于平面图1,当组成其的多边形个数达到120个时,算法明显显示出了不适性。此时,利用此算法,不能有效的对这种情况进行求解。而对于平面图2,当组成其的多边形个数达到140个时,算法仍然能够很好的处理。这与多边形的复杂程度有关系。

    总结起来讲,无论平面图多复杂,当组成其的多边形要素个数不超过110个左右时,都可以应用此算法来解决四着色。而当多边形个数超过这一数值时,能否应用此算法将取决于平面图的复杂程度。这种情况下,最好的办法是去寻求另外一种更为高效的地图四着色算法,或是在此算法的基础上进行改进。

    3. 结论

    实践证明,我们上文所提出的基于ArcEngine的地图四着色算法可以很好的应用于地图四着色处理中。相较于手工处理,此算法具有完全自动化、无需人工干预、效率高、用时少的特点。并且,在问题复杂度变大,手工操作无法完成的时候,更加的能够体现我们提出的算法的作用。但是,此算法具有一定的适用范围。当组成平面图的多边形个数超过110个时,此算法并不能保证总是能够进行正确的处理。

    4. 参考文献

    [1] 房彩丽.四色算法在基于MapObjects地理信息系统中的应用[J].微计算机信息,2010(3):151-152,204.

    [2] 褚言正.地图四色定理的非计算机证明[J].重庆工业高等专科学校学报,2001(1):94-96.

    [3] 王绍文.平面图的四色算法[J].光子学报,1995(3):263-266.

    [4] 贾永旺.平面图4-着色的两类新算法[D].内蒙古工业大学,内蒙古:呼和浩特,2007.

  • 相关阅读:
    弹性盒子模型属性之flex-shrink
    Git----基本操作
    Git----简介
    ES6常用语法
    nginx学习
    Shell基础命令(二)
    Linux目录
    Shell基础命令(一)
    CRM之分页
    Django之ModelForm组件
  • 原文地址:https://www.cnblogs.com/bobzhangfw/p/2383568.html
Copyright © 2011-2022 走看看