如何在 Google 个地图上绘制 SpatialLinesDataFrame 特征图
How to plot SpatialLinesDataFrame feature map over Google maps
我正在尝试在 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
)都可以独立正常工作。
谢谢
是这样的吗?
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(...)
是可行的方法,但对于空间对象,它就没有用了。您确实需要将文件(通常是多个文件)上传到某处,然后 post a link.
其次,这不是一个小问题。 ggmap(...)
确实生成了一个 ggplot 对象,可以通过使用 +
添加附加功能来扩充它,而且 ggplot 确实提供了一个非常强大的 fortify(...)
函数,用于将 SpatialPolygonsDataFrames 转换为可用的东西图表。但是 fortify(...)
不适用于 SpatialLines
对象,所以我们必须明确地这样做。
所以这段代码的大部分只是创建了一个三行的SpatialLinesDataFrame,每行在属性table中都有对应的属性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.frame 的列表中,并将它们按行绑定在一起。
完成后,使用
添加行就很简单了
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
).
我正在尝试在 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
)都可以独立正常工作。
谢谢
是这样的吗?
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(...)
是可行的方法,但对于空间对象,它就没有用了。您确实需要将文件(通常是多个文件)上传到某处,然后 post a link.
其次,这不是一个小问题。 ggmap(...)
确实生成了一个 ggplot 对象,可以通过使用 +
添加附加功能来扩充它,而且 ggplot 确实提供了一个非常强大的 fortify(...)
函数,用于将 SpatialPolygonsDataFrames 转换为可用的东西图表。但是 fortify(...)
不适用于 SpatialLines
对象,所以我们必须明确地这样做。
所以这段代码的大部分只是创建了一个三行的SpatialLinesDataFrame,每行在属性table中都有对应的属性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.frame 的列表中,并将它们按行绑定在一起。
完成后,使用
添加行就很简单了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
).