从 shapefile 中获取更多聚合形状

uli*_*a2_ 2 mapping r shapefile tmap r-sf

如上一个问题所述,我正在绘制德国邮政编码。最精细的级别是 5 位数字,例如 10117。我想绘制在两位数字级别上定义的边界,同时还保持邮政编码的着色粒度。

这里又是我的代码的第一部分,用于对邮政编码进行着色:

# for loading our data
library(raster)
library(readr)
library(readxl)
library(sf)
library(dplyr)

# for datasets
library(maps)
library(spData)

# for plotting
library(grid)
library(tmap)
library(viridis)
Run Code Online (Sandbox Code Playgroud)

获取德国的形状文件(链接)。在德国,邮政编码称为 Postleitzahlen (PLZ)。

germany <- read_sf("data/OSM_PLZ.shp")
Run Code Online (Sandbox Code Playgroud)

将 PLZ 分为任意组以进行绘图。

germany <- germany %>% 
  mutate(plz_groups = case_when(
    substr(plz, 1, 1) == "1" ~ "Group A",
    substr(plz, 2, 2) == "2" ~ "Group B",    
    TRUE ~ "Group X" # rest
  ))
Run Code Online (Sandbox Code Playgroud)

由PLZ进行绘图填充:

tm_shape(germany) +
  tm_fill(col = "plz_groups") 
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

我想划定的界限如下:

在此输入图像描述

我在另一篇文章的答案的基础上设法绘制了德国的国家边界。但为此我使用了不同的形状文件。我还没有找到符合我正在寻找的级别的现有形状文件。

我可以使用已有的粒度 shapefile 并以某种方式聚合到 2 位邮政编码级别吗?

die*_*nan 5

您可以在对象上创建一个包含邮政编码前两个字符的新变量,并用于dplyr::group_by()将每个邮政编码合并到一个区域中。

查看仅包含邮政编码子集的 reprex,因为此操作在数据集上需要很长时间:

url <- "https://opendata.arcgis.com/api/v3/datasets/5b203df4357844c8a6715d7d411a8341_0/downloads/data?format=geojson&spatialRefId=4326&where=1%3D1"

tmp <- "DEU.geojson"
download.file(url, tmp, mode = "wb")

library(sf)
library(dplyr)
library(tmap)

germany <- st_read(tmp) |> st_make_valid()

# Create an index
germany$plz_groups <- substr(germany$plz, 1, 2)

# order levels
lvs <- unique(sort(germany$plz_groups))

germany$plz_groups <- factor(germany$plz_groups, levels = lvs)


# Group with dplyr

germany_group <- germany %>%
  # For the example, just from 01 to 8
  # You should remove this filter
  filter(plz_groups  %in% lvs[1:8]) %>%
  select(plz_groups) %>%
  group_by(plz_groups) %>%
  summarise(n = n()) %>%
  # Additionally remove holes
  nngeo::st_remove_holes()

tm_shape(germany_group) +
  tm_polygons() +
  tm_shape(germany_group) +
  tm_text(text = "plz_groups")


Run Code Online (Sandbox Code Playgroud)

在此输入图像描述