R-删除形状文件中的区域并聚合到更高的NUTS级别

问题描述

我正在尝试创建EU shapefile。我想删除所有的海外领土,然后绘制国家边界。我使用“ NUTS_RG_01M_2021_3035_LEVL_1.shp”从Eurostat(http://gisco-services.ec.europa.eu/distribution/v2/countries/download/ref-countries-2020-01m.shp.zip)下载了NUTS1级Shapefile文件,并删除了海外领土(西班牙,法国,葡萄牙等)。现在,我基本上想聚合回NUTS0级别,仅绘制外部国家边界。这可能吗?我尝试了st_union,但这正在聚集到欧盟外部边界,删除了所有边界。

到目前为止,我的代码如下:

#read shapefile
EU.sf <- st_read("/ref-nuts-2021-01m.shp/NUTS_RG_01M_2021_3035_LEVL_1.shp/NUTS_RG_01M_2021_3035_LEVL_1.shp")

#plot without oversea territories 
EUmap <- tm_shape(st_union(subset(EU.sf,NUTS_ID != "FRY" &
                    NUTS_ID != "PT2" &
                    NUTS_ID != "PT3" &
                    NUTS_ID != "ES7" &
                    CNTR_CODE != "TR"
                  ))) +
  tm_borders()

谢谢!

解决方法

我不清楚您的预期结果如何,但是看起来NUTS1文件中的CNTR_CODE变量包含的国家代码等于NUTS0边界。在这种情况下,您可以使用dplyr::count()组合NUTS1文件中所有具有相同CNTR_CODE的多边形。

在此示例中,请注意,我从此处下载了边界的geojson:https://gisco-services.ec.europa.eu/distribution/v1/nuts-2021.html

library(sf)
library(tidyverse)

tmp <- tempfile()
download.file("https://gisco-services.ec.europa.eu/distribution/v2/nuts/geojson/NUTS_RG_01M_2021_3035_LEVL_1.geojson",tmp)
nuts1 <- read_sf(tmp)

nuts_agg <- nuts1 %>% 
  filter(!NUTS_ID %in% c("FRY","PT2","PT3","ES7") & CNTR_CODE != "TR") %>% 
  count(CNTR_CODE)

nuts_agg %>% 
  ggplot() +
  geom_sf()