ArcGIS之Cartogram地图变形记

一、地图会说谎

      地图作为真实世界的抽象,是“用图说话”最可靠的工具,但是有的时候地图也会撒一些小小的谎言,其中最著名的例子当属美国总统大选。如图1是2012年美国总统大选后网上给出的一个结果图,红色代表共和党罗姆尼获胜的州,蓝色代表民主党奥巴马获胜的州,从地图来看罗姆尼占有很大的优势,而事实却是奥巴马赢得了大选的胜利! 因为在这幅地图中,用颜色来对州来进行定性渲染时,却无意中忽略了选票这个数量指标,所以在这张地图上无法反映出奥巴马的选票优势,这也是为什么有Cartogram出现的原因。

                          

                                                     图1 2012年美国大选各州获胜结果示意图

  Cartogram又称变形地图或夸张地图,是比较早出现的一种统计地图形式,其历史可以追溯到1868年。Cartogram可以依据某个专题属性对地理要素进行扭曲、变形,用专题属性值的大小取代真实面积,利用夸张的效果更直观地反映数量特征。主流的Cartogram可以分为连续和非连续两类,连续的变形地图是指要素仍然维持原有邻接的拓扑关系,ArcGIS可以支持这种变形的算法;非连续的变形地图指要素之间不再具有相邻接的关系。如图2中就是一种连续的变形地图,根据选票对各个州进行了形状扭曲,利用夸张后的面积来反映选票的数量。

                      

                                                图2 2012年美国大选各州选票变形地图

二、ArcGIS制作Cartogram实例

      在这片小文中,我们就在ArcGIS中来真实地再现美国总统大选的这个例子。

数据获取:

2012年大选的选票结果可见网站,我们可以把表格直接保存下来存为csv格式(http://uselectionatlas.org/RESULTS/data.php?year=2012&datatype=national&def=1&f=0&off=0&elect=0

数据处理:

  1. 把上面得到的表格与美国州的地理数据(矢量面数据)使用join关联起来,完整的属性信息如下所示:

   

    2.为了区分哪些是奥巴马选票多的州,哪些是罗姆尼选票多的州,需添加一个字段flag,使用字段计算器为其赋值(1为奥巴马获胜的州,-1为罗姆尼获胜的州),这里我们选择Python来写代码:

def calflag(o,r):

    if (o>r):

      return 1

    else:

      return -1

    3.下面我们就要开始对地图进行变形,那么每个州的变形取决于其获胜者的选票数量,这就要再添加一个字段vote,使用字段计算器为其赋值:

def calvote(flag,o,r):

    if (flag==1):

      return o

    else:

      return r

    4.打开Cartogram工具(下载地址http://arcscripts.esri.com/details.asp?dbid=15638),参数设置如下:

         

图层渲染:

     对Cartogram工具输入和输出的两个图层都使用下面的渲染方法进行显示,就分别得到了前面图1和图2中的地图。

        

Cartogram工具使用说明:

  1. 如果使用的是ArcGIS10及以上版本,需要对工具中的两个dll文件进行注册,在命令行中输入regsvr32+dll存放路径,例如:

regsvr32“F:\ArcGIS Tools\Cartograms\BnchMrkCartogram.dll”

  1. value field只能处理正数,如果有小数和负数则执行会发生错误;
  2. 输出的格式只能为Geodatabase。

(本文示例数据可在http://ishare.iask.sina.com.cn/f/65192714.html下载)      

 

 

 

 

 

posted @ 2013-12-23 09:38  gisangela  阅读(8969)  评论(2编辑  收藏  举报