SF nesnesinin çokgenlerini basitleştirme


14

sfBoş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.

toEksik 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 tolhale 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().


1
Douglas – Peucker algoritmasına erişiminiz var mı? CBS dünyasında özellikler sadeleştirme için yaygın olarak bilinir. stackoverflow.com/questions/17217413/… & r-bloggers.com/simplifying-spatial-polygons-in-r
sk

1
Değil mi st_simplifyo yapmak gerekiyordu? (henüz kullanmadı)
lbusett

2
ooh, farketmemiştim 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 = TRUEkesinlikle düzgün çalışmıyor)
obrl_soil

1
Bunu bildiğim iyi oldu. Bununla ilgili bir hata raporu açmaya ne dersiniz?
lbusett

1
@obrl_soil Soruda ( 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
Phil

Yanıtlar:


16

Henüz sf'yi desteklemeyen paketler için bir sf nesnesini sp'ye atabilirsiniz - Bunu raster / çokgen etkileşimleri için adil bir bit yapıyorum. Böylece şunları yapabilirsiniz:

simplepolys <- rmapshaper::ms_simplify(input = as(sfobj, 'Spatial')) %>%
  st_as_sf()

1
Bu teknik, - bir şekilde yeniden döküm sonra, basitleştirilmesi, uzaysal bir nesne olarak döküm sfnesne - mükemmel çalıştı ve kullanılabilir rmapshaper::ms_simplify()veya rgeos::gSimplify(). Önerin için teşekkürler!
Phil

Serin serin, sadece birbirine geçen çokgenlerin topolojisinin sadece rmapshaper'ın yaklaşımı ile gerçekten korunduğunu unutmayın. Giriş verilerinizin tümü yalıtılmış, birbirine kenetlenmeyen çokgenler ise, mevcut basitleştirme kayıtlarından herhangi birini güvenle kullanabilirsiniz.
obrl_soil

Bunu cevap olarak kabul ediyorum, çünkü daha kanonik sf::st_simplify()yazma sırasında yüksek toleranslarda sağlam değildir, ancak bu değişebilir.
Phil

8
Şu anda rmapshapersf nesneler için destek üzerinde çalışıyorum . geliştirme sürümündeki nesneler için kullanılabilir . Erken test kullanıcılarını çok isterim - eğer denemek isterseniz, ile yükleyebilirsinizms_simplifysfdevtools::install_github("ateucher/rmapshaper", ref = "sf")
andyteucher

6
rmapshaper0.3.0 sürümünden itibaren, as( , "Spatial")artık çağrı gerekmemektedir.
Luke1018
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.