Простой способ для подстановки SpatialPolygonsDataFrame (т.е. удалить полигоны) атрибутом в R
Я хотел бы просто удалить некоторые полигоны из объекта SpatialPolygonsDataFrame на основе соответствующих значений атрибутов во фрейме данных @data, чтобы я мог построить упрощенный / поднабор шейп-файла. До сих пор я не нашел способ сделать это.
Например, допустим, я хочу удалить все полигоны из этого шейп-файла мира, которые имеют площадь менее 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(world.map@data)
# 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
Если я делаю что-то подобное, сюжет не отражает никаких изменений.
world.map@data = world.map@data[world.map@data$AREA > 30000,]
plot(world.map)
тот же результат, если я сделаю это:
world.map@data = world.map@data[world.map@data$NAME != "Antarctica",]
plot(world.map)
Любая помощь приветствуется!
5 ответов
Похоже, что вы перезаписываете данные, но не удаляете многоугольники. Если вы хотите сократить набор данных, включая данные и полигоны, попробуйте, например,
world.map <- world.map[world.map$AREA > 30000,]
plot(world.map)
[[Изменить 19 апреля 2016 года]] Это решение работало, но @Bonnie сообщает об обратном для более новой версии R (хотя, возможно, данные тоже изменились?):world.map <- world.map[world.map@data$AREA > 30000, ]
Upvote @ Бонни ответ, если это помогло.
Когда я попытался сделать это в R 3.2.1, описанная выше техника Тим Риффе не сработала, хотя ее изменение немного решило проблему. Я обнаружил, что мне пришлось специально ссылаться на слот данных, прежде чем указывать атрибут для поднабора, как показано ниже:
world.map <- world.map[world.map@data$AREA > 30000, ]
plot(world.map)
Добавление этого в качестве альтернативного ответа в случае, если другие сталкиваются с той же проблемой.
Просто упомянуть, что subset
также делает работу, избегая записи имени данных в условии.
world.map <- subset(world.map, AREA > 30000)
plot(world.map)
Я использовал вышеупомянутую технику, чтобы сделать карту только Австралии:
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")
В моей системе, по крайней мере, это функция "чтения", которая удаляет нулевые данные, поэтому я должен записать файл после однократного чтения (и если я пытаюсь повторно использовать имя файла, я получаю сообщение об ошибке). Я уверен, что есть более простой способ, но в любом случае это кажется достаточно хорошим для моих целей.
Как второй указатель: это не работает для шейп-файлов с "отверстиями" в формах, потому что это подмножество по индексу.