2015-09-05 3 views
3

Я пытаюсь построить линейный слой над картами Google.Как построить карту объектов SpatialLinesDataFrame по картам 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

Если вы действительно хотите использовать 'ggmap', вам следует серьезно подумать об использовании функций из' ggplot2', на основе которых 'ggmap' основан (в терминах синтаксиса) и, что более важно, эти два пакета прекрасно работают вместе (посмотрите на ggplot2 :: geom_line() ',' geom_polygon() 'и' fortify() '). Если вы не хотите использовать синтаксис ggplot, скорее перейдите с пакетом 'openstreetmap',' rGooglemaps' и т. Д. – maj

+0

Спасибо @maj. Правильно ли я понимаю, что использование ggmap - это способ избежать перехода на gis-маршрут? Какое решение вы бы порекомендовали, если бы я тоже хотел провести пространственный анализ? – jpinelo

+2

@jpinelo они не являются взаимоисключающими. вы можете добавить слои полигона и карты в созданный ggmap ggplot и 'dput' из 'sp' объектов (как вы можете видеть) не хорошо переносят. Этот ответ SO является примером ОК 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(...), так вот, х и у для расположения точек, и цвета для цвета линий. Мы создаем, что с помощью:

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(...) сортирует ось х, и (б) вы необходимо указать ggplot, что существует набор данных, специфичный для слоя (gg.df).

+0

Спасибо @jilhoward за хороший и подробный ответ. Это очень ценится. У меня возникли проблемы с пониманием 'function (x)' (пятая строка с конца). Не могли бы вы объяснить эту часть? Используя это, я получаю ошибку «Ошибка в eval (expr, envir, enc): объект« x »не найден». – jpinelo

+1

'lapply (...)' принимает два аргумента. Первый - это вектор или список. Вторая функция. 'lapply (...)' передает каждый элемент в последовательности в первом аргументе функции, указанной во втором аргументе, а затем собирает результат в новый список. Использование 'function (x) ...' здесь просто создает так называемую анонимную (неименованную) функцию для второго аргумента. В вашем случае существует ли эквивалент 'route $ att'? – jlhoward

+0

Спасибо @jilhoward за блестящий ответ. Теперь я понимаю. Благодарим вас за то, что вы предоставили ссылку на пространственные данные вместо публикации. – jpinelo

Смежные вопросы