как удалить все малые острова из шейп-файла переписи населения (уровень почтового индекса)?

Я скачал шейп-файл переписи на уровне почтового индекса cb_2017_us_zcta510_500k.shp (https://www.census.gov/geo/maps-data/data/cbf/cbf_zcta.html)

Я также загрузил файл сопоставления, который позволяет мне добавить соответствующую переменную STATE (https://www.census.gov/geo/maps-data/data/zcta_rel_download.html)

Я объединил два, и я получаю:

library(sf)
library(dplyr)

big_df 

Simple feature collection with 44434 features and 2 fields
geometry type:  MULTIPOLYGON
dimension:      XY
bbox:           xmin: -176.6847 ymin: -14.37374 xmax: 145.8304 ymax: 71.34122
epsg (SRID):    4269
proj4string:    +proj=longlat +datum=NAD83 +no_defs
First 10 features:
   ZCTA5CE10 STATE                       geometry
1      35442     1 MULTIPOLYGON (((-88.25262 3...
2      35442     1 MULTIPOLYGON (((-88.25262 3...
3      35442     1 MULTIPOLYGON (((-88.25262 3...

Теперь я попытался отфильтровать все маленькие острова и Аляску:

remove_list <-  c("02", "15", "72", "66", "78", "60", "69",
"64", "68", "70", "74", "81", "84", "86", "87", "89", "71", "76",
"95", "79")



big_df %>% filter(!STATE %in% map(remove_list, as.integer)) %>% 
  tm_shape(.) + tm_polygons('pt_count',palette = "Reds", 
                            style = "quantile", n = 10, 
                            title = "counts") 

но я все еще получаю некоторые крошечные острова.

введите здесь описание изображения

Что мне здесь не хватает? Спасибо!


person ℕʘʘḆḽḘ    schedule 16.05.2018    source источник
comment
Вы можете использовать mapedit::editMap(x = mapview::mapview(st_bbox(big_df))), чтобы нарисовать прямоугольник или многоугольник вокруг материковой части США и сделать st_crop или st_intersection с этим, я полагаю.   -  person TimSalabim    schedule 17.05.2018
comment
очень интересно... не могли бы вы опубликовать рабочее решение? был бы рад принять это. спасибо!!   -  person ℕʘʘḆḽḘ    schedule 17.05.2018
comment
Его невозможно воспроизвести, поскольку он включает в себя рисование элементов вручную ... Поэтому я думаю, что это не совсем подходит для ответа.   -  person TimSalabim    schedule 17.05.2018
comment
возможно, есть способ использовать sf и сказать: «Хорошо, теперь бросьте все, что окружено водой?»   -  person ℕʘʘḆḽḘ    schedule 17.05.2018
comment
Откуда вы знаете, что окружено водой, а что нет? А как же острова на озерах?   -  person TimSalabim    schedule 17.05.2018
comment
возможно, если есть большое количество полигонов в пределах короткого радиуса, это будет похоже на внутреннюю часть. иначе остров.   -  person ℕʘʘḆḽḘ    schedule 17.05.2018
comment
Это предполагает, что каждая функция представляет собой один ПОЛИГОН, но у вас есть функции MULTIPOLYGON afaics.   -  person TimSalabim    schedule 17.05.2018
comment
Что считается «маленьким островом», Статен-Айленд в Нью-Йорке, Нормандские острова в Калифорнии?   -  person SymbolixAU    schedule 18.05.2018


Ответы (1)


Вот способ получения геометрии (схемы страны) для материковой части США:

library(raster)
library(sf)
library(dplyr)

us = getData('GADM', country='USA', level=0) %>%
  st_as_sf() %>%
  st_cast("POLYGON") %>%
  mutate(area = st_area(.)) %>%
  arrange(desc(area)) %>%
  slice(1) # mainland US should be the largest

Затем вы можете использовать это для запуска st_intersection(big_df, us) для извлечения только частей big_df из us. Обратите внимание, что может оказаться целесообразным сначала создать st_buffer или st_convex_hull вокруг us, чтобы убедиться, что ваш big_df не обрезается где-то вдоль его границ.

person TimSalabim    schedule 18.05.2018
comment
удивительно! для полноты вы можете попытаться заставить его работать с данными примера? ссылки официальные переписи, довольно простые... это будет очень полезно!!! - person ℕʘʘḆḽḘ; 18.05.2018
comment
Чего не хватает, чтобы заставить его работать с данными примера? st_intersection(big_df, us) недостаточно? - person TimSalabim; 18.05.2018
comment
это зависит от тебя, мой друг. но опубликовать результат (окончательный сюжет) было бы здорово! Я думаю, что люди ищут такие канонические ответы. если это слишком сложно, дайте мне знать. спасибо fkr снова помог!! - person ℕʘʘḆḽḘ; 18.05.2018
comment
Я рад предоставить полное решение, если вы обновите свой вопрос, чтобы сделать его воспроизводимым в том смысле, что данные извлекаются автоматически, например, через tidycensus или через download.file к tempfile() или аналогичному. Также слияние данных не воспроизводимо. - person TimSalabim; 18.05.2018
comment
да вы правы. позвольте мне обновить это как можно скорее. Спасибо что подметил это - person ℕʘʘḆḽḘ; 18.05.2018