sf
Boşluk ve şerit koymadan çokgeni nasıl basitleştirebilirim ?
Bir şekil dosyası ile, örneğin, ben kullanacağım 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
Denedim sf::st_cast()
, man sayfalarından şunu belirtiyor:
Geometriyi başka bir türe döküm: ya basitleştirin ya da açıkça kullanın
ve:
argüman: karakter; hedef tip, eksikse, basitleştirme denenir; x, sfg türündeyse (yani, tek bir geometri), o zaman belirtilmesi gerekir.
to
Eksik olarak bıraktığımda bu beklendiği gibi çalışmadı (gerçek olamayacak kadar iyi olduğunu biliyordum!):
library("sf")
regions <- sf::read_sf("england_gor_2011.shp")
object_size(regions)
# ~13MB
regions <- sf::st_cast(regions)
object_size(regions)
# Still 13MB
Şu anda dosyayı açıyorum rgdal::readOGR()
, basitleştiriyorum, kaydediyorum, sonra tekrar yüklüyorum sf
.
Daha iyi bir yol var mı?
rgeos::gSimplify()
@sk'nin önerisi rgeos::gSimplify()
, aşağıdaki bağımsız değişkenlerle belirtildiğinde topolojik olarak farkında basitleştirmeler yapabilir (yani şerit oluşturmadan basitleştirir):
library("rgeos")
regions_gSimplify <- gSimplify(regions, tol = 0.05, topologyPreserve = TRUE)
gSimplify
@data
çerçeveyi korumaz , bu yüzden yeniden oluşturmalıyız:
regions_df <- regions@data
regions_gSimplify <- sp::SpatialPolygonsDataFrame(regions_gSimplify, regions_df)
Ve bu gerçekten daha küçük bir dosya boyutuyla sonuçlanır (daha küçük tol
hale getirmek için argümanı değiştirebilir) ve bunun QGIS'de inceleyerek herhangi bir şerit oluşturmadığını doğruladım.
object_size(regions_gSimplify)
# ~8MB
Yani bu geçerli bir alternatif olmasına rağmen rmapshaper::ms_simplify()
ben hala aynı sorunu var, yani ile çalışmıyor 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 'in yanıtı da uygulanabilir gSimplify()
, sadece yerine kullanın ms_simplify()
.
st_simplify
o yapmak gerekiyordu? (henüz kullanmadı)
st_simplify
, işaret ettiğiniz için teşekkürler. Ben rmapshaper::ms_simplify
şimdiye kadar denedim tüm diğerleri üzerinde varsayılan algoritma tercih , ama yeni seçeneği ile bir oyun olacak (güncelleme: whoa dikkatle devam, preserveTopology = TRUE
kesinlikle düzgün çalışmıyor)
regions
) kullandığım çokgenlerde yaklaşık 1000'e kadar tolerans için çalışır, ancak bunun ötesinde artık topolojiyi korumaz. Belli bir noktada kırıldığı için bunun amaçlanan davranış olmadığını söyleyebilirim