ggmap:使用ggplot2进行空间可视化绘图(下篇)

作者:戴维 · 卡尔&哈德利·威克姆
翻译:李博
原文地址:ggmap: Spatial Visualization with ggplot2
PS:由于原文较长,故翻译分为三次进行。

==================================

09.ggmap的实用函数

ggmap有几个实用函数,可以帮助探索空间数据分析。
</br>

001.geocode函数

从地址转换到经度/纬度坐标的方式,实际上是对空间数据进行可视化的必要条件。但问题是,这一过程几乎总是要通过使用必要的地理信息系统(GIS)、同时需要保存结果并将其导入到R中,最后在R外部完成。

而geocode(地理编码)函数将该过程简化为R中一行命令。

geocode是一个向量化函数,它接受字符串并返回地理信息的数据集。在output =“simple”的默认情况下,只返回经纬度。

这些实际上是Mercator对1984年世界大地测量系统(WGS84)的普遍预测,这是Google Maps使用球形地球模型的来源。当output=“more”时,会返回一个较大的数据集,该数据集提供了更多的Google地理编码信息:

> geocode("baylor university", output = "more")
lon lat type loctype address north south east
1 -97.11441 31.54872 university approximate [long address] 31.55823 31.53921 -97.0984
west postal_code country administrative_area_level_2
1 -97.13042 76706 united states mclennan
administrative_area_level_1 locality street streetNo point_of_interest
1 texas waco s 5th st 1311 <NA>

#######在个人电脑上运行后情况

> library(ggmap)
#谷歌地图API服务条款。Google Maps API Terms of Service: http://developers.google.com/maps/terms.

> geocode("baylor university", output = "more")
Information from URL : http://maps.googleapis.com/maps/api/geocode/json?address=baylor%20university&sensor=false
        lon      lat          type     loctype
1 -97.11431 31.54984 establishment approximate
                                          address    north    south      east      west
1 1301 s university parks dr, waco, tx 76798, usa 31.55119 31.54849 -97.11297 -97.11566
  street_number                        route locality administrative_area_level_2
1          1301 South University Parks Drive     Waco             McLennan County
  administrative_area_level_1       country postal_code
1                       Texas United States       76798

特别是,各级政府机构的报告。若设定output=“all"时,则返回整个JSON对象,该对象由谷歌地理编码API解析。参考下面的代码。

## output = "all"的时,返回详细信息情况(节选一部分)。
> library(ggmap)
> geocode("baylor university", output = "all")
Information from URL : http://maps.googleapis.com/maps/api/geocode/json?address=baylor%20university&sensor=false
$results
$results[[1]]
$results[[1]]$address_components
$results[[1]]$address_components[[1]]
$results[[1]]$address_components[[1]]$long_name
[1] "1301"
$results[[1]]$address_components[[1]]$short_name
[1] "1301"
$results[[1]]$address_components[[1]]$types
[1] "street_number"


地理编码API有一些防止滥用的要求限制。

一个未指明的短期rate(见图文)以及24小时2500个请求的限制,通过隐藏的全局变量可以在一定程度上进行检测。

GooglegGocodeQueryCount和输出函数geocodequerycheck,geocode使用它们监控自己的进度,要么(1)根据使用情况调整运行速度或(2)如果查询超出限制则弹出一个错误提示,值得注意是,revgeocode共享相同的请求响应,同时是由相同的变量和函数监测。

要了解更多关于谷歌地理编码、距离矩阵,和API方向的使用规则,请参考文献中列出的网站。

</br>

002.revgeocode函数

在某些情况下,将经度/纬度坐标转换为物理地址是很有用的,使用revgeocode函数这样做是可能的,不过这将依赖于Google地理编码API。

> gc <- geocode("baylor university")
> (gc <- as.numeric(gc))
[1] -97.11441 31.54872
> revgeocode(gc)
[1] "S 1st St, Baylor University, Waco, TX 76706, USA"
Like geocode , more output can be provided as well –
> revgeocode(gc, output = "more")
address route establishment neighborhood locality
1 [long address] S 1st St Baylor University Baylor Waco
administrative_area_level_2 administrative_area_level_1 country postal_code
1 McLennan Texas United States 76706

因此,除了反向地理编码的物理位置(即:地址),revgeocode可以报告在不同尺寸级别上的情况。最后,output="all"选项可以返回 Google报告的整个JSON对象。
</br>

003.mapdist函数

在空间环境中,计算人们常说的“距离”的能力,是很了不起的事,因此这也为GIS输送了大量的分析人员。使用Google Distance Matrix AI,ggmap能够为Google提供驾驶,骑自行车或步行路线的距离。除了距离之外,Google还会报告预计的剩余时间。输出结果存放在易于使用的数据集中。

例如:

> from <- c("houston", "houston", "dallas")
> to <- c("waco, texas", "san antonio", "houston")
> mapdist(from, to)
from to m km miles seconds minutes hours
1 houston waco, texas 298004 298.004 185.1797 11907 198.45 3.307500
2 houston san antonio 320764 320.764 199.3227 11997 199.95 3.332500
3 dallas houston 387389 387.389 240.7235 14592 243.20 4.053333
自己运行后情况
> library(ggmap)
载入需要的程辑包:ggplot2
Google Maps API Terms of Service: http://developers.google.com/maps/terms.
Please cite ggmap if you use it: see citation('ggmap') for details.
> from <- c("houston", "houston", "dallas")
> to <- c("waco, texas", "san antonio", "houston")
> mapdist(from, to)
by using this function you are agreeing to the terms at :
http://code.google.com/apis/maps/documentation/distancematrix/

Information from URL : http://maps.googleapis.com/maps/api/distancematrix/json?origins=dallas&destinations=houston&mode=driving&sensor=false
Information from URL : http://maps.googleapis.com/maps/api/distancematrix/json?origins=houston&destinations=waco+texas%7Csan+antonio&mode=driving&sensor=false
     from          to      m      km    miles seconds  minutes    hours
1 houston waco, texas 298587 298.587 185.5420   10332 172.2000 2.870000
2 houston san antonio 317170 317.170 197.0894   10474 174.5667 2.909444
3  dallas     houston 385035 385.035 239.2607   12476 207.9333 3.465556

上面默认的运输工具是汽车。然而,其它模式也是可用的。输入的形式,可以是物理地址(理想),或(“白宫”),或地理坐标(即反向地理编码)。当输出默认为上面所看到的数据集格式时,设置output=“all”,则从谷歌获取完整的JSON对象。

Distance Matrix API将用户限制为每个查询100个请求,每10秒100个请求,每24小时2500个请求。在能够轻松监控这些限制的情况下,导出函数distQueryCheck可帮助用户跟踪其剩余的查询次数。它依赖于隐藏的全局变量".GoogleDistQueryCount(谷歌距离查询数量) "

> distQueryCheck()
2495 distance queries remaining.
> .GoogleDistQueryCount
time url elements
1 2012-03-16 00:12:11 [url used] 1
2 2012-03-16 00:16:10 [url used] 2

如果用户超过了查询上限,mapdist要么(1)暂停,直到到短期的请求限制已经失效或(2)报错,如果没有查询的话。因此,它几乎与用于地理编码的原理相同。如果用户认为这不正确,则mapdist参数规范“override_limit = TRUE”可以覆盖。

mapdist输出的数据集非常便于用ggplot2绘图。图11提供一个例子。从一个位置到附近好几个位置的距离,(1)可以使用mapdist进行测定。(2)使用cut可以进行分类,(3)使用一个qmap组合进行绘图。比如:geom_text 和geom_rect。可以用布景对行程时间分类。完整的代码在ggmap文档的示例部分中。

图11

</br>

004.route函数

route函数提供构成两个位置之间路线序列的地图距离。每条路线都具有开始和结束经度/纬度坐标,以及与mapdist报告的相同单位的距离和持续时间。按照序列组成的路线集,构成了一个单独的,并可使用geom_leg绘制的路线。

图12中可以看到,使用geom_leg绘制路线,就是一个很好例证,其中在相同的两个位置之间绘制了三条路线。这些可以使用route函数中的“alternatives = TRUE”参数获得。备选方案要求是,从起点到目的地的多条路线;返回值添加到一个附加变量数据集中,用于路由标识符(A,B,C等)。

legs_df <- route(
’marrs mclean science, baylor university’,
’220 south 3rd street, waco, tx 76701’,
alternatives = TRUE
)
qmap(’424 clay avenue, waco, tx’, zoom = 15, maptype = ’hybrid’,
base_layer = ggplot(aes(x = startLon, y = startLat), data = legs_df)) +
geom_leg(
aes(x = startLon, y = startLat, xend = endLon, yend = endLat,
colour = route),
alpha = 3/4, size = 2, data = legs_df
) +
labs(x = ’Longitude’, y = ’Latitude’, colour = ’Route’) +
facet_wrap(~ route, ncol = 3) + theme(legend.position = ’top’)
图12

与地图距离一样,在给定时间内可以请求的路线同样受到限制。留下的查询数由“.GoogleRouteQueryCount”变量与“routeQueryCheck”函数进行监控。

</br>

绘制形状文件

作为最后一个例子,这可能太常见了以至于被忽略,用ggmap绘制形状文件是一件轻而易举的工作,可以通过几种方式完成。最简单的方法是使用fortify(ggplot2),并通过点/路径/多边形图层添加到地图方法,将形状文件转换为数据框。可以通过简单的更多的Geom层来添加附加层。

图13显示绘制美国2000年人口普查,以及完整代码的基本示例。

# get an example shape file#获取一个示例形状文件
download.file(’http://www.census.gov/geo/cob/bdy/tr/tr00shp/tr48_d00_shp.zip’,
destfile = ’census.zip’)
# unzip, and load tools#解压缩和载入工具
unzip(’census.zip’); library(maptools); library(gpclib); library(sp);
gpclibPermit()
# read data into R#读取数据到R中
shapefile <- readShapeSpatial(’tr48_d00.shp’,
proj4string = CRS("+proj=longlat +datum=WGS84"))
# convert to a data.frame for use with ggplot2/ggmap and plot#转换数据框,使用 ggplot2/ggmap 进行绘图
data <- fortify(shapefile)
qmap(’texas’, zoom = 6, maptype = ’satellite’) +
geom_polygon(aes(x = long, y = lat, group = group), data = data,
colour = ’white’, fill = ’black’, alpha = .4, size = .3)
图13

结论和方向展望

建立在ggplot2之上,ggmap为可视化空间数据提供了几个新的有用工具。从理论上说,分层图形的语法尝试强制绘图的兼容性,从而实现良好的绘图实践。但实际上,在ggplot2上构建ggmap可以使结果更好,因为ggplot2的全部功能都接受了考验。

未来的一些发展方向,应该在ggmap存储包中。新的osmar包集成了R和OpenStreetMap数据结构,Stamen Maps和CloudMade Maps被渲染,从而打开了使用ggmap(Eugster和Rug)在R上绘制地图或卫星图像的可能性。或者,与R中的其它空间包集成的,可以为空间数据分析提供几个非常实用的工具。最后,Google Elevation API和Places API提供了更多有趣的探索,可以像其它Google API一样融入ggmap框架,为用户提供额外的功能,而且可以免费提供地理数据。

(全文完)

“本译文仅供个人研习、欣赏语言之用,谢绝任何转载及用于任何商业用途。本译文所涉法律后果均由本人承担。本人同意简书平台在接获有关著作权人的通知后,删除文章。”

==========================

翻译后记:

断断续续接近半个多月的翻译,昨天终于完成,今天属于整理发布。

5月28日发布翻译的第一部分,6月2日发布翻译第二部分,到今天6月11日发布第三部分。完整的18页PDF,硬是让我拆成了三篇,专业的理论文章,确实较难理解。

遇到的困难,一个是原文的专业术语和大量的缩写,让我在尝试过程中陷入纠结,虽然借助google进行辅助翻译,但是要表达出作者的本意,我还是打了很大折扣。

二是文中大量的长句,对于我这不及格的英文水平,看到长长的句子,就开始发懵,想拆成小的部分,都难以做到。即使查到每个单词的意思,可想表达的意思就是连不起来,反复的捋顺,通过口语化再进行书面表达。

三是有幸学过一段时间R语言,对涉及R语言中的相关函数和包的翻译及理解,使得在相关翻译中才勉强可为。同时也从侧面反应了个人在中文使用上的局限,尤其在文字表达和逻辑理解方面欠缺,这需要逐步加强。

最后,非常感谢大数据社群的小伙伴。在知乎上得到了来自社群小伙伴的鼓励,猴子老师的鞭策,让我一步一步的完成翻译。同时感谢身边同事的包容,感谢jc,小罗,木恒的大力支持,谢谢你们。有你们在,我会坚定的走下去。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容