想画出你家乡地图吗

看到各种各样漂亮的地图有没有很羡慕,那么这些地图究竟是怎么画出来的呢,这里主要介绍两个画地图的R包。

一、leafletCN

1、包的下载与安装

    下载:

        install.packages('leafletCn')

    安装:

        library(leafletCN)

2、主函数介绍

(1)、regionNames函数

该函数为找地名函数,比如:

> regionNames('十堰市')

[1] "丹江口市" "房县"    

[3] "茅箭区"   "郧西县"  

[5] "郧县"     "张湾区"  

[7] "竹山县"   "竹溪县"  

#可以查看到我们十堰市的所有县

>regionNames('湖北')

#会列出湖北所有市

regionNames的粒度是省级、县级,在细分就没有了。执行regionNames()之后,可以知道包里面存着哪些地方,是否有你要的内容。

(2)、主函数——demomap:区域式地图

install.packages("rgeos")

demomap("杭州")

就会画出杭州的交互式地图,可以拖拽,实在闲的蛋疼的话,你可以把整个世界地图拖完,相信自己。

640?wx_fmt=png

(3)、主函数一一geojsonmap:地图标色函数

#主函数--geojsonmap:地图标色函数

下面画出中国地图

>dat<-data.frame(name = regionNames("china"),value = runif(34))

geojsonMap(dat,"china")

640?wx_fmt=png

可以看出用了蓝色的渐变色交错表示出了全国的34个省市自治区,当然根据“四色定理”只需要4种颜色即可标记一张地图。

输入的数据长这样(查看前几行)

> head(dat)

              name     value

1 新疆维吾尔自治区 0.9109566

2       西藏自治区 0.9469343

3     内蒙古自治区 0.3989314

4           青海省 0.3264521

5           四川省 0.3350581

6         黑龙江省 0.5405709

3、辅助函数

(1)、辅助函数一一amap:高德地图底图

leaflet() %>%   amap()

当然了,这么执行只有一个白板地图,并不是实体的。

(2)、辅助函数——read.geoShape:genjson格式转化

if(require(sp)){

 filePath = system.file("geojson/china.json",package = "leafletCN")

 map = read.geoShape(filePath)

 plot(map)

}#如图

640?wx_fmt=png

读入了china.json格式的内容。

(3)、辅助函数一一leafletGeo:地图+小显示框

把一个数据框和一个地图组合在一起, 方便用leaflet调用, 其中名字的 变量为name, 数值的变量为value

4、leafletCN案例

(1)、多点标注:地图+标点+带icoon

#iconList 生成小框框

iconList = awesomeIconList(

  "home" = makeAwesomeIcon(icon = "home",markerColor = "skyblue"),

  "weixin" = makeAwesomeIcon(icon = "cutlery",markerColor = "red"),

  "bank" = makeAwesomeIcon(icon = "plus-sign",markerColor = "orange"),

  "automobile" = makeAwesomeIcon(icon = "trash",markerColor = "purple"),

  "coffee" = makeAwesomeIcon(icon = "book")

)

#每个小框框的坐标,经纬度

geo = data.frame(lon = rep(121.44, 5),

                 lat = rep(31.22, 5),

                 city = rep("Shanghai", 5))

#坐标进行微调,使得有差异

geo$lon = geo$lon+rnorm(5,0,0.003)

geo$lat = geo$lat+rnorm(5,0,0.003)

#小框框的属性

geo$type = c("home",

             "weixin",

             "bank" ,

             "automobile", 

             "coffee" )

#在高德地图上进行绘制

leaflet(geo) %>% amap() %>%

  addMiniMap() %>% 

  addAwesomeMarkers(icon = ~iconList[type])

这里awesomeIconList是小框框定义的一个函数;

geo 是坐标点的经纬度,geo$type是坐标点的属性;

leaflet(geo) ,放入数据; amap(),调出高德地图;  addMiniMap() ,看到右下角的小显示框了没?;  addAwesomeMarkers(icon = ~iconList[type])加入坐标点+坐标的icon

640?wx_fmt=png

(2)、地图+分区域显示+色彩

我把它做成了一个函数,只需要输入你所在的市名就可以画出市县情况图了

print_map<-function(s){

  if(require(leaflet)){

    region=regionNames(s)

    dat = data.frame(region,runif(length(region)))

    map = leafletGeo(s, dat)

    #涂色环节

    pal <- colorNumeric(

    palette = "Blues",

    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)

  }

}

首先把这个函数运行一下,告诉计算机这个函数的存在,然后只需输入两行代码:

>s<-'十堰'    #家乡所在市

>print_map(s)

640?wx_fmt=png

二、leaflet

1、说说底图

leaflet 的底图太多了,不过大多以全世界、美国的视角,简单列举几个:

leaflet() %>% addTiles() #openStreetMap 正常的世界地图

leaflet() %>% amap()  # 高德(leafletCN)

leaflet() %>% addProviderTiles("Thunderforest.SpinalMap")# 暗黑火焰风格

leaflet() %>% addProviderTiles("Esri.WorldImagery")# 卫星地图

leaflet() %>% addProviderTiles("OpenTopoMap")  #带海拔的地图

leaflet() %>% addProviderTiles("NASAGIBS.ViirsEarthAtNight2012")  #NASA夜景

leaflet() %>% addProviderTiles("Stamen.Toner")   #黑白底图

2、世界地图+多标记+标记显示数字

data(quakes)

# Show first 20 rows from the `quakes` dataset

leaflet(data = quakes[1:20,]) %>% addTiles() %>%

  addMarkers(~long, ~lat, popup = ~as.character(mag), label = ~as.character(mag))

quakes是packages自带的数据,数据长这样:

        lat   long depth mag stations

1    -20.42 181.62   562 4.8       41

2    -20.62 181.03   650 4.2       15

3    -26.00 184.10    42 5.4       43

4    -17.97 181.66   626 4.1       19

leaflet(data = quakes[1:20,]) ,显示quakes数据集的前20个;

addTiles() ,世界地图底纹;

addMarkers(~long, ~lat, popup = ~as.character(mag), label = ~as.character(mag))中,

~long, ~lat分别代表经度、维度;popup、label 从图中可以看到,那个数字6.1有两种显示方式,一个是标签式、一个是弹窗。

640?wx_fmt=png

3、地图+点集区域+复选框+NASA星空图

geo = data.frame(long = rep(121.44, 1000),

                 lat = rep(31.22, 1000),

                 mag=rep(5,1000))

#mag函数是用来衡量后面,点集范围大小

geo$long = geo$long+rnorm(1000,0,1)

geo$lat = geo$lat+rnorm(1000,0,1)

geo$mag = geo$mag+rnorm(1000,0,1)

outline <- geo[chull(geo$long, geo$lat),]

map <- leaflet(geo) %>%

  # 底层阶段

  # 第一层底图,高德

  amap(group = "高德") %>%                        

  # 第二层底图,黑底图NASA

  addProviderTiles(providers$NASAGIBS.ViirsEarthAtNight2012, group = "黑底") %>%   

  # 第三层底图,白底层

  addProviderTiles(providers$Stamen.TonerLite, group = "白底") %>% 

  # 点集+区域轮廓阶段

  addCircles(~long, ~lat, ~7^mag/50, stroke = F, group = "圈点",color="#97FFFF") %>%          

  # 描点画圈,stroke=T的话,边界包边,丑

  # 绘制轮廓,利用前面的凸集点

  addPolygons(data = outline, lng = ~long, lat = ~lat,

              fill = F, weight = 2, color = "#FFFFCC", group = "轮廓") %>% 

  # 复选框       

  addLayersControl( 

    baseGroups = c("高德", "黑底", "白底"),                     

    #显示层

    overlayGroups = c("圈点", "轮廓"),

    options = layersControlOptions(collapsed = FALSE)

  )

map

640?wx_fmt=png

(1)、底层阶段

amap和addProviderTiles的两个,都是底图样式(其他底图可见:leaflet-extras网站),其中的group是自定义的名称,可以自己命名;

(2)、点集+区域轮廓阶段

addCircles是描绘点的,long,lat是经度、维度,stroke是点是否包边,为true很丑;group是自定义的名称,color是圈圈的颜色,颜色RGB列表;addPolygons是描绘外围的轮廓的,数据outline是通过求凸集函数chunk求得,lng和lat分别是经度维度;

(3)、复选框阶段

addLayersControl加入控件组,baseGroups 是右上角的一个框,overlayGroups 是下面的数字框。

0?wx_fmt=png

点击【阅读原文更多精彩!

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值