大道至简——论如何最优雅的操纵json地图数据

前不久写的那个,关于如何提取json格式数据地图素材中的相关数据,来适应ggplot2场景下的数据框作图,其实那个代码写的一直都没有通用性。

导致我每做一一个需要使用json地图素材的项目,都需要从新修改那个代码,虽然每一次都能简化不少,但是依然无法适用所有的json素材。

知道最近在leaflet社区浏览案例的时候,才发现大神已经提供了很好的json数据解析方案里,起码有两个(保守估计)以上的包可以完胜这个任务,而且是直接调用现成的函数,无需自己编写方案。

瞬间感觉死磕在json上的时间都能再过一个五一小长假了。

以上所说的解决方案就是利用成熟的json接口(I/O)工具:

geojsonio包和rgdal包:

这两个包可以在主流的空间格式数据之间进行无缝转换。

下面以世界地图为例,演示数据的转换过程。

library("jsonlite") library("ggplot2") library(plyr) library(dplyr) library(geojsonio) library(rgdal)

如果还是停留在使用jsonlite包手工提取数据时代,你可能需要经历以下不可描述的代码环节:

setwd("D:/R/mapdata/State") ### world_data <- fromJSON("world.json") world_city_data<-world_data$features$properties[,1:2] world_city_data<-world_data$features$properties[,c("NAME","NAME_LONG","BRK_A3","POP_EST","GDP_MD_EST")] world_data$features$geometry$coordinates[[1]][,,1] world_data$features$geometry$coordinates[[1]][,,2]

###

而且以上代码还不能保证每次都好用,可能每遇到一个新的素材,随着josn内部层级嵌套结构的变化,你都需要随之更改代码,工作量那是杠杠的~

可是如果你掌握了以下两个工具,那么josn数据操纵起来基本就没烦恼了,就跟之前操纵shp数据一样,这两个工作就是将json直接导入成控件格式数据,方便使用者进一步提取内部信息。

world_Map1<-geojson_read("world.json",what="sp") #geojsonio包导入 world_Map2<-readOGR("world.json","OGRGeoJSON") #rgdal包导入

world_Mapdata1<-world_Map1@data%>%.[,c("NAME","NAME_LONG","BRK_A3","POP_EST","GDP_MD_EST")]%>%rename(region=NAME) world_Mapdata1$id<-rownames(world_Mapdata1) world_MapdataPloygon1<-fortify(world_Map1)%>%left_join(.,world_Mapdata1[,c(6,1,4)])

ggplot(world_Mapdata1,aes(map_id=region))+ geom_map(aes(fill=POP_EST),map=world_MapdataPloygon1)+ expand_limits(x=world_MapdataPloygon1$long,y=world_MapdataPloygon1$lat)+ scale_fill_gradient2(low="#33A15A",high="#BB0126",mid="#FCFFB7",midpoint=mean(world_Mapdata1$POP_EST))+ coord_map("ortho",orientation=c(0,120,0))+ scale_y_continuous(breaks=(-6:6)*15) + scale_x_continuous(breaks=(-12:12)*15)+ theme_minimal()+ theme(axis.text=element_blank(),axis.title=element_blank())

一个案例应用(来自plotly官网社区,本来是用于展示plot_ly函数应用,这里借用一下)

air <- read.csv('https://raw.githubusercontent.com/plotly/datasets/master/2011_february_us_airport_traffic.csv') flights <- read.csv('https://raw.githubusercontent.com/plotly/datasets/master/2011_february_aa_flight_paths.csv') flights$id <- seq_len(nrow(flights))

CairoPNG("D:/world_map.png",1000,900) showtext.begin() ggplot()+ geom_polygon(data=world_MapdataPloygon1,aes(x=long,y=lat,group=group),fill="grey95",col="grey")+ geom_segment(data=flights,aes(x=start_lon,y=start_lat,xend=end_lon,yend=end_lat),col="red",size=.2)+ geom_point(data=air,aes(x=long,y=lat,size=cnt),shape=21,fill="#D73434",col="grey",alpha = 0.5)+ scale_y_continuous(breaks=(-6:6)*15) + scale_x_continuous(breaks=(-12:12)*15)+ scale_size_area(max_size=15)+ coord_map("ortho",orientation=c(25,-100,0))+ theme_minimal()+ theme(axis.text=element_blank(),axis.title=element_blank()) showtext.end() dev.off()

最新版的ggplot2中已经出现了一个新的图层函数——geom_sf,专门用于处理空间数据格式,这样算起来,ggplot系统中已经有至少三个可以处理空间数据的函数了,geom_polygon\geom_map\geom_sf(如果不算ggmap这种外接函数的话)。

R语言之所在主流数据可视化领域长盛不衰,也许就是靠着诸多爱好者源源不断的贡献能够适应各种场景、各种需求和目的的应用解决方案,空间数据可视化是呈现数据可视化之美非常独特的视角,可以说是上上帝之眼~

倘若有一天,自己的水平和火候到了,一定要为R语言可视化领域贡献一份微薄之力(虽然不知道能不能有这么一天~_~)

地图源数据在魔方学院qq群共享中下载

原文发布于微信公众号 - 数据小魔方(datamofang)

原文发表时间:2017-05-08

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏微服务生态

技术书写作你要知道的几件事

写作是非常系统性的工程,需要作者和策划一起设计写作的路径,根据读者的阅读情景、需求考虑内容的呈现形式。如果可以切实从读者出发,首先满足知识性需求,其次满足阅读的...

9740
来自专栏陈树义

7、产品需求文档(PRD)的写作方法

1、理解并掌握PRD文档 -写作思路 -写作方法 -写作格式 2、什么是PRD文档 – PRD文档向上是对MRD内容的继承与发展,向下则是要把MRD文档里面的各...

92170
来自专栏java一日一条

高级Java程序员值得拥有的10本书

Java是时下最流行的编程语言之一。市面上也出现了适合初学者的大量书籍。但是对于那些在Java编程上淫浸多时的开发人员而言,这些书的内容未免显得过于简单和冗余了...

9420
来自专栏CDA数据分析师

业界 | 为什么Jupyter是数据科学家们实战工具的首选?

大型综合巡天望远镜(Large Synoptic Survey Telescope,LSST)坐落在智利安第斯山脉帕穹山脊,计划 2022 年启用。它将自动探测...

10520
来自专栏技术小黑屋

计算机领域的日系书籍

在计算机的设计里,很多经典的书籍多为欧美人所撰写,毕竟他们占据了英语这个优势。这里的主题不是推荐英文书籍,而是推荐几本日系的计算机图书。

27630
来自专栏ImportSource

DDD究竟是个啥?怎么落地?

领域驱动设计(Domain Driven Design,以下简称DDD)这个话题,经常会出现在各大技术圈。特别是微服务出现后,海内外的大佬们又把微服务和DDD放...

26830
来自专栏程序员互动联盟

历史上争议最大的编程语言是谁?

php估计目前是存在争议最大的语言,争议声一直不绝于耳。这是一门优势巨大,缺陷也一样巨大的编程语言。一直在争议中进度,企业招聘的岗位也是越来越多,这么多人参与进...

38980
来自专栏hightopo

数百个 HTML5 例子学习 HT 图形组件 – WebGL 3D 篇

25620
来自专栏ThoughtWorks

变化驱动:正交设计|洞见

本文首发于InfoQ: http://www.infoq.com/cn/articles/change-driven-orthogonal-design 一个...

33840
来自专栏编程之旅

简单的编程体会

今天的这篇博文,我不谈及具体的编程技术,只想从这段时间的学习以及写代码的过程中,分享一下自己的编程体会。

19340

扫码关注云+社区

领取腾讯云代金券