如何在sf
不引入间隙和裂缝的情况下简化多边形?
以shapefile为例,我将使用rmapshaper::ms_simplify()
:
library("pryr")
library("rgdal")
library("rmapshaper")
download.file("https://borders.ukdataservice.ac.uk/ukborders/easy_download/prebuilt/shape/England_gor_2011.zip",
destfile = "regions.zip")
unzip("regions.zip")
regions <- readOGR(".", "england_gor_2011")
object_size(regions)
# ~13MB
regions <- ms_simplify(regions)
object_size(regions)
# < 1MB
我尝试过sf::st_cast()
手册页中指出的内容:
将几何体转换为另一种类型:简化或显式转换
和:
争论:性格 目标类型,如果缺少,则尝试简化;当x为sfg类型(即单个几何)时,则需要指定to。
当我to
遗失时,它并没有按预期工作(我知道实在太好了!):
library("sf")
regions <- sf::read_sf("england_gor_2011.shp")
object_size(regions)
# ~13MB
regions <- sf::st_cast(regions)
object_size(regions)
# Still 13MB
目前,我正在使用打开文件rgdal::readOGR()
,进行简化,保存,然后使用重新加载sf
。
有没有更好的办法?
rgeos::gSimplify()
rgeos::gSimplify()
当使用以下参数指定时,@sk的建议可以进行拓扑感知的简化(即在不创建条的情况下进行简化):
library("rgeos")
regions_gSimplify <- gSimplify(regions, tol = 0.05, topologyPreserve = TRUE)
gSimplify
@data
但是,它不会保留框架,因此我们应该重新创建它:
regions_df <- regions@data
regions_gSimplify <- sp::SpatialPolygonsDataFrame(regions_gSimplify, regions_df)
确实确实会导致文件更小(可以调整tol
参数以使其更小),并且我确认通过在QGIS中进行检查并没有产生任何碎片。
object_size(regions_gSimplify)
# ~8MB
因此,尽管这是一种有效的替代方法,但rmapshaper::ms_simplify()
我仍然遇到相同的问题,即它不适用于sf
:
regions_sf <- sf::read_sf("england_gor_2011.shp")
object_size(regions_sf)
regions_gSimplify <- gSimplify(regions_sf, topologyPreserve = TRUE, tol = 0.05)
# Error in gSimplify(regions_sf, topologyPreserve = TRUE, tol = 0.05) :
# no slot of name "proj4string" for this object of class "sf"
@obrl_soil的答案也可以应用gSimplify()
,只需用它代替ms_simplify()
。
1
您可以使用Douglas–Peucker算法吗?GIS世界中的功能简化已广为人知。stackoverflow.com/questions/17217413/...&r-bloggers.com/simplifying-spatial-polygons-in-r
—
SK
不
—
lbusett
st_simplify
应该那样做吗?(尚未使用)
哦,我没有注意到
—
obrl_soil
st_simplify
,谢谢指出。我确实更喜欢rmapshaper::ms_simplify
默认算法,而不是到目前为止我尝试过的所有其他算法,但是我会尝试使用新选项(更新:哇,谨慎行事,preserveTopology = TRUE
肯定还不能正常工作)
很高兴知道。打开对此的错误报告该怎么办?
—
lbusett
@obrl_soil在我在问题(
—
Phil
regions
)中使用的多边形上,它的公差最高可达1000,但超出此范围,它将不再保留拓扑。当它在某个特定时刻中断时,我会说这不是故意的行为