Как убрать озера / воду с карт в R - PullRequest
2 голосов
/ 13 марта 2019

(Я заранее извинюсь за то, что у меня нет предвзятого отношения. Не могу приступить к работе, чтобы быть отдельным вопросом позже сегодня).

Я вытащил данные уровня ZCTA из переписи США, сколотил ZCTA в группы и создал карту хороплетов. Я хотел бы удалить различные границы озера. В тех местах, где особенности озера составляют большую часть общей площади (или находятся вблизи границ моих регионов), их границы являются чем-то вроде глазницы для зрителя.

library(tigris)
library(sf)
library(dplyr)
library(tidycensus)
library(stringr)
library(ggplot2)




var <- c(EduTotal = "B16010_001")
zip_sf <- get_acs(geography = "zcta",
                  variables = var,
                  year = 2017, survey = "acs5",
                  output = "wide", geometry = TRUE,
                  keep_geo_vars=TRUE
)

zip_sf %>%
  filter(str_detect(ZCTA5CE10,'^1')) %>%
    mutate(zip2=str_sub(ZCTA5CE10,1,2)) %>%
       group_by(zip2)  %>%
         summarize(meanEd=mean(EduTotalE))  %>%
  ggplot(aes(fill = meanEd)) + 
  geom_sf(col='red')

Почтовые индексы, начинающиеся с '1'

img

1 Ответ

2 голосов
/ 18 марта 2019

Я думаю, что вы хотите сделать, это нарисовать элемент, но только очертить внешнее кольцо, или, в случае элемента с островками, все внешние кольца.

В PostGIS Simple Feature есть функция ST_ExternalRing, но это пока не реализовано в пакете sf.Вы могли бы хорошо спросить Эдзера ...

Между тем, похоже, это работает.Преобразуйте геометрии MULTIPOLYGON в LINESTRINGS, преобразуйте эти LINESTRINGS в POLYGONS, а затем объедините многоугольники.В процессе этого отверстия (озера) теряют свою идентичность как отверстия, и процесс UNION отбрасывает их.

Пример:

Выполнить example(st_multipolygon), чтобы создать mp1 объект.Это объект MULTIPOLYGON из трех квадратов, два из которых имеют отверстия в них:

> plot(mp1)

enter image description here

Чтобы бросить отверстия, выполните:

> mp1ext = 
    st_union(
      st_cast(
         st_cast(
            st_boundary(st_sfc(mp1)),
         "LINESTRING"),
      "POLYGON")
     )

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

> plot(mp1,col="green",border=NA)

, затем добавьте границы без отверстия с использованием нового объекта:

> plot(mp1ext, col=NA, lwd=3,add=TRUE)

enter image description here

Обратите внимание, что квадратные отверстия (озера) не очерчены.

Это, очевидно, схематичное решение для одного объекта и использует базовую графику вместо ggplot для построения графика, но, вероятно, здесь достаточно принципов, чтобы вы могли адаптироваться к вашим данным.Могут возникнуть другие осложнения.Напишите свою собственную st_external_ring функцию вызова на основе моего кода и настраивайте ее, пока она не будет работать лучше!

...