如何在Google地图上绘制SpatialLinesDataFrame要素贴图

时间:2015-09-05 12:43:24

标签: r google-maps ggmap

我正在尝试在Google地图上绘制一个线条图层。

数据

> dput(map)
new("SpatialLinesDataFrame"
        , data = structure(list(att = c(463643, 2291491, 315237340, 10348934, 
309845150, 674351, 58057, 55962, 302861, 1405635)), .Names = "att",     row.names = c(NA, 
10L), class = "data.frame")
    , lines = list(<S4 object of class structure("Lines", package = "sp")>, 
    <S4 object of class structure("Lines", package = "sp")>, 
    <S4 object of class structure("Lines", package = "sp")>, 
    <S4 object of class structure("Lines", package = "sp")>, 
    <S4 object of class structure("Lines", package = "sp")>, 
    <S4 object of class structure("Lines", package = "sp")>, 
    <S4 object of class structure("Lines", package = "sp")>, 
    <S4 object of class structure("Lines", package = "sp")>, 
    <S4 object of class structure("Lines", package = "sp")>, 
    <S4 object of class structure("Lines", package = "sp")>)
    , bbox = structure(c(50.497608475813, 26.1186426230732, 50.6164182652142, 
26.2649832975207), .Dim = c(2L, 2L), .Dimnames = list(c("x", 
"y"), c("min", "max")))
    , proj4string = new("CRS"
    , projargs = "+proj=longlat +ellps=WGS84 +towgs84=0,0,0,-0,-0,-0,0 +no_defs"
)
)

方法

library(rgdal)
library(ggmap)

gmap <- get_map(location=rowMeans(bbox(segMap)), zoom = 11) # get Google map to use as background    

变体I

plot(map, col = map$att, lwd = 1.5)
plot(gMap) 

变体II

plot(map, col = map$att, lwd = 1.5)
ggmap(gMap)

问题

背景地图绘制在要素贴图的顶部,而不是背景,因为结果要素贴图不可见。 为了澄清,两个情节调用(plot()ggmap)都可以独立工作。 谢谢

1 个答案:

答案 0 :(得分:4)

这样的东西?

library(raster)    # for getData(...), also loads sp
library(ggmap)     # for get_map, also loads ggplot2

map <- getData("GADM",country="GBR",level=2)  # SpatialPolygonsDataFrame of UK
map <- map[map$NAME_2=="London",]             # extract London
# this builds a spatialLinesDataFrame object - random walks around London
# you have this already...
set.seed(1)    # for reproducible example
get.coords <- function() {
  do.call(cbind,lapply(rowMeans(bbox(map)),  
                               function(x)cumsum(sample(0.01*(-1:1),50,replace=TRUE))+x))
}
route <- SpatialLines(lapply(1:3,function(i)Lines(list(Line(get.coords())),ID=i)))
route <- SpatialLinesDataFrame(route, data.frame(att=c("A","B","C")))

# you would start here...
gg.df <- do.call(rbind,lapply(route$att, function(x)data.frame(att=x,coordinates(route[route$att==x,]))))

ggmap(get_map(location=rowMeans(bbox(map)),zoom=12)) + 
  geom_path(data=gg.df,  aes(x,y, color=att), size=2)+
  geom_point(data=gg.df, aes(x=x[1], y=y[1]),color="black",size=5)

首先,感谢您尝试包含您的数据。通常情况下,dput(...)是可行的方法,但对于空间对象,它只是没用。您确实需要在某处上传文件(或通常是文件)并发布链接。

其次,这不是一个小问题。确实ggmap(...)生成了一个ggplot对象,可以通过使用+添加其他功能来扩充它,并且ggplot也提供了一个非常强大的fortify(...)函数,用于将SpatialPolygonsDataFrame转换为可用的函数ggplot。但fortify(...)不适用于SpatialLines个对象,因此我们必须明确地执行此操作。

因此,此代码的大部分内容只是创建一个包含三行的SpatialLinesDataFrame,每行都在属性表中具有相应的属性att。这应该很好地模仿你的例子。由于这是一个空间对象,sprgeos等所有方法都可以操作它。

现在,ggplot需要一个data.frame,其列对应于aes(...)调用中映射的美学,所以这里,x和y表示点的位置,颜色为颜色的线条。我们使用:

创建它
gg.df <- do.call(rbind,lapply(route$att, function(x)data.frame(att=x,coordinates(route[route$att==x,]))))

att的每个值的坐标提取到data.frames列表中,并将这些值逐行绑定。

完成后,使用

添加行是一件简单的事情
ggmap(get_map(location=rowMeans(bbox(map)),zoom=12)) + 
  geom_path(data=gg.df,  aes(x,y, color=att), size=2)+
  geom_point(data=gg.df, aes(x=x[1], y=y[1]),color="black",size=5)

请注意,(a)您需要使用geom_path(...),因为geom_line(...)会对x轴进行排序,而(b)您需要告诉ggplot有一层 - 特定数据集(gg.df)。