2015-09-05 75 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