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.