2015-03-18 2 views
1

Я пытаюсь объединить два полигональных шейп-файла (пространственный полигональный кадр, проецируемый).Ошибка при объединении шейп-файлов

Я пробовал решение в Append/Combine Shape Files Однако я не могу заставить его работать.

rbind работает только на SpatialPolygons, поэтому я избавляюсь от таблицы атрибутов. Тем не менее я получаю следующее сообщение об ошибке:

rbind(t.poly1, t.poly2, fix.duplicated.IDs=TRUE) 

Fehler in function (classes, fdef, mtable) : unable to find an inherited method for function ‘proj4string’ for signature ‘"logical"’ 

Я действительно не имеют власть над форматом proj4string:

CRS arguments: +proj=somerc +lat_0=46.95240555555556 +lon_0=7.439583333333333 +k_0=1 +x_0=600000 +y_0=200000 +ellps=bessel +units=m +no_defs 

Есть ли у вас какие-либо объяснения или решения относительно того, что я мог бы сделать для того, чтобы слияние ?

+0

Вы уверены, что оба объекта (собственно) 'SpatialPolygons'? –

+1

Более сильная форма комментария @ RomanLuštrik: «Можете ли вы создать воспроизводимый пример?» – Spacedman

ответ

1

Если вы просто хотите построить два (или более) шейп-файла вместе на одном участке, вам не нужно комбинировать два шейных файла; их можно просто добавить в виде слоев на один участок.

Использование шейпа из Великобритании и Ирландии в качестве примеров, мы получаем их от DIVA-GIS и распаковать их в формы /:

download.file("http://biogeo.ucdavis.edu/data/diva/adm/GBR_adm.zip", 
      destfile = "shapes/GBR_adm.zip") 
download.file("http://biogeo.ucdavis.edu/data/diva/adm/IRL_adm.zip", 
      destfile = "shapes/IRL_adm.zip") 
unzip("shapes/GBR_adm.zip", exdir = "shapes/") 
unzip("shapes/IRL_adm.zip", exdir = "shapes/") 

Затем загрузите необходимые пакеты:

packages <- c("maptools", "rgeos", "rgdal") 
sapply(packages, install.packages, dependencies = T) 
sapply(packages, require, character.only = T) 
rm(packages) 

затем загрузите шейп в памяти:

gb <- readOGR("shapes/", "GBR_adm0") 
eire <- readOGR("shapes/", "IRL_adm0") 

затем они могут быть сюжет:

plot(gb) 
plot(eire, add = T) 

Который дает результат обоих шейпфайлы:

enter image description here

Если вы хотите объединить/объединить оба шейп в R, я хотел бы использовать функцию spRbind() в rgdal упаковке:

n <- length(slot(gb, "polygons")) 
gbEire <- spChFIDs(eire, as.character(n)) # so shapefiles have unique IDs 
gbEire <- spRbind(gbEire, gb) 
writeOGR(gbEire, dsn = "shapes/", layer = "gbEire", driver = "ESRI Shapefile") 

Который должен написать новый шейп-файл с обоими исходными шейп-файлами, объединенными в каталог shapes/.

+0

Эй, Фил, большое спасибо за ваш ответ. Я действительно хочу, чтобы объединить шейп-файлы, а не просто строить их вместе.Теперь я перешел в исходный код пакета «taRifx.geo» и попробовал функцию rbind.SpatialPolygonsDataFrame(), и это сработало с любыми проблемами, или так кажется ... – Jacqueline

+0

Рад, что вы нашли решение, которое работает на вас. Как насчет того, чтобы написать это как ответ на свой собственный вопрос, чтобы другие знали, что это вариант, если они прочитают этот пост? – Phil

+0

Эй, Фил, да, как я уже сказал, я просто использовал функцию rbind.SpatialPolygonsDataFrame(), которую я нашел в пакете, и с ней все работает отлично! Поэтому я предполагаю, что проблема заключалась в том, что был упомянут тот факт, что использовался rbind() из разных пакетов! – Jacqueline

1
rbind(t.poly1, t.poly2, fix.duplicated.IDs=TRUE) 

Fehler in function (classes, fdef, mtable) : unable to find an inherited method for function ‘proj4string’ for signature ‘"logical"’ 

Ее на самом деле пытается получить proj4string от fix.duplicated.IDs аргумента. Поскольку ваши объекты являются SpatialPolygons, используется rbind из пакета sp, а не пакет, упомянутый в связанном сообщении.

Вы пробовали:

s1=SpatialPolygons(list(Polygons(list(Polygon(cbind(c(0,1,1,0,0),c(0,0,1,1,0)))),ID=1))) 
s2=SpatialPolygons(list(Polygons(list(Polygon(cbind(c(0,1,1,0,0),c(0,0,1,1,0)))),ID=1))) 
proj4string(s1)=CRS("+init=epsg:4326") 
proj4string(s2)=CRS("+init=epsg:4326") 
rbind(s1,s2) # errors... 

Так просто использовать этот удобный ARG:

rbind(s1,s2,makeUniqueIDs=TRUE) 
+0

Спасибо Spacedman, который также отлично работает и намного более убедителен, чем исходный код! – Jacqueline