2015-09-05 73 views
3

我想要绘制在谷歌地图的线路层。如何绘制SpatialLinesDataFrame特征映射在谷歌地图

数据

> 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  

变我

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

变II

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

问题

背景地图绘制在特征图的顶部,而不是象背景,作为结果的特征图是不可见的。 为了澄清,无论是剧情要求(plot()ggmap)做工精细独立。 谢谢

+1

如果你真的想使用'ggmap',你应该认真考虑使用'ggplot2'中的函数,'ggmap'基于(根据语法),更重要的是,这两个包完美地协同工作(看看'ggplot2 :: geom_line()','geom_polygon()'和'fortify()')。如果您不想使用ggplot语法,请使用'openstreetmap'包,'rGooglemaps'等。 – maj

+0

Thanks @maj。我是否理解使用ggmap是避免使用gis路线的一种方法?如果我也想做一些空间分析,你会推荐什么解决方案? – jpinelo

+2

@jpinelo他们不是相互排斥的。您可以将多边形和地图图层添加到ggmap创建的ggplot和'sp'对象的'dput's(如您所见)不能很好地传输。这样的答案是一个好的例子http://stackoverflow.com/questions/10930737/ggmap-with-geom-map-superimposed/10940778#10940778 – hrbrmstr

回答

3

像这样的事情?

所有的
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(...)转换SpatialPolygonsDataFrames成ggplot可用的东西这是真的。但fortify(...)不适用于对象,所以我们必须明确地执行此操作。

因此,这段代码的大部分只是创建一个带有三行的SpatialLinesDataFrame,每行在属性表中都有对应的属性att。这应该很好地模仿你的例子。由于这是一个空间对象,所以在sp,rgeos等上的所有方法都可以对其进行操作。

现在,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) 

需要注意的是,(一)你需要使用geom_path(...),因为geom_line(...)将整理x轴,和(b)你需要告诉ggplot有一个特定于层的数据集(gg.df)。

+0

谢谢@jilhoward一个很好的和详细的答案。非常感谢。我无法理解'function(x)'(从最后的第五行)。你能解释一下那部分吗?使用这个我得到错误'eval中的错误(expr,envir,enclos):object'x'not found'。 – jpinelo

+1

'lapply(...)'有两个参数。第一个是矢量或列表。第二个是功能。 'lapply(...)'将第一个参数中的每个元素依次传递给第二个参数中指定的函数,然后将结果组装到一个新列表中。这里使用'function(x)...'只是为第二个参数创建一个所谓的匿名(未命名)函数。在你的情况下,相当于'route $ att'存在吗? – jlhoward

+0

谢谢@jilhoward,为您提供最好的答案。我现在知道了。感谢您提供分享空间数据链接的建议,而不是发布它。 – jpinelo