Jak uprościć sf
wielokąt bez wprowadzania przerw i fragmentów?
Na przykład z plikiem shapefile użyłbym 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
Próbowałem, sf::st_cast()
który na stronach podręcznika stwierdza:
Rzuć geometrię na inny typ: uprość lub jawnie rzutuj
i:
do argumentu: znak; w przypadku braku typu docelowego próbowane jest uproszczenie; gdy x jest typu sfg (tj. pojedyncza geometria), to należy podać.
Kiedy odeszłam to
jako zaginiona, nie działało to zgodnie z oczekiwaniami (wiedziałem, że to zbyt piękne, aby mogło być prawdziwe!):
library("sf")
regions <- sf::read_sf("england_gor_2011.shp")
object_size(regions)
# ~13MB
regions <- sf::st_cast(regions)
object_size(regions)
# Still 13MB
Obecnie otwieram plik rgdal::readOGR()
, upraszczając go, zapisując, a następnie ładując ponownie sf
.
Czy jest lepszy sposób?
rgeos::gSimplify()
Sugestia @sk rgeos::gSimplify()
może robić uproszczenia uwzględniające topologię (tj. upraszcza bez tworzenia warstw), jeśli podano następujące argumenty:
library("rgeos")
regions_gSimplify <- gSimplify(regions, tol = 0.05, topologyPreserve = TRUE)
gSimplify
nie zachowuje @data
ramki, dlatego powinniśmy ją ponownie utworzyć:
regions_df <- regions@data
regions_gSimplify <- sp::SpatialPolygonsDataFrame(regions_gSimplify, regions_df)
I rzeczywiście powoduje to mniejszy rozmiar pliku (można dostosować tol
argument, aby go zmniejszyć) i potwierdziłem, że nie stworzyłem żadnych fragmentów, badając go w QGIS.
object_size(regions_gSimplify)
# ~8MB
Chociaż jest to ważna alternatywa dla rmapshaper::ms_simplify()
nadal mam ten sam problem, a mianowicie to, że nie działa z 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"
Odpowiedź @obrl_soil może być również zastosowana gSimplify()
, wystarczy użyć jej zamiast ms_simplify()
.
st_simplify
powinien tego robić? (jeszcze go nie używał)st_simplify
, dzięki za wskazanie tego. Wolę algorytm, który jestrmapshaper::ms_simplify
domyślny niż wszystkie inne, które próbowałem do tej pory, ale zagram z nową opcją (aktualizacja: whoa postępuj ostrożnie,preserveTopology = TRUE
zdecydowanie jeszcze nie działa)regions
), ale poza tym nie zachowuje już topologii. Gdy pęka w pewnym momencie, powiedziałbym, że to nie jest zamierzone zachowanieOdpowiedzi:
Możesz rzucić obiekt sf na sp, dla pakietów, które jeszcze nie obsługują sf - robię to dość dobrze dla interakcji raster / wielokąt. Więc możesz zrobić:
źródło
sf
obiekt - działała idealnie i może być używana zrmapshaper::ms_simplify()
lubrgeos::gSimplify()
. Dzieki za sugestie!sf::st_simplify()
nie jest solidny przy wysokich tolerancjach w momencie pisania, chociaż oczywiście może się to zmienić.sf
obiektów w rmapshaper .ms_simplify
jest dostępny dlasf
obiektów w wersji rozwojowej. Chciałbym wczesnych testerów - jeśli chcesz to wypróbować, możesz zainstalować zdevtools::install_github("ateucher/rmapshaper", ref = "sf")
rmapshaper
wersji 0.3.0, wywołanie doas( , "Spatial")
nie jest już wymagane.