R语言交互式绘制杭州市地图:leafletCN包简介

浏览: 4642

  作为一名地图控,曾经一度不敢看地图,只要瞄一眼心思就立马飞到三山五岳,四海五湖。初中高中上地理课时,每每会思索教材上那些漂亮的彩色地图是怎么画出来,后来我才明白这些炫目的彩图背后的实现原理并不难。相信有很多人和我一样,一开始被R语言吸引并不是因为其出色的统计计算和数据分析功能,而是由于其强大的绘图系统。所以,当一名地图控碰上R语言时,结果只能是一拍即合,皆大欢喜。

    本文以leafletCN地图包为对象,简单介绍leafletCN包的主函数和辅助函数,以交互式绘制杭州市地图为例展现R的强大的地图绘制功能。本文部分参考了Lchiffon的github和悟乙己老师的csdn博客,地址如下。

    github:https://github.com/lchiffon/leafletCN 

     http://blog.csdn.net/sinat_26917383/article/details/57083985

1  leafletCN包简介

    leafletCN包的安装:

    install.packages("leafletCN")
     library(leafletCN)

     leafletCN包的帮助页面:

image.png

   主函数:regionNames() 极其方便的找地名函数

                   demomap() 根据输入的地名进行交互式区域绘图

                   geojsonMap() 分区块标色绘图

     辅助函数:amap() 高德地图地图

                     read.geoShape() 保存geojson对象方便调用

                    leafletGeo() 地图+小显示框

2  函数使用

    #regionName():找地名函数
     regionNames("浙江省")
 [1] "丽水市" "杭州市" "温州市" "宁波市" "舟山市" "台州市" "金华市" "衢州市"
 [9] "绍兴市" "嘉兴市" "湖州市"
regionNames("杭州市")
 [1] "富阳市" "拱墅区" "滨江区" "淳安县" "建德市" "江干区" "临安市" "上城区"
 [9] "桐庐县" "西湖区" "下城区" "萧山区" "余杭区"
regionNames("宣城市")
[1] "广德县" "绩溪县" "郎溪县" "宁国市" "宣州区" "泾县"   "旌德县"
regionNames()#显示全国364个省和地级市
[112] "扬州"             "南京"             "泰州"            
[115] "无锡"             "常州"             "镇江"            
[118] "丽水"             "杭州"             "温州"            
[121] "宁波"             "舟山"             "台州"            
[124] "金华"             "衢州"             "绍兴"            
[127] "嘉兴"             "湖州"             "六安"            
[130] "安庆"             "滁州"             "宣城" 
#demomap():区域式地图
library(rgeos)
demomap("杭州")

image.png

   #geojsonmap():地图标色函数
dat<-data.frame(name<-regionNames("china"),
+ value<-rnorm(34))
geojsonMap(dat,"china")

image.png

dat#查看数据

    name....regionNames..china.. value....rnorm.34.
    1              新疆维吾尔自治区        -1.49576164
    2                    西藏自治区         0.58359538
    3                  内蒙古自治区        -0.14841568
    4                        青海省        -0.90633989
    5                        四川省        -0.17865269
    6                      黑龙江省         0.04853841
    7                        甘肃省        -0.58465146
    8                        云南省        -0.37635409
    9                广西壮族自治区        -1.59054333
    10                       湖南省         0.96030177
    #amap:高德地图底图
    if(require(leaflet)){
      leaflet() %>% amap()}

3  以绘制杭州市地图为例

  

    #单点标注杭州西湖:地图+标点

    leaflet()%>%
    amap()%>%  
    addMarkers(lng=120.15,lat=30.25,popup="西湖")

image.png

#生成图标列表

iconList<-awesomeIconList(
  "浙江大学"<-makeAwesomeIcon(icon="school",markerColor="purple"),
  "武林门码头"<-makeAwesomeIcon(icon="wharf",markerColor="blue"),
  "南宋御街"<-makeAwesomeIcon(icon="cutlery",markerColor="orange"),
  "雷峰塔"<-makeAwesomeIcon(icon="tower",markerColor="green"),
  "钱江新城"<-makeAwesomeIcon(icon="book",markerColor="white")
)

#每个图标的坐标和经纬度

geo<-data.frame(lon<-c(120.12,120.163,120.17,120.15,120.21),
                 lat<-c(30.26,30.276,30.24,30.232,30.24),
                 city<-rep("Hangzhou",5))

#坐标进行微调

geo$lon<-geo$lon+rnorm(5,0,0.003)
geo$lat<-geo$lat+rnorm(5,0,0.003)

#图标的属性

geo$type<-c("浙江大学","武林门码头","南宋御街","雷峰塔","钱江新城")

#在高德地图上进行绘制

leaflet(geo)%>%amap()%>%
  addMiniMap()%>% 
  addAwesomeMarkers(icon=~iconList[type])
 标注绘制效果如图(经纬度存在误差)

image.png

#分区域显示色彩地图

if(require(leaflet)){
  region=regionNames("杭州")
  dat=data.frame(region,rnorm(length(region)))
  map=leafletGeo("杭州",dat)

  #涂色环节

  pal<-colorNumeric(
    palette="Reds",
    domain=map$value)

  #载入高德地图amap

  leaflet(map)%>%amap()%>%

  #加入框边界及颜色

    addPolygons(stroke=TRUE,
                smoothFactor=1,
                fillOpacity=0.7,
                weight=1,
                color=~pal(value),
                popup=~htmltools::htmlEscape(popup)
    )%>%

    #加入右下角边框

    addLegend("bottomright",pal=pal,values=~value,
              title="legendTitle",
              labFormat=leaflet::labelFormat(prefix=""),
              opacity=1)
 }

image.png

4   小结

    R有着极其出色的地图可视化功能,除了leafletCN包,还有功能更为强大的leaflet包、第三方Remap包等等。本文仅以绘制杭州市地图为例,简要地介绍了leafletCN包的主要绘图函数,当然了,更深入的R绘图功能需要我们更加持续、深入的研究和探讨。与诸位共勉!


推荐 0
本文由 鲁伟 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册