按面积过滤 shapefile 多边形
Filter shapefile polygons by area
我有以下英国边界数据集,其中显示了所有县:
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")
然而,有很多小岛扭曲了比例尺数据范围,如下图所示:
关于如何优雅地将数据集划分为最小大小的子集有什么想法吗?理想的做法是采用与子集参数一致的格式。例如:
GB_sub <- subset(UK, Area > 20) # specify minimum area in km^2
这是一种可能的解决方案:
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()
查看此 link 以了解有关 km2 大小实际解释的具体信息:Getting a slot's value of S4 objects?
我也比较了两者,但它们似乎没有什么不同:
out1 = sapply(GB@polygons, function(x) x@area)
out2 = rgeos::gArea(GB, byid=TRUE)
这是另一个可能的解决方案。因为你的数据是经纬度投影,直接根据经纬度计算面积会产生偏差,最好根据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 为单位)。我们可以通过阈值过滤多边形,例如您示例中的 20
。 GB_filter
是最终输出。
我有以下英国边界数据集,其中显示了所有县:
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")
然而,有很多小岛扭曲了比例尺数据范围,如下图所示:
关于如何优雅地将数据集划分为最小大小的子集有什么想法吗?理想的做法是采用与子集参数一致的格式。例如:
GB_sub <- subset(UK, Area > 20) # specify minimum area in km^2
这是一种可能的解决方案:
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()
查看此 link 以了解有关 km2 大小实际解释的具体信息:Getting a slot's value of S4 objects?
我也比较了两者,但它们似乎没有什么不同:
out1 = sapply(GB@polygons, function(x) x@area)
out2 = rgeos::gArea(GB, byid=TRUE)
这是另一个可能的解决方案。因为你的数据是经纬度投影,直接根据经纬度计算面积会产生偏差,最好根据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 为单位)。我们可以通过阈值过滤多边形,例如您示例中的 20
。 GB_filter
是最终输出。