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 位邮政编码级别吗?
您可以在对象上创建一个包含邮政编码前两个字符的新变量,并用于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)
| 归档时间: |
|
| 查看次数: |
132 次 |
| 最近记录: |