Làm cách nào để đơn giản hóa một sf
đa giác mà không giới thiệu các khoảng trống và các phần tử?
Ví dụ, với một shapefile, tôi sẽ sử dụng 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
Tôi đã thử sf::st_cast()
, từ các trang người đàn ông, nói:
Truyền hình học sang loại khác: đơn giản hóa hoặc truyền rõ ràng
và:
để tranh luận: nhân vật; loại mục tiêu, nếu thiếu, đơn giản hóa được thử; khi x thuộc loại sfg (nghĩa là một hình học đơn) thì cần phải được chỉ định.
Khi tôi bỏ to
lỡ vì điều này không hoạt động như mong đợi (tôi biết điều đó là quá tốt để trở thành sự thật!):
library("sf")
regions <- sf::read_sf("england_gor_2011.shp")
object_size(regions)
# ~13MB
regions <- sf::st_cast(regions)
object_size(regions)
# Still 13MB
Hiện tại tôi đang mở tệp rgdal::readOGR()
, đơn giản hóa nó, lưu tệp này, sau đó tải lại tệp này với sf
.
Có cách nào tốt hơn?
rgeos::gSimplify()
Đề xuất của @sk rgeos::gSimplify()
có thể thực hiện các đơn giản hóa theo cấu trúc liên kết (nghĩa là đơn giản hóa mà không tạo các phần tử) khi được chỉ định với các đối số sau:
library("rgeos")
regions_gSimplify <- gSimplify(regions, tol = 0.05, topologyPreserve = TRUE)
gSimplify
Tuy nhiên, không bảo tồn @data
khung, vì vậy chúng ta nên tạo lại nó:
regions_df <- regions@data
regions_gSimplify <- sp::SpatialPolygonsDataFrame(regions_gSimplify, regions_df)
Và điều này thực sự dẫn đến kích thước tệp nhỏ hơn (có thể điều chỉnh tol
đối số để làm cho nó nhỏ hơn) và tôi đã xác nhận điều này đã không tạo ra bất kỳ phần tử nào bằng cách kiểm tra nó trong QGIS.
object_size(regions_gSimplify)
# ~8MB
Vì vậy, mặc dù đây là một thay thế hợp lệ cho rmapshaper::ms_simplify()
tôi vẫn có cùng một vấn đề, cụ thể là nó không hoạt động với 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"
Câu trả lời của @obrl_soil cũng có thể được áp dụng gSimplify()
, chỉ cần sử dụng nó thay cho ms_simplify()
.
st_simplify
làm điều đó? (chưa sử dụng nó)
st_simplify
, cảm ơn vì đã chỉ ra nó. Tôi thích thuật toán rmapshaper::ms_simplify
mặc định hơn tất cả các thuật toán khác mà tôi đã thử từ trước đến nay, nhưng tôi sẽ chơi với tùy chọn mới (cập nhật: whoa tiến hành thận trọng, preserveTopology = TRUE
chắc chắn vẫn chưa hoạt động chính xác)
regions
) nhưng ngoài ra nó không còn bảo tồn cấu trúc liên kết. Khi nó bị phá vỡ tại một thời điểm nhất định, tôi nói rằng đó không phải là hành vi có chủ đích