按区域

时间:2017-11-02 14:46:50

标签: r gis sp sf

我有英国的以下边界数据集,显示所有县:

library(raster)
library(sp)
library(ggplot)

# Download the data
GB <- getData('GADM', country="gbr", level=2)

使用subset函数,通过数据中的属性过滤shapefile多边形非常容易。例如,如果我想排除北爱尔兰:

GB_sub <- subset(UK, NAME_1 != "Northern Ireland")

然而,有许多小岛扭曲了比例数据范围,如下图所示:

enter image description here

关于如何在最小尺寸上优雅地对数据集进行子集的任何想法?拥有与子参数一致的格式的东西是理想的。例如:

GB_sub <- subset(UK, Area > 20) # specify minimum area in km^2

2 个答案:

答案 0 :(得分:1)

这是一个潜在的解决方案:

GB_sub = GB[sapply(GB@polygons, function(x) x@area>0.04),] # select min size
map.df <- fortify(GB_sub)
ggplot(map.df, aes(x=long, y=lat, group=group)) + geom_polygon()

检查此链接,了解有关km2大小的实际解释的详细信息:Getting a slot's value of S4 objects?

我也对两者进行了比较,但似乎没有区别:

out1 = sapply(GB@polygons, function(x) x@area)
out2 = rgeos::gArea(GB, byid=TRUE)

答案 1 :(得分:1)

这是另一种可能的解决方案。由于您的数据采用纬度投影,直接根据纬度和经度计算面积会导致偏差,因此最好根据geosphere包中的函数计算面积。

install.packages("geosphere")
library(geosphere)

# Calculate the area
GB$poly_area <- areaPolygon(GB) / 10^6

# Filter GB based on area > 20 km2
GB_filter <- subset(GB, poly_area > 20)

poly_area包含所有多边形的km2区域。我们可以通过阈值过滤多边形,例如示例中的20GB_filter是最终输出。