2

(我会因为没有代表而提前道歉。今天晚些时候无法开始工作,这是一个单独的问题)。

我从美国人口普查中提取了 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”开头的邮政编码

图像

4

1 回答 1

2

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

在 PostGIS Simple Features 中有一个 ST_ExternalRing 函数,但这似乎还没有在sf包中实现。你可以很好地问Edzer...

与此同时,这似乎奏效了。将 MULTIPOLYGON 几何图形转换为 LINESTRINGS,将这些 LINESTRINGS 转换为 POLYGONS,然后将多边形合并。在这个过程中,洞(湖)失去了它们作为洞的身份,UNION 过程将丢弃它们。

例子:

运行example(st_multipolygon)以创建mp1对象。这是三个正方形的 MULTIPOLYGON 对象,其中两个有孔:

> plot(mp1)

在此处输入图像描述

要删除孔,请执行以下操作:

> 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)

在此处输入图像描述

请注意方孔(湖)是如何没有勾勒出来的。

这显然是针对单个对象的大纲解决方案,并使用基本图形而不是进行ggplot绘图,但这里的原则可能足以让您适应您的数据。可能会出现其他并发症。st_external_ring根据我的代码编写您自己的环形函数并对其进行调整,直到它工作得更好!

于 2019-03-18T00:07:21.120 回答