如何从R中的地图中删除湖泊/水

时间:2019-03-13 17:39:24

标签: r mapping sf tidycensus

(对于没有代表我会提前表示歉意。今天晚些时候无法开始工作成为一个单独的问题)。

我从美国人口普查中提取了ZCTA级别的数据,将ZCTAs分为几组,并创建了一个Choropleth图。我想删除各种湖泊边界。在湖泊特征占总面积较大的位置(或在我所在区域的边界附近)的地方,它们的边界对观赏者来说有点讨厌。

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 个答案:

答案 0 :(得分:2)

我想您要做的是绘制特征,但仅勾勒出外环,或者在具有岛的特征的情况下,勾勒出所有外环。

在PostGIS简单功能中有一个ST_ExternalRing函数,但这似乎尚未在sf包中实现。您可以很好地问Edzer ...

与此同时,这似乎可行。将MULTIPOLYGON几何体转换为LINESTRINGS,将那些LINESTRINGS转换为POLYGONS,然后将多边形UNION。在此过程中,孔(湖)失去了它们的标识,而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铃声函数,并对其进行调整,直到效果更好为止!