zoukankan      html  css  js  c++  java
  • 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 ToolsCartogramsBnchMrkCartogram.dll”

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

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

     

  • 相关阅读:
    Python中常见的文件对象内建函数
    数字整除
    Bag标签之校验
    开源硬件交流@上海新车间
    POJ 题目2774 Long Long Message(后缀数组,求最长公共子串长度)
    Linux以下的两种文件锁
    敏捷自己主动化单元測试 (从前台 JavaScript 至后台 Java)
    浅谈关于collection接口及相关容器类(一)
    上传文件 | 下载文件
    几年前再用exjts4,如今extjs5发布了,技术更新快,每次给人惊喜
  • 原文地址:https://www.cnblogs.com/gisangela/p/3486897.html
Copyright © 2011-2022 走看看