Казалось бы, ваш вопрос конкретно об объединении шейпа, так что позвольте мне попытаться ответить на этот вопрос.
Для того, чтобы добиться успеха spRbind(...)
несколько условий должны быть выполнены:
- Ни один из линии идентификаторов может быть повторен. Это проблема, потому что оба шейп-файла начинают свою нумерацию при ID = «0».
- Обе таблицы атрибутов должны иметь одинаковые имена столбцов и столбцов. Здесь не проблема.
- Имена строк в каждой таблице атрибутов должны соответствовать идентификаторам линий
- Системы координат должны быть одинаковыми. На практике это означает, что proj4strings для обоих шейп-файлов должны быть идентичны. Вы могли бы подумать, что это не будет проблемой, но нет ... Оказывается, хотя проекции действительно одинаковы (long/lat), P4S немного отличаются.
Таким образом, мы должны исправить все это, прежде чем мы можем использовать spRbind(...)
следующим образом:
library(sp)
library(maptools) # for spRbind(...)
nAL <- length([email protected])
nGA <- length([email protected])
for (i in 1:nGA) [email protected][[i]]@ID=as.character(nAL+i-1)
rownames([email protected]) <- 1:nGA + nAL-1
proj4string(alabama) <- CRS("+proj=longlat +datum=NAD83 +no_defs")
proj4string(georgia) <- CRS("+proj=longlat +datum=NAD83 +no_defs")
[email protected]$state <- "GA"
[email protected]$state <- "AL"
both <- spRbind(georgia,alabama)
Этот код использует шейп из другого ответа. Сначала мы модифицируем идентификаторы строк для GA, чтобы начать с того, где идентификаторы для конца AL (например, нет дубликатов), тогда мы правильно настроим таблицы ролей атрибутов, затем мы установили P4S для того и другого. Наконец, мы добавляем столбец в таблицы атрибутов для двух состояний, указывающих состояние (не обязательно для spRbind(...)
, но полезно позже).
So both
содержит пространственные линии для обоих состояний и таблицу атрибутов, которая объединяет таблицы атрибутов обоих состояний.Теперь мы можем построить это несколько способов (некоторые примеры):
plot(both, col=ifelse([email protected]$state=="GA","red","green"))
Использование ggplot с файлом это большой очень медленно, но IMO дополнительная гибкость делает для этого. Итак, сначала мы используем fortify(...)
для преобразования both
в формат, подходящий для использования с ggplot, затем слейте его на поле id
с таблицей атрибутов.
library(ggplot2)
library(data.table) # data.table join is much faster than merge(...)
gg.dt <- setkey(setDT(fortify(both)), id)
gg.dt <- gg.dt[setDT(cbind(id=rownames([email protected]),[email protected]))]
Теперь мы можем сделать графики:
# plot all roads, color coded by state
ggplot(gg.dt, aes(x=long, y=lat)) +
geom_path(aes(group=group, color=state)) +
theme_bw() + coord_map()
# plot all roads, color coded by type of road
ggplot(gg.dt, aes(x=long, y=lat)) +
geom_path(aes(group=group, color=RTTYP)) +
theme_bw() + coord_map()
# plot only interstates, color by state
ggplot(gg.dt[gg.dt$RTTYP=="I",], aes(x=long, y=lat)) +
geom_path(aes(group=group, color=state)) +
theme_bw() + coord_map()
# zoom into area surrounding Atlanta
library(ggmap) # for geocode(...)
ATL <- geocode("atlanta") # centriod for Atlante, GA
ggplot(gg.dt[gg.dt$RTTYP=="I",], aes(x=long, y=lat)) +
geom_path(aes(group=group, color=state)) +
theme_bw() + coord_map()+
geom_point(data=ATL, aes(x=lon, y=lat), color="red", size=4)+
with(ATL,xlim(lon-1,lon+1))+with(ATL,ylim(lat-1,lat+1))
Размещать ссылки на два файла. – jlhoward
базовая графика? ggplot2? какая система построения? – hrbrmstr
Итак, CC, ответил ли любой из ответов на ваш вопрос? – hrbrmstr