Подтвердить что ты не робот

Простой способ подмножества SpatialPolygonsDataFrame (т.е. Удаление многоугольников) по атрибуту в R

Я хотел бы просто удалить несколько полигонов из объекта SpatialPolygonsDataFrame на основе соответствующих значений атрибутов в фрейме данных @data, чтобы я мог построить упрощенный/подмножественно шейный файл. Пока я не нашел способ сделать это.

Например, скажем, я хочу удалить все полигоны из этого world shapefile, который имеет площадь меньше 30000. Как я могу пойти об этом?

Или, аналогично, как я могу удалить Antartica?

require(maptools)

getinfo.shape("TM_WORLD_BORDERS_SIMPL-0.3.shp") 
# Shapefile type: Polygon, (5), # of Shapes: 246
world.map <- readShapeSpatial("TM_WORLD_BORDERS_SIMPL-0.3.shp")

class(world.map)
# [1] "SpatialPolygonsDataFrame"
# attr(,"package")
# [1] "sp"

head([email protected])
#   FIPS ISO2 ISO3 UN                NAME   AREA  POP2005 REGION SUBREGION     LON     LAT
# 0   AC   AG  ATG 28 Antigua and Barbuda     44    83039     19        29 -61.783  17.078
# 1   AG   DZ  DZA 12             Algeria 238174 32854159      2        15   2.632  28.163
# 2   AJ   AZ  AZE 31          Azerbaijan   8260  8352021    142       145  47.395  40.430
# 3   AL   AL  ALB  8             Albania   2740  3153731    150        39  20.068  41.143
# 4   AM   AM  ARM 51             Armenia   2820  3017661    142       145  44.563  40.534
# 5   AO   AO  AGO 24              Angola 124670 16095214      2        17  17.544 -12.296

Если я сделаю что-то подобное, сюжет не отразит никаких изменений.

[email protected] = [email protected][[email protected]$AREA > 30000,]
plot(world.map)

тот же результат, если я это сделаю:

[email protected] = [email protected][[email protected]$NAME != "Antarctica",]
plot(world.map)

Любая помощь приветствуется!

4b9b3361

Ответ 1

похоже, что вы переписываете данные, но не удаляете полигоны. Если вы хотите сократить набор данных, включая данные и полигоны, попробуйте, например,

world.map <- world.map[world.map$AREA > 30000,]
plot(world.map)

[[Редактировать 19 апреля 2016 года]] Это решение использовалось для работы, но @Bonnie сообщает иначе для более новой версии R (хотя, возможно, данные тоже изменились?): world.map <- world.map[[email protected]$AREA > 30000, ] Upvote @Bonnie ответьте, если это помогло.

Ответ 2

Когда я попытался сделать это в R 3.2.1, техника tim riffe выше не работала для меня, хотя ее изменение немного исправляло проблему. Я обнаружил, что мне пришлось специально ссылаться на слот данных, а затем указывать атрибут для подмножества, как показано ниже:

world.map <- world.map[[email protected]$AREA > 30000, ]
plot(world.map)

Добавление этого в качестве альтернативного ответа в случае, если другие сталкиваются с одной и той же проблемой.

Ответ 3

Я использовал вышеупомянутую технику, чтобы сделать карту только Австралии:

australia.map < - world.map[world.map$NAME == "Australia",]
plot(australia.map)

Запятая после "Австралии" важна, как оказалось.

Один из недостатков этого метода заключается в том, что он сохраняет все столбцы и строки атрибутов для всех других стран и просто заполняет их нулями. Я обнаружил, что если бы я написал файл .shp, а затем прочитал его с помощью readOGR (пакет rgdal), он автоматически удалит нулевые географические данные. Тогда я мог бы написать еще один файл формы только с данными, которые я хочу.

writeOGR(australia.map,".","australia",driver="ESRI Shapefile")
australia.map < - readOGR(".","australia")
writeOGR(australia.map,".","australia_small",driver="ESRI Shapefile")

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

Ответ 4

Просто отметим, что subset также заставляет работу избегать записи имени данных в состоянии.

world.map <- subset(world.map, AREA > 30000)
plot(world.map)

Ответ 5

В качестве второго указателя: не работает для шейп файлов с "отверстиями" в фигурах, потому что это подмножество по индексу.