2013-11-13 5 views
3

У меня очень простая операция, которую я бы хотел выполнить: объединение двух файлов формы. В частности, у меня есть файлы формы массива переписи для каждого состояния в США, которые я хотел бы объединить в один файл формы. В конечном счете, я хочу взять объединенный файл формы и выполнить оверлей на наборе координат широты и долготы, чтобы определить, к каким переписным трактам относятся мои координаты. (Combining bordering shapefiles in R). Тем не менее, все обсуждения устарели, и я надеюсь, что пакеты были улучшены тем временем.Append/Combine Shape Files

файлы, которые я использую находятся здесь: ftp://ftp2.census.gov/geo/tiger/TIGER2010/TRACT/2010/

ниже код может быть использован для воссоздания файлов я работаю с. Это требует загрузки двух файлов, всего около 11 мегабайт. Время работы должно быть всего лишь минуту.

Любая помощь очень ценится. Это кажется тривиальной операцией. Возможно, если бы у меня было больше опыта с геопространственным картографированием, я мог бы лучше использовать доступную документацию.

Вот несколько вещей, которые я пытался:

### Insert your file path here 
FPATH <- './data' 

### Set up library 
require(rgeos) 
require(maptools) 
require(RCurl) 
require(parallel) 
cl <- makeCluster(detectCores()) 

### Download files... (~11,000 KB total for this example) 
ftp <- 'ftp://ftp2.census.gov/geo/tiger/TIGER2010/TRACT/2010/' 
files <- getURLContent(ftp, dirlistonly = T) 
files <- unlist(strsplit(files, split = '\r\n', fixed = T)) 
files <- grep('2010_[[:digit:]]{2}_', files, value = T)[1:2] # Only grab two files for this example 
clusterMap(cl, download.file, url = paste0(ftp, files), destfile = paste0(FPATH, files)) 

### Unzip shape files 
files <- list.files(FPATH, full.names = T) 
clusterMap(cl, unzip, zipfile = files, exdir = FPATH) 

### Read in shape files 
files <- list.files(FPATH, pattern = "shp$", full.names = T) 
a <- readShapePoly(fn = files[1]) 
b <- readShapePoly(fn = files[2]) 

### Attempt to join two shape files 
spRbind(a, b) # Error in spRbind(as(obj, "SpatialPolygons"), as(x, "SpatialPolygons")) : non-unique polygon IDs 
gUnion(a, b) # Error in RGEOSBinTopoFunc(spgeom1, spgeom2, byid, id, "rgeos_union") : geos_geospolygon2SpatialPolygons: ng > length(IDs) 

Спасибо за ваше время.

ответ

5

У вас есть дублированные идентификаторы многоугольников. Вы можете изменить их вручную или использовать taRifx.geo:

library(devtools) 
install_git("git://github.com/gsk3/taRifx.geo.git") 
library(taRifx.geo) 
rbind(a,b, fix.duplicated.IDs=TRUE) 

код доступный для осмотра here.

+0

Ари, большое вам спасибо за ваш быстрый ответ, а также за разработку пакета; ты восхитителен! Я также ценю ссылку на исходный код. Эта функция именно то, что я ищу. Я рассмотрел возможность изменения идентификатора многоугольника вручную, но не был уверен, что все будет хорошо. – Andreas

+0

Мое удовольствие. Пожалуйста, дайте мне знать, если вы найдете какие-либо ошибки - я написал это в спешке! –

+0

Не ошибка, но функция вызывает ошибку, когда я использую ее с 'do.call (rbind, obj)'. Глядя на документацию 'do.call', я вижу, что некоторые функции, которые используют' substitute', могут быть оценены по-разному, которые «в настоящее время не определены и могут быть изменены». Каков самый чистый способ подачи списка входных данных в вашу функцию? – Andreas