Come posso semplificare un sf
poligono senza introdurre spazi vuoti e scaglie?
Con uno shapefile, ad esempio, vorrei usare 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
Ho provato sf::st_cast()
che, dalle pagine man, afferma:
Trasforma la geometria in un altro tipo: semplifica o esegui il cast esplicitamente
e:
all'argomento: carattere; tipo di destinazione, se mancante, si tenta di semplificare; quando x è di tipo sfg (cioè una singola geometria), allora deve essere specificato.
Quando me ne sono andato via to
questo non ha funzionato come previsto (sapevo che era troppo bello per essere vero!):
library("sf")
regions <- sf::read_sf("england_gor_2011.shp")
object_size(regions)
# ~13MB
regions <- sf::st_cast(regions)
object_size(regions)
# Still 13MB
Attualmente sto aprendo il file con rgdal::readOGR()
, semplificandolo, salvandolo, quindi caricandolo di nuovo con sf
.
C'è un modo migliore?
rgeos::gSimplify()
Il suggerimento di @sk rgeos::gSimplify()
può fare semplificazioni attente alla topologia (ovvero semplificare senza creare scaglie) se specificato con i seguenti argomenti:
library("rgeos")
regions_gSimplify <- gSimplify(regions, tol = 0.05, topologyPreserve = TRUE)
gSimplify
non preserva il @data
frame, quindi dovremmo ricrearlo:
regions_df <- regions@data
regions_gSimplify <- sp::SpatialPolygonsDataFrame(regions_gSimplify, regions_df)
E questo si traduce in una dimensione del file inferiore (può modificare l' tol
argomento per ridurlo) e ho confermato che questo non ha creato alcun frammento esaminandolo in QGIS.
object_size(regions_gSimplify)
# ~8MB
Quindi, sebbene questa sia una valida alternativa, rmapshaper::ms_simplify()
ho ancora lo stesso problema, vale a dire che non funziona con 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"
La risposta di @obrl_soil può anche essere applicata gSimplify()
, basta usarla al posto di ms_simplify()
.
st_simplify
dovrebbe farlo? (non l'ho ancora usato)
st_simplify
, grazie per averlo sottolineato. Preferisco l'algoritmo rmapshaper::ms_simplify
predefinito rispetto a tutti gli altri che ho provato finora, ma avrò un gioco con la nuova opzione (aggiornamento: whoa procedere con cautela, preserveTopology = TRUE
sicuramente non funziona ancora correttamente)
regions
) ma oltre a ciò non conserva più la topologia. Dato che si rompe a un certo punto, direi che non è un comportamento previsto