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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
【说站】python格式化经纬度的方法
1、对数据进行清理,主要是度分秒的符号问题,有的是中文或者英文,需要统一替换成一种在Excel中完成。
很酷的站长
2022/11/26
5770
【说站】python格式化经纬度的方法
奇妙问题集 # 地理“经纬度”数据的4种 Python 转换方法!
关于“度、分、秒”的印象,我还是停留在初、高中的印象,因为那个时候学习过他们之间的数学转换。今天突然被问及,因此我将其整理出来,供大家学习。
朱小五
2020/11/06
9800
奇妙问题集 # 地理“经纬度”数据的4种 Python 转换方法!
盘点一个Python自动化办公的实战案例
前几天在Python钻石交流群【Hxy任我肥】问了一个Python自动化办公的问题,提问截图如下:
Python进阶者
2022/11/14
3670
盘点一个Python自动化办公的实战案例
python爬虫与数据可视化书(python大数据可视化)
之前写过篇爬取前程无忧职位信息并保存到Excel的博客, 这里仔细的讲讲并且增加可视化内容
全栈程序员站长
2022/07/28
9270
python爬虫与数据可视化书(python大数据可视化)
盘点一个使用Python自动化处理GPS、北斗经纬度数据实战(下篇)
上一篇文章我们使用了Python来实现数据的导入和分列处理,最终可以得到符合预期的结果,不过还可以继续深挖优化下,这一篇文章一起来看看吧。优化的背景如下图所示:
Python进阶者
2023/09/26
4130
盘点一个使用Python自动化处理GPS、北斗经纬度数据实战(下篇)
Python高效办公|如何正确处理word中的表格
很久没更新Python高效办公系列的文章啦,最近就遇到一个很适合Python来做的一件事情,分享给大家。
罗罗攀
2021/12/06
2.4K0
Python高效办公|如何正确处理word中的表格
Pandas爬取历史天气数据
Pandas是一款开放源码的BSD许可的Python库,为Python编程语言提供了高性能,易于使用的数据结构和数据分析工具。
fireWang
2019/05/14
2.5K0
Pandas爬取历史天气数据
Python从0到100(二十一):用Python读写Excel文件
Excel是Microsoft(微软)为使用Windows和macOS操作系统开发的一款电子表格软件。Excel凭借其直观的界面、出色的计算功能和图表工具,再加上成功的市场营销,一直以来都是最为流行的个人计算机数据处理软件。当然,Excel也有很多竞品,例如Google Sheets、LibreOffice Calc、Numbers等,这些竞品基本上也能够兼容Excel,至少能够读写较新版本的Excel文件,当然这些不是我们讨论的重点。掌握用Python程序操作Excel文件,可以让日常办公自动化的工作更加轻松愉快,而且在很多商业项目中,导入导出Excel文件都是特别常见的功能。
是Dream呀
2024/05/28
3310
盘点一个Python自动化办公的实战案例(word文件处理)
前几天在Python铂金交流群【Jethro Shen】问了一个Python自动化办公的问题,提问截图如下:
Python进阶者
2022/11/14
7250
盘点一个Python自动化办公的实战案例(word文件处理)
Python - 字符串格式化详解(%、format)
相对基本格式化输出采用 % 的方法,format()功能更强大,该函数把字符串当成一个模板,通过传入的参数进行格式化,并且使用大括号 {} 作为特殊字符代替 %
小菠萝测试笔记
2020/06/09
28.2K0
利用 Python 实现 Excel 办公常用操作!
本文用的主要是pandas,绘图用的库是plotly,实现的Excel的常用功能有:
刘早起
2022/12/20
2.7K0
利用 Python 实现 Excel 办公常用操作!
Python爬虫 | 手把手教你扒一扒贝壳网成交房源数据
最近有财迷朋友们看了《Python爬取贝壳找房8万+二手房源,看看普通人在北京买房是有多难!》之后,想爬取自己所在城市的成交房源数据做做分析之类的。
Python编程与实战
2021/04/29
3.4K0
Python爬虫 | 手把手教你扒一扒贝壳网成交房源数据
手把手教你用Pyecharts库对淘宝数据进行可视化展示
大家好,我是Python进阶者,上个礼拜的时候,我的Python交流群里有个名叫程序的大佬,头像是绿色菜狗的那位,在Python交流群里边的人应该都知道我说的是哪个大佬了,他提供了一份初始淘宝数据,数据乍看上去非常杂乱无章,但是经过小小明大佬的神化处理之后,一秒就变清晰了,真是太神了,然后就有了后续的数据分词处理和可视化等内容了,可能群里的人平时工作太忙,没有来得及看群消息,作为热心的群主,这里给大家整理成一篇文章,感兴趣的小伙伴,可以去实操一下,还是可以学到很多东西的。言归正传,一起来学习下今天的数据分析内容吧。
Python进阶者
2021/08/27
7080
【POI框架实战】——POI导出Excel时设置单元格类型为数值类型
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/huyuyang6688/article/details/49786227
DannyHoo
2018/09/13
5.5K0
【POI框架实战】——POI导出Excel时设置单元格类型为数值类型
Python中查询缺失值的4种方法
在我们日常接触到的Python中,狭义的缺失值一般指DataFrame中的NaN。广义的话,可以分为三种。
快学Python
2022/06/10
4.7K0
Python中查询缺失值的4种方法
Pandas专家总结:指定样式保存excel数据的 “N种” 姿势!
对于这个pandas对象,如果我们需要将其保存为excel,有那些操作方式呢?首先,最简单的,直接保存:
Python进阶者
2021/01/08
19.3K0
Pandas专家总结:指定样式保存excel数据的 “N种” 姿势!
Python自动化之如何格式化SPD.excel数据?
前几篇文章我们介绍了处理txt文档,格式化数据为我们所用,但是有时客户给的数据不一定是txt格式,这篇文章,我们来介绍下如何处理excel文档,从里面提取我们需要的信息并格式化数据。
极简小课
2022/06/27
1.1K0
Python自动化之如何格式化SPD.excel数据?
Python自动化办公实战案例分享
前几天在粉丝群有个粉丝问了一个Python自动化办公的问题,这里拿出来给大家一起分享下。粉丝需求如下:
Python进阶者
2024/02/17
1830
Python自动化办公实战案例分享
数据科学入门必读:如何使用正则表达式?
选自Dataquest 作者:Alex Yang 机器之心编译 参与:Panda 正则表达式对数据处理而言非常重要。近日,Dataquest 博客发布了一篇针对入门级数据科学家的正则表达式介绍文章,通过实际操作详细阐述了正则表达式的使用方法和一些技巧。 数据科学家的一部分使命是操作大量数据。有时候,这些数据中会包含大量文本语料。比如,假如我们需要搞清楚「巴拿马文件 [注意,可能是敏感词]」丑闻中谁给谁发送过邮件,那么我们就要筛查 1150 万份文档!我们可以采用人工方式,亲自阅读每一封电子邮件,但我们也可以
机器之心
2018/05/08
3.7K0
数据科学入门必读:如何使用正则表达式?
Python实例篇:自动操作Excel文件(既简单又特别实用)
大家平时在工作与学习中都会操作到Excel文件格式,特别是很多数据的时候,靠人力去识别操作非常容易出错。今天就带大家用Python来处理Excel文件,让你成为一个别人眼中的秀儿~
润森
2022/09/22
2.7K0
推荐阅读
相关推荐
【说站】python格式化经纬度的方法
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档