R语言如何筛选shapefile格式地图中的单个多边形要素
筛选shapefile单要素绘制Ponta Grossa市地图
问题场景
我正在使用shapefile文件绘制州级行政区的市政区划地图,需要在成果中仅展示名为Ponta Grossa的单个市政辖区。初步判断可以通过NM_MUNICIP == "PONTA GROSSA"的条件语句实现要素筛选,其中NM_MUNICIP是该shapefile的属性字段之一。
读取空间数据后查看字段名,输出结果如下:
> names(shp) [1] "NM_MUNICIP" "CD_GEOCMU"
可复现全量地图绘制的示例代码如下:
library(rgdal) temp <- tempfile() temp2 <- tempfile() download.file("https://geoftp.ibge.gov.br/organizacao_do_territorio/malhas_territoriais/malhas_municipais/municipio_2015/UFs/PR/pr_municipios.zip",temp) unzip(zipfile = temp, exdir = temp2) shp <- readOGR(temp2) plot(shp)
运行上述代码会绘制该州所有市政辖区的完整地图,效果如下:
实现方法
rgdal读取返回的SpatialPolygonsDataFrame对象和R常规数据框的行筛选逻辑完全一致,直接通过属性条件提取对应要素即可,不需要额外复杂操作。
在原有读取代码后追加以下筛选、绘图代码即可:
# 提取Ponta Grossa对应多边形要素 shp_ponta_grossa <- shp[shp$NM_MUNICIP == "PONTA GROSSA", ] # 绘制单市政辖区地图 plot(shp_ponta_grossa)
注意事项
- 这套IBGE公开的市政数据中,
NM_MUNICIP字段存储的市名全部为大写格式,匹配时字符串需要和字段存储格式完全一致,即写为"PONTA GROSSA",不能用大小写混合的"Ponta Grossa"否则会匹配不到要素。 - 如果需要提升匹配容错性,可以先将字段值统一转为大写再做匹配,写法为
shp[toupper(shp$NM_MUNICIP) == "PONTA GROSSA", ],可以避免因字段大小写格式差异导致的匹配失败。 - 如果使用新版
sf包读取空间数据,上述筛选逻辑完全通用,sf对象本身是数据框的扩展类型,直接用相同的方括号筛选语法即可。
内容的提问来源于stack exchange,提问作者Antonio
相关产品推荐
相关产品推荐

