Преобразовать объект пространственного многоугольника во фрейм данных, используя R

18

Моя цель - изменить существующий шейп-файл путем объединения определенных полигонов.

После импорта шейп-файла и использования команды UnionSpatialPolygons я получаю желаемый контур многоугольника.

Однако теперь это объект SpatialPolygons, а не SpatialPolygonsDataFrame, поэтому я не могу экспортировать его в шейп-файл с помощью writeOGR.

Как я могу обойти эту проблему?

Иоанн
источник
3
Если приведенный ниже ответ был полезен, вы должны выбрать его как правильный, нажав на отметку слева от текста ответа.
SlowLearner

Ответы:

20

Как следует из названия, SpatialPolygonsDataFrame - это просто объект SpatialPolygons с прикрепленными данными (таблица атрибутов). Данные должны содержать как минимум столько строк, сколько имеется объектов

library(rgdal)
ob <- SpatialPolygons(..)# Your SpatialPolygons Object
spp <-     SpatialPolygonsDataFrame(ob,data=as.data.frame("yourData"),proj4string=CRS("+proj=    aea > +ellps=GRS80 +datum=WGS84"))
writeOGR(spp,"shapes","testShape",driver="ESRI Shapefile",)

----РЕДАКТИРОВАТЬ----

Если вы хотите преобразовать свою SpatialPolygonsDataFrameспину в SpatialPolygonsобъект, вам просто нужно обратиться к структуре объекта в R

ob <- SpatialPolygons(spp@polygons,proj4string=spp@proj4string)
кроншнеп
источник
Конечно, @Curlew прав. Убедитесь, что правильно указали IDsаргумент при выполнении UnionSpatialPolygons. В противном случае у вас могут возникнуть проблемы при указании dataаргумента при обратном преобразовании в SpatialPolygonsDataFrame.
fdetsch
1
Конечно, довольно легко. Я отредактировал оригинальный ответ для этого
Curlew
1
Я только недавно начал работать с шейп-файлами и все еще пытался ознакомиться с этим. Что именно должно быть заменено для вас данными в data=as.data.frame("yourData")? После растворения внутренних полигонов unionSpatialPolygons(...), я хотел бы написать результат в виде нового шейп-
файла
Вам нужно иметь data.frame с тем же количеством строк, что и у ваших объектов в объекте SpatialPolygons. Лучше задать новый вопрос, касающийся вашей unionпроблемы ..
Керлью
1
@Curlew Спасибо, только что опубликовал новые вопросы здесь gis.stackexchange.com/q/121405/40108
lightonphiri
9

Проблемы:

1: результат UnionSpatialPolygons - это пространственный многоугольник

2: преобразование результата обратно во фрейм данных пространственного многоугольника - реальная боль

-a. вам нужен очень точный фрейм данных для присоединения к пространственному многоугольнику

-b. Данные, которые вы использовали для UnionSpatialPolygons, имеют больше строк, чем выходные данные, и не отформатированы так, как нужно.

Мое (некрасивое) решение:

### Coerce into spatial polygon data frame with id and row name of spatial polygon

# Make a data frame that meets the requirements above:

df<- data.frame(id = getSpPPolygonsIDSlots(your.spatialpolygon))
row.names(df) <- getSpPPolygonsIDSlots(your.spatialpolygon)

# Make spatial polygon data frame
spdf <- SpatialPolygonsDataFrame(your.spatialpolygon, data =df)

# Then don't forget to make sure the projection is correct
# XXXX is your SRID

proj4string(spdf) <- CRS("+init=epsg:XXXX");
spdf <- spTransform(spdf , CRS("+init=epsg:XXXX"));
К.
источник
Ошибка в if (length (Sr @ polygons)! = Nrow (data)) stop (paste ("Несоответствие длины объекта: \ n",: аргумент имеет нулевую длину). Дополнительно: Предупреждающие сообщения: 1: использовать * apply и вставлять напрямую
Мокс