Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >玩转地球: 如何利用SAS绘制现代化地图(附代码)

玩转地球: 如何利用SAS绘制现代化地图(附代码)

作者头像
大数据文摘
发布于 2018-05-25 08:45:48
发布于 2018-05-25 08:45:48
3.9K0
举报
文章被收录于专栏:大数据文摘大数据文摘

投稿作者|巫银良

大数据文摘欢迎各类优质稿件

请联系tougao@bigdatadigest.cn

移动互联网应用和大规模社交网络催生了海量的数据分析需求,时空数据作为记录用户和设备在现实世界分布和活跃程度的基础数据,一直为各大互联网电子商务平台和商家所关注。地理空间数据结合其他业务数据如何被分析利用,以及如何在分析中可视化呈现一直是现代化分析平台的一个重要方向。一方面各种地图服务越来越多地集成到应用中,成为应用增强交互的组成部分(比如“附近的服务/人”,甚至连支付包红包都需要呈现各种方位关系,来增强乐趣),另一方面在分析行业,如何能够高效方便地绘制各种地图成为一种基本需求。

SAS 语言中提供了能够绘制地图的能力。 考虑到 SAS 并不是地图数据的生产者,SAS 只是利用数据。在早些年,尽管SAS提供的地图数据来源多种多样,但SAS花了大量的时间精力来保证用户地图数据的精确性。随着现代卫星和测绘技术的成熟和一些其他原因(比如不再从CIA 获得世界数据),SAS 不再维护既往的地图数据,而是和第三方厂商合作来提供能够定期更新的最新数据,这样就不必考虑不同地理坐标系统和地缘政治格局变化带来的基础地理数据更新。

在传统上,SAS 缺省提供 MAPSSAS 库和 PROC GMAP, PROC GPROJECT, PROC GREMOVE, GEONCODE 等若干过程步来支持地图绘制功能。利用这些基础数据和过程步,用户能很容易绘制世界地图,各大洲地图,各国家地区地图。从SAS 9.30M2 版本开始,SAS 和 GFK GeoMarketing 合作,提供MPASGFK基础库,它能为用户提供超过240个国家和地区精准的数字邮政代码和行政区划地理数据。Gfk GeoMarketing 的数字地图是世界范围内最全最完整的数字地图,坐标系统为 WGS84 并且定期更新。根据笔者的调查,MapGfK 基础库包括2个世界级(其中一个world_cities为世界城市),22个洲级,175个国家级6个美国州县的地理数据与对应属性数据。虽然看起来很全,但也并非十全十美,比如笔者发现有些版本China地图数据没有包括中国台湾岛的内容,也没有反映2010年的北京核心四区合并为两区 等变化。

下面,我们举个最简单的例子,来说明如何在SAS 里绘制地图:

proc gmap map=mapsgfk.world data=mapsgfk.world;

id id;

choro id / nolegend;

run;quit;

运行上面几行代码,SAS 会在结果窗口中输出如下结果:

如果你需要绘制亚洲或者中国地图,则只需要将上面world 改为 Asia或China 即可。

proc gmap map=mapsgfk.asia data=mapsgfk.asia;

id id;

choro id / nolegend;

run;quit;

细心的观众会发现,亚洲地图确实按照各个国家进行了准确的绘制,但中国地图则看起来黑压压的一片(…这个,其实反映的是俺们大中华确实是地大物博啊),并没有什么实用价值;九段线是确实包括在内,但其中竟然没有中国宝岛台湾(不要慌,下面我们介绍如何将缺失的中国台湾部分和中国地图合并为大中华地图)

data mytaiwan;

set mapsgfk.taiwan;

id2=id1; id1='CN-83';

run;

data GreatChina;

set mapsgfk.china mytaiwan; /*合并中国台湾到大中华*/

run;

proc gmap map= GreatChina data= GreatChina;

id id;

choro id / nolegend;

run;quit;

执行上面的代码,输出结果如下。中国台湾出现在地图正中央(四川盆地)位置。原因是各个分区地图有自己的投影基点,我们需要按照中国数据进行投影。

为了将中国台湾岛移到指定位置,需要在调用 PROC GMAP 前执行如下代码,对中国台湾岛的数据根据中国的投影进行变换:

...

proc GPROJECT data=GreatChina out=GreatChina LATLON PARMIN=mapsgfk.projparm PARMENTRY=china;

id id;

run;

proc gmap map=..

在实际制作地图时,并不需要这么多的细节数据。因此我们需要将不必要的地区和县的边界删除,然后再调用 PROC GMAI绘图。代码如下:

proc sort data=GreatChina out=tmpds;

by ID1;

run;

proc gremove data=tmpds out=tmpds;

by ID1;

id id;

run;

data GreatChina(drop=ID1);

set tmpds;

id=ID1;

run;

为了给各省标注上省名,我们可以利用 MAPSGFK库中已有的地图属性数据来绘制标签。此时需要利用系统自带的宏 %annomac 和 %maplabel 来生成描述数据数据。另外,需要对中国台湾岛的描述数据进行特殊处理,统一到大中华地图中来。代码如下:

data mytaiwan_attr;

set mapsgfk.taiwan_attr;

id2=id1; id2name=id1name;

id1='CN-83'; id1name="Taiwan Sheng"; isoname='China';/*增补*/

drop country ;

run;

data GreatChina_data;

set mapsgfk.China_attr mytaiwan_attr; /*合并中国台湾省的描述数据*/

keep id1 id1name;

rename id1=id id1name=idname;

run;

%annomac;

%maplabel (GreatChina, GreatChina_data, anno_label, idname, id, font=%str(SimSun), color=black, size=1.5, hsys=3);

proc gmap map=GreatChina data=GreatChina_data;

id id;

choro id / nolegend anno=anno_label;

run;quit;

上面的地图显示的是英文名称,而我们希望显示中文名称怎么办?很简单,我们只需要在代码中使用 id1nameU 列,并将字符进行转义即可显示正确:

data mytaiwan_attr;

set mapsgfk.taiwan_attr;

id2=id1; id2name=id1name;

id1='CN-83'; id1name="Taiwan Sheng"; isoname='China';

id1nameu= put('中国台湾省',$uesc200.);

drop country ;

run;

data GreatChina_data;

set mapsgfk.China_attr mytaiwan_attr; /*合并中国台湾省的描述数据*/

keep id1 id1nameU;

rename id1=id id1nameU=idname;

run;

%annomac;

%maplabel (GreatChina, GreatChina_data, anno_label, idname, id, font=%str(SimSun), color=black, size=1.5, hsys=3);

data anno_label; set anno_label; text=unicode(text);run;

proc gmap map= GreatChina data= GreatChina_data;

id id;

choro id / nolegend anno=anno_label;

run;quit;

虽然在 MAPSGFK 基础库中有很多基础地理数据,但在现实中依然不够用怎么办? 解决方案有两种:第一种是直接利用实际测绘的地理数据创建自定义地图;第二种方法是利用谷歌地球导出地球上任何地区/建筑的 KML 数据,然后再导入到 SAS 系统里创建地图。比如下图就是用第二种方法创建的谷歌总部第40号楼的地理数据。(下图为 Google Earth里的样子)

%MAPIMPORT(DATAFILE="test.kml",out=%str(mymap), ID=201);

data mymap; set mymap;

x=long;y=lat;

run;

data mymap_data;

attrib ID length=$15 label='Districts code';

attrib IDNAME length=$55 label='Districts name';

infile datalines dsd;

input

ID

IDNAME

;

datalines4;

201,Google Building 40

;;;;

data mymap_data; set mymap_data;

length my_html $100;

my_html='title='||quote(trim(left(idname)));

run;

goptions reset=all;

goptions hsize=1024pt vsize=768pt;

ods html;

%let mymap=mymap;

%let mymap_data=mymap_data;

%annomac;

%maplabel (&mymap, &mymap_data, anno_label, idname, id, font=%str(SimSun), color=WHITE, size=1.5, hsys=3);

proc gmap map=mymap data=mymap_data;

id id;

choro id / nolegend anno=anno_label;

run;quit;

ods html close;

以上代码生成结果如下,为Google总部40号楼的精确地理信息,可用于进一步分析处理。

在互联网上,有时听见一些人抱怨 SAS 语言做出的图表不够美观,显得比较粗陋。其实造成这误解的根本是没有掌握 SAS 强大的特性控制功能和实现的灵活性。为了展示 SAS 在绘制地图方面预留的灵活性和控制,下面将展示若干纯粹利用 SAS 代码绘制的各种现代化的复杂地图。SAS语言天生作为面向分析而设计的语言,它保留了非常多的扩展性;笔者甚至发现在 SAS 地图里可以绘制天气云图(见下图3)。正所谓倚天不出,谁与争锋?在分析行业里只有掌握了如何使用SAS这把倚天剑,才能使数据分析结果的展示一切皆有可能!

图1:SAS绘制空白中国省图

图2:SAS绘制的中国各省的卫星地图

图3:SAS 绘制的带有卫星云图的中国分省图

总结:

SAS GMAP 提供 2D (choropleth) 和 3D (block, prism, surface) 地图的绘制和渲染,用来将分析变量和结果显示在地图上。既往的研究表明,SAS 用户可以桥接任何地图服务商的数据,包括 MAPBOX, MAPQUEST, HERE, GOOGLE,ARCGIS和 AutoNavi(高德)的地图和他们的各种变体:卫星图(SATELLITE), (街道图)STREETS, (地形图)TERRAIN和(交通图)TRAFFIC 等。 PROC GMAP 的所有奥秘其实都藏在它的 MAP和DATA 参数里,至于如何实现,就需要在实际需求中与具体业务数据结合考虑。

作者 | 巫银良

赛仕软件研究开发(北京)有限公司

商业智能和可视化分析产品部 技术总监

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-02-03,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 大数据文摘 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
SAS-GTL,帮我征个婚呗~
“GTL”(Graph Template Language),是SAS画图的一门语言,小编最近开始学习画图,当然也逃脱不了学习GTL,用“一入侯门深似海”来形容一点也不为过,还没入门就已经发现了GTL里面的水很深,不是一般的深,option多的简直没有天理了....奥,对了,今天的主题不是GTL,是“征婚”!是的,小编的公开征婚系列第一帖!希望不会有第二贴。
Setup
2019/10/21
1.5K1
【科研猫·绘图】世界地图绘制
由于近期疫情的播散,而流行病学研究对疫情防控又至关重要,所以,最近涌现了一大批关于疾病流调的文章,这也使得很多研究人员在文章中需要绘制不同地区的地图作为文章中的主图。这些图频繁出现在Lancet或者NEJM、CNS等顶级杂志中,不过对于很多科研人员来说,地图的绘制由于没有现成软件可以直接操作,一直以来都是一大难题。
用户6317549
2020/03/26
4.5K2
【科研猫·绘图】世界地图绘制
经典回顾 | NCL上准确绘制中国国界、台湾岛屿、南海诸岛及省界等
NCL-Chinamap GitHub项目地址: https://github.com/huangynj/NCL-Chinamap 本地图数据作者保留著作权和最终解释权,本数据可用于教育,科研等非商业用途,若商业用途请提前与本数据作者联系,经允许后方可使用,如有违反,本数据作者保留权利! 为了表示对贡献者劳动成果的尊重,若使用该地图数据绘图发表论文等,可考虑添加致谢! 中文致谢:感谢中国科学院大气物理研究所黄永杰博士提供的包含正确中国国界 和行政区划的地图数据(https://github.com/huan
气象学家
2022/01/18
6.4K0
经典回顾 | NCL上准确绘制中国国界、台湾岛屿、南海诸岛及省界等
SAS作图问题概述3
  数值型数据表现为数字,在整理时通常进行数据分组。分组是根据统计研究的需要,将数据按照某种标准分成不同的组别。直方图是用矩形的宽度和高度来表示频数分布的图形。用横轴表示数据分组,纵轴表示频数或频率。   例9 某地1993年抽样调查了110名18岁男大学生的身高(cm)资料。现在关注的指标是身高的分布。 SAS程序:
py3study
2020/01/10
1.7K0
捍卫祖国领土从每一张地图开始
地图是表达国家版图最常用、最主要的形式。但在影视剧《亲爱的,热爱的》中出现了明显的错误,从上至下引起了极大的关注度。
MeteoAI
2019/08/09
6.1K2
捍卫祖国领土从每一张地图开始
【学习】R笔记1:ggplot绘制商务图表--中国分省热力地图
R和ggplot可视化功能非常强大,了解了一下其中的地图做法,发现R做世界地图、美国地图非常容易,但做中国地图就太麻烦了,需要自己DIY。 DIY也有多种方式,但网络上各种帖子教程的出图效果都不太理想,达不到工作用要求。下面是我的摸索过程,记录如下备忘,也请教于R老师们。 参考书目:ggplot2,R graphics cookbook,参考贴:http://site.douban.com/182577/widget/notes/10568279/note/257898418
小莹莹
2018/04/23
3.8K0
【学习】R笔记1:ggplot绘制商务图表--中国分省热力地图
【Python】pyecharts 模块 ⑤ ( 地图绘制 | pyecharts 地图绘制步骤 | 为地图进行全局配置 )
首先 , 导入 pyecharts 中的 Map 类 , 这是 地图绘制 的核心类 , 该类定义在 pyecharts.charts 中 ;
韩曙亮
2023/10/11
1.6K0
【Python】pyecharts 模块 ⑤ ( 地图绘制 | pyecharts 地图绘制步骤 | 为地图进行全局配置 )
R 获取中国标准官方地图(含官方网站)
今天,给大家介绍一下,如何利用R语言获取中国地图。有一点大家清楚,网络上很多教程关于R绘制中国地图。 但是中国地图的绘制涉及到国家主权,及以前旧版本地图,西藏领地不全,没有台湾,也没有南海九段线。中国地图最常见的问题有四个:
Jamesjin63
2022/10/25
3.2K0
R 获取中国标准官方地图(含官方网站)
R语言绘制中国地图,并展示流行病学数据
本文作者:姜晓东,博士毕业于上海交通大学,目前任教于湖南师范大学医学院,专业神经毒理学。 流行病学的数据讲究“三间分布”,即人群分布、时间分布和空间分布。其中的“空间分布”最好是在地图上展示,才比较清楚。R软件集统计分析与高级绘图于大成,是最适合做这项工作了。关于地图的绘制过程,谢益辉、邱怡轩和陈丽云等人都早有文章讲述,开R地图中文教程之先河。由于目前指导毕业论文用到,因此研究了一下。本来因为网上教程很多,曾打消了写些文字的计划,但怡轩版主鼓励说“教程者众,整合者鲜”,所以才战胜拖延症,提起拙笔综述整合一
机器学习AI算法工程
2018/03/13
19.4K0
R语言绘制中国地图,并展示流行病学数据
【工具】用R软件绘制中国分省市地图
【注】新版本的maptools包对很多函数进行了修改,对于修改的内容,文章中用红色的文字进行了说明。 鉴于最近有不少人在讨论用R软件绘制地图的问题,我也就跟着凑了凑热闹,对相应的方法学习了一番。下面的这篇文章是一个初步的介绍,还有很多内容仍在学习和探索中,如果大家有什么意见或建议,我将根据自己学习的情况对文章进行进一步的补充。 在R中绘制地图其实是十分方便的,最直接的办法大概就是安装maps和mapdata这两个包,然后输入下面的命令: library(maps) library(mapdata) ma
小莹莹
2018/04/19
3.6K0
【工具】用R软件绘制中国分省市地图
就是这么简单,Pyecharts绘制可视化地图!
Pyecharts 是一个用于生成 Echarts 图表的类库。Echarts 是百度开源的一个数据可视化 JS 库。用 Echarts 生成的图可视化效果非常棒,pyecharts 是为了与 Python 进行对接,方便在 Python 中直接使用数据生成图。
小F
2021/04/26
2.8K0
就是这么简单,Pyecharts绘制可视化地图!
一篇小短文助你打开数据可视化的任督二脉!
本文主要讨论ggplot2是如何通过颜色信号来对多边形进行填充的底层理念,这也是想要进阶R语言数据可视化过程中必须搞明白的关键环节。 ggplot2所有图层对象中,geom_ploygon()几何图层对象最为复杂,也最为特殊: 复杂在哪儿呢? 这种几何对象所定义的多边形(特别是在地理信息数据里面),领土边界是基于行政区划、行政区划再细分为单个多边形(也就是group),单个多边形又是一组经纬度坐标点构成(按照order排序)。 所以说geom_ploygon()所要显式声明的参数至少需要四个: data(地
数据小磨坊
2018/04/11
1.5K0
一篇小短文助你打开数据可视化的任督二脉!
python制作中国疫情地图
根据百度中国新型冠状肺炎疫情数据绘制(数据更新至 2020.02.01 21:21),通过python编写程序生成地图,再通过对HTML文件代码重改编写完成。
AngelNH
2020/04/16
1.4K0
2022见证中国崛起从Python绘制中国地图开始:使用pyecharts最新版本绘制中国地图实例详解,个性化地图定制及常用参数解析
[ 系列文章篇 ] Python 地图篇 - 使用 pyecharts 绘制世界地图、中国地图、省级地图、市级地图实例详解
小蓝枣
2022/04/01
3.1K0
2022见证中国崛起从Python绘制中国地图开始:使用pyecharts最新版本绘制中国地图实例详解,个性化地图定制及常用参数解析
小蛇学python(23)basemap入门与进阶
Basemap是matplotlib下的一个库文件,专门应用于绘制地图。这一节就来详细讲解该文件的使用。首先来绘制一个最简单的地图。代码结果如图1所示。
用户2145057
2020/02/18
1K0
小蛇学python(23)basemap入门与进阶
使用 hchinamap / highcharter 绘制交互式中国地图及中国各省地图
该包绘制的地图精度较低,如果你需要学习绘制高精度的中国地图,欢迎加入我的线上培训班获取:欢迎加入 RStata 线上培训班学习使用 R 语言和 Stata 进行数据处理和可视化
DataCharm
2021/02/22
4.5K0
使用 hchinamap / highcharter 绘制交互式中国地图及中国各省地图
国内疫情图绘制(静态)
该点子来源于一个小作业,作业要求是使用R平台相关绘图工具绘制中国疫情热力图(10分),参考效果如下图:
庄闪闪
2021/04/09
7990
(数据科学学习手札78)基于geopandas的空间数据分析——基础可视化
  通过前面的文章,我们已经对geopandas中的数据结构、坐标参考系以及文件IO有了较为深入的学习,在拿到一份矢量数据开始分析时,对其进行可视化无疑是探索了解数据阶段重要的步骤。
Feffery
2020/03/04
3.7K0
(数据科学学习手札78)基于geopandas的空间数据分析——基础可视化
利用pyecharts对职位数据进行地图可视化
pyecharts 是基于百度开源的Echarts、方便与Python 进行对接、直接可以用于python的一个库。
Python与Excel之交
2021/08/05
8390
聊一聊我常用的6种绘制地图的方法
今天来讲一讲在日常工作生活中我常用的几种绘制地图的方法,下面我将介绍下面这些可视化库的地图绘制方法,当然绘制漂亮的可视化地图还有很多优秀的类库,没有办法一一列举
周萝卜
2021/12/08
3.9K0
聊一聊我常用的6种绘制地图的方法
推荐阅读
相关推荐
SAS-GTL,帮我征个婚呗~
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档