【问题标题】:How to plot SpatialLinesDataFrame feature map over Google maps如何在 Google 地图上绘制 SpatialLinesDataFrame 特征图
【发布时间】:2015-12-01 12:07:57
【问题描述】:

我正在尝试在 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)都可以独立工作。 谢谢

【问题讨论】:

  • 如果你真的想使用ggmap,你应该认真考虑使用ggplot2中的函数,ggmap基于(就语法而言),更重要的是,两个包完美地协同工作(看看ggplot2::geom_line()geom_polygon()fortify())。如果您不想使用 ggplot 语法,请使用 openstreetmap 包、rGooglemaps 等。
  • 谢谢@maj。我是否正确理解使用 ggmap 是一种避免走 gis 路线的方法?如果我也想做一些空间分析,你会推荐什么解决方案?
  • @jpinelo 它们不是相互排斥的。您可以将多边形和地图图层添加到 ggmap 创建的 ggplot 和 dputs 的 sp 对象(如您所见)不能很好地传输。这个 SO 答案是一个很好的例子stackoverflow.com/questions/10930737/…

标签: r google-maps ggmap


【解决方案1】:

这样的?

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(...) 不适用于SpatialLines 对象,所以我们必须明确地这样做。

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

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

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 )。

【讨论】:

  • 感谢@jilhoward 提供了一个很好而详细的答案。非常感谢。我无法理解function(x)(倒数第五行)。你能解释一下那部分吗?使用这个我收到错误Error in eval(expr, envir, enclos) : object 'x' not found
  • lapply(...) 接受两个参数。第一个是向量或列表。第二个是功能。 lapply(...) 按顺序将第一个参数中的每个元素传递给第二个参数中指定的函数,然后将结果组合到一个新列表中。这里使用function(x)... 只是为第二个参数创建了一个所谓的匿名(未命名)函数。在您的情况下,是否存在 route$att 的等价物?
  • 感谢@jilhoward 的精彩回答。我现在知道了。感谢您建议重新共享空间数据的链接而不是发布它。
猜你喜欢
  • 2021-10-25
  • 2020-09-15
  • 1970-01-01
  • 2017-10-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-02
  • 1970-01-01
  • 2016-06-14
相关资源
最近更新 更多