怎么利用R制作地图

R中获取地图的资源有多种方式,最为人们所熟悉的是百度地图、高德地图或者谷歌地图。谷歌地图在R中的开发热度最高,也是成熟度最高的,在国外应用的非常广,其特点是可以下载到卫星图,比较方便的和ggplot联用。缺点是下载谷歌地图需要api key,并且有次数限制,次数多了就要收费。百度地图和高德地图也需要准许key,但由于国内利用R对其下载编辑的量非常少,所以对应的包开发就没那么热,比如百度地图的包已经有几年没更新了“baidumap”,也就不能使用了。今天给大家演示几种能够利用R处理地图的包。

maps包。

maps包存储着非常简单的各个地区行政区划图分解图,如果需要更详细的数据或投影地图需要借助于其他包

> library(maps)
> map("world", fill = TRUE, col = rainbow(200),
+     ylim = c(-60, 90), mar = c(0, 0, 0, 0))
> title("world")

> map("state", fill = TRUE, col = rainbow(209),
+     mar = c(0, 0, 2, 0))
> title("USA")

> library(mapdata)
> map("china", col = "red4", ylim = c(18, 54), panel.first = grid())
> title(" China")

谷歌地图。

尽管谷歌地图不能使用,这里还是列出来供大家参考。

# library(ggmap)
# library(mapproj)
# register_google(key = "你申请的谷歌地图api key")
# map <- get_map(location = 'China', zoom = 4)
# ggmap(map)

开放街地图,OpenStreetMap。

百度地图不好使,谷歌地图不能用,OpenStreetMap是最好的选择了,关于OpenStreetMap的含义大家自行百度下。

先看下函数参数,链接在2020-12-23可以打开 https://www.rdocumentation.org/packages/OpenStreetMap/versions/0.3.4/topics/openmap

看下面运行的例子,利用autoplot和plot画osm(OpenStreetMap)图

> library(OpenStreetMap)
> library(ggplot2)
> map=openmap(c(41,100),c(21,125),zoom=5,type = "osm")
> plot(map)

> autoplot.OpenStreetMap(map)#如果用ggplot画图上必须用autoplot.OpenStreetMap这个函数,用autoplot则会报错,试试下面错误

> #autoplot(map)

Error: Objects of type OpenStreetMap not supported by autoplot. Run rlang::last_error() to see where the error occurred.

通过下面的朝鲜半岛地图例子,理解openmap的参数

> library(OpenStreetMap)
> nm <- c("osm", "bing", "stamen-toner", 
+         "stamen-watercolor", "esri", "esri-topo", 
+         "nps", "apple-iphoto")
> par(mfrow=c(2,4))
> #Korea
> for(i in 1:length(nm)){
+   map.korea <- openmap(c(43.46886761482925,119.94873046875),
+                  c(33.22949814144951,133.9892578125),
+                  minNumTiles=3,type=nm[i])
+   plot(map.korea)
+ }

通过下面的例子,理解openmap和ggplot的融合及调用

> library(OpenStreetMap)
> library(ggplot2)
> map.latlon <- openproj(map, projection = "+proj=longlat +ellps=WGS84 +datum=WGS84 +no_defs")
> 
> LON1=map.latlon$bbox$p1[1]#取经纬度的边界
> LON2=map.latlon$bbox$p2[1]
> LAT2=map.latlon$bbox$p1[2]
> LAT1=map.latlon$bbox$p2[2]
> #人口模拟随机生成
> pop.dtf <-  data.frame(LON  = runif(10, LON1, LON2),
+                         LAT  = runif(10, LAT1, LAT2),
+                         Pop = runif(10, 1, 30))
> 
> mytheme <- theme(plot.title = element_text(face = "bold",size = rel(1.2), hjust = 0.5),
+                  panel.background = element_rect(colour = NA),
+                  plot.background = element_rect(colour = NA),
+                  axis.title = element_text(face = "bold",size = rel(1)),
+                  axis.title.y = element_text(angle=90,vjust =2),
+                  axis.title.x = element_text(vjust = -0.2))
> 
> OSMap <- autoplot.OpenStreetMap(map.latlon)  +
+   labs(title = "Population of cities (million)", subtitle = "人口(百万)",x = "Longitude", y="Latitude")+
+   geom_point(data=pop.dtf, aes(x=LON, y=LAT, size=Pop,fill=Pop),  shape=21) +
+   scale_fill_gradientn(colours = rainbow(10)) +
+   mytheme
> OSMap