2015-09-10 5 views
1

Использование R и двух файлов формы: tl_2015_01_prisecroads (alabama) и tl_2015_13_prisecroads georgia), считанные как два объекта R с использованием readOGR(). Мне нужно сосредоточиться на области, которая включает как Западную Грузию, так и Восточную Алабаму. Я попробовал как rbind(), так и spRbind() безрезультатно.Файл формы, prisecroads, примыкающий к двум состояниям

ga_al <- rbind(alabama, georgia, fix.duplicated.IDs=TRUE) 
    Error in as(x, "SpatialLines") : 
    no method or default for coercing “logical” to “SpatialLines” 

ga_al <- spRbind(alabama, georgia) 
    Error in spRbind(as(obj, "SpatialLines"), as(x, "SpatialLines")) : 
    non-unique line IDs 

Вопрос 1: Как объединить два файла формы для отображения области в обоих состояниях? Вопрос 2: Как я могу увеличить масштаб на более мелкой области объединенных файлов формы?

+0

Размещать ссылки на два файла. – jlhoward

+0

базовая графика? ggplot2? какая система построения? – hrbrmstr

+0

Итак, CC, ответил ли любой из ответов на ваш вопрос? – hrbrmstr

ответ

5
library(tigris) 
library(sp) 
library(ggplot2) 
library(ggthemes) 

tigris PKG лучший интерфейс для данных TIGER. devtools::install_github("walkerke/tigris").

alabama <- primary_secondary_roads("alabama") 
georgia <- primary_secondary_roads("georgia") 

Базовые участки могут объединить оба вместе, не делая rbind Ing:

plot(alabama) 
plot(georgia, add=TRUE) 

enter image description here

ggplot2 участки также могут:

# this takes a little while if doing both primary & secondary roads 
alabama_dat <- fortify(alabama) 
georgia_dat <- fortify(georgia) 

# so does this 
gg <- ggplot() 
gg <- gg + geom_map(data=alabama_dat, map=alabama_dat, 
        aes(x=long, y=lat, map_id=id), 
        color="black", fill="white", size=0.15) 
gg <- gg + geom_map(data=georgia_dat, map=georgia_dat, 
        aes(x=long, y=lat, map_id=id), 
        color="black", fill="white", size=0.15) 
gg <- gg + coord_map() 
gg <- gg + theme_map() 
gg 

enter image description here

Вы можете использовать xlim и ylim в ggplot на «увеличение» в.

+0

Спасибо. Время от времени я вижу ответы, которые являются ответами на золотые медали, и это один из них. Если бы вы были местными, я бы купил вам пиво или три. – user1483288

3

Казалось бы, ваш вопрос конкретно об объединении шейпа, так что позвольте мне попытаться ответить на этот вопрос.

Для того, чтобы добиться успеха spRbind(...) несколько условий должны быть выполнены:

  1. Ни один из линии идентификаторов может быть повторен. Это проблема, потому что оба шейп-файла начинают свою нумерацию при ID = «0».
  2. Обе таблицы атрибутов должны иметь одинаковые имена столбцов и столбцов. Здесь не проблема.
  3. Имена строк в каждой таблице атрибутов должны соответствовать идентификаторам линий
  4. Системы координат должны быть одинаковыми. На практике это означает, что 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)) 

+0

Спасибо. Ваш ответ также является золотой медалью. Это что-то в воде ggplot2? Я очень ценю ваше время и силы и (снова), если вы были местными, я бы купил вам пиво или три. – user1483288